【问题标题】:ModSecurity maximum post limits (PCRE limit errors)ModSecurity 最大发布限制(PCRE 限制错误)
【发布时间】:2013-08-16 02:21:05
【问题描述】:

我在 Mod Security 方面遇到了很多问题。我正忙于为工作中的项目编写 CMS,并且在开发页面以编辑某个数据库记录时,我不断收到 403 错误。在我的头撞在桌子上几个小时后,调整了一些代码,我终于只是更改了我的表单发布到的脚本,以包含一个简单的echo "test";。即使提交到这个简单的页面也会引发 403 错误。我搞砸了我的表单,我最终发现,如果我减少了提交表单的数据量(特别是我减少了 textarea 中的文本量)。

检查日志后(是的,这不是我做的第一件事 - 叹息)我注意到我从 ModSecurity 收到了许多错误,例如:

[Mon Aug 12 16:34:45 2013] [error] [client XX.XXX.XXX.XXX] ModSecurity: Failed to access DBM file "/etc/httpd/logs//global": Permission denied [hostname "XXXXXXX.XXX"] [uri "/admin/index.php"] [unique_id "UgkAlW1shFcAAHTMK80AAAAF"]
[Mon Aug 12 16:34:45 2013] [error] [client XX.XXX.XXX.XXX] ModSecurity: Failed to access DBM file "/etc/httpd/logs//ip": Permission denied [hostname "XXXXXXX.XXX"] [uri "/admin/index.php"] [unique_id "UgkAlW1shFcAAHTMK80AAAAF"]
[Mon Aug 12 17:11:33 2013] [error] [client XX.XXX.XXX.XXX] ModSecurity: Rule execution error - PCRE limits exceeded (-8): (null). [hostname "XXXXXXX.XXX"] [uri "/admin/index.php"] [unique_id "UgkJNW1shFcAAHXUMHkAAAAH"]
[Mon Aug 12 17:11:33 2013] [error] [client XX.XXX.XXX.XXX] ModSecurity: Access denied with code 403 (phase 2). Match of "streq 0" against "TX:MSC_PCRE_LIMITS_EXCEEDED" required. [file "/etc/httpd/conf.d/mod_security.conf"] [line "93"] [msg "ModSecurity internal error flagged: TX:MSC_PCRE_LIMITS_EXCEEDED"] [hostname "XXXXXXX.XXX"] [uri "/admin/index.php"] [unique_id "UgkJNW1shFcAAHXUMHkAAAAH"]

我几天来一直在胡闹,谷歌搜索和更改规则无济于事。我似乎唯一能做的就是关闭这个虚拟主机的 ModSecurity。在我开发 CMS 时这对我来说很好,但在生产中这并不是我真正想做的事情。有没有人对导致此问题的原因以及如何对其进行排序有任何想法?日志似乎指向某种与正则表达式限制有关的规则,但是自从将我的帖子接收脚本更改为只打印出单词 test 我没有对它们做任何事情(尽管我已经尝试通过 SecPcreMatchLimit 提高限制和SecPcreMatchLimitRecursion)。我发送的数据量似乎有问题。

【问题讨论】:

  • 我遇到了同样的问题,就像现在我有 2 个 Apache 进程以 100% 的 CPU 运行......在 8 核上,它在某种程度上还不错,但这也意味着一些用户没有得到服务!

标签: php apache security post mod-security


【解决方案1】:

我刚刚解决了一个类似的问题,一个大型帖子触发了多个规则中的 PCRE 限制错误。我觉得 mod-security 仅仅因为请求爆炸就将其标记为恶意请求是错误的!

我按照本文中的建议将您提到的两个设置从默认值 1,500 提高到了 500,000,它解决了我的问题。

PCRE 匹配限制的默认值非常非常低 国防部安全。您通常可以达到 500K 而不会损坏您的设备。但 供您参考:PCRE 匹配限制旨在减少 通过正则表达式进行 DoS 攻击的机会。所以通过提高 限制你在这方面提出你的漏洞,但是 PCRE 错误 从安全角度来看,情况要糟糕得多。我在生产中运行 500K 通常:

SecPcreMatchLimit 500000 SecPcreMatchLimitRecursion 500000

https://github.com/SpiderLabs/owasp-modsecurity-crs/issues/656

另见 https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#SecPcreMatchLimit

【讨论】:

    【解决方案2】:

    几周前我遇到了与 PCRE 模块类似的问题,它与 backtrack_limits 有关。

    我假设 SecPcreMatchLimitSecPcreMatchLimitRecursion 与 mod_security 相关,但您是否尝试在 php.ini 文件中或在 PHP 执行期间增加 pcre 模块的值?

    pcre.backtrack_limitpcre.recursion_limit

    您还可以使用以下函数preg_last_error() 确认问题是否与 PCRE 限制有关

    你可以在这里看到更多:http://php.net/manual/en/function.preg-last-error.php

    这里:http://www.php.net/manual/en/pcre.constants.php

    我希望这会有所帮助。

    【讨论】:

    • 对不起,我已经有一段时间没有发布这个问题了。我在我认为的 php.ini 文件中设置了这些 PCRE 值(当然在使用ini_set() 或任何东西执行期间没有这样做)。另外..我什至无法做到preg_last_error(),因为页面甚至是403s对于一个简单的echo "test";
    • 我的问题似乎是 ModSecurity 出于某种原因将我发送的数据视为可疑,而不是实际上与 PCRE 有任何关系
    • 这个答案有一半是错误的。它绝对与 PHP 无关,因为 Apache 正在运行 ModSecurity 模块。实际上 Jonathon 明确表示,如果他关闭 ModSecurity,他的页面就可以正常工作。
    • @AlexisWilke 是对的,这与 PHP“无关”。将是编译到 mod_security/2 中的 PCRE 达到了极限。这绝对是 SecPcreMatchLimit 设置 - 这为我解决了问题。
    • 我们正在使用 .net API,到目前为止,我们已经在检测节点中启用了 WAF。我们收到了几个日志(执行错误 - 超出 PCRE 限制),因此值得关注的是,当我们将 WAF 置于预防模式时,WAF 会阻止这些我们收到“执行错误 - 超出 PCRE 限制”的请求还是会将请求传递到下一个管道。
    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多