PCRE 限制是什么?

PCRE 限制是什么?

ModSecurity 中存在PCRE limits exceeded错误。

我知道我可以通过设置以下规则来解决这个问题:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

但是,这些规则实际上在做什么? PCRE 限制递归设置为 150,000 意味着什么? 将这些设置得这么高会允许哪些安全漏洞通过? 和 是什么recursion意思limit

我知道有文档,但是文档实际上并没有告诉我发生了什么,它只是告诉我如何使用指令。

答案1

这些似乎是 PCRE 引擎的内部设置,目的是限制尝试将某些文本与模式匹配所花费的最大内存/时间量。pcreapi 手册页很难用外行人能理解的语言来解释这一点:

match_limit 字段提供了一种方法,可以防止 PCRE 在运行不会匹配但搜索树中存在大量可能性的模式时耗费大量资源。典型示例是使用嵌套无限重复。

PCRE 在内部使用名为 match() 的函数,它会重复调用该函数(有时是递归调用)。match_limit 设置的限制限制了在匹配过程中调用此函数的次数,从而限制了可以发生的回溯次数。对于未固定的模式,计数会针对主题字符串中的每个位置从零重新开始。

限制的默认值可以在构建 PCRE 时设置;默认值为 1000 万,可处理除最极端情况之外的所有情况。您可以通过为 pcre_exec() 提供一个 pcre_extra 块来覆盖默认值,其中设置了 match_limit,并在标志字段中设置了 PCRE_EXTRA_MATCH_LIMIT。如果超出限制,pcre_exec() 将返回 PCRE_ERROR_MATCHLIMIT。

match_limit_recursion 字段与 match_limit 类似,但它不是限制 match() 调用的总次数,而是限制递归的深度。递归深度小于总调用次数,因为并非所有对 match() 的调用都是递归的。此限制仅在设置为小于 match_limit 时才有用。

由于 PCRE 库内置默认值为 10000000,我猜测建议对 mod_security 使用较低的设置,以防止请求被长时间阻断。

答案2

您在 mod_security.conf 中看到的值是 RegEx DoS 规则的一部分:

SecPcreMatchLimit 10000
SecPcreMatchLimitRecursion 10000
SecRule TX:/^MSC_/ "!@Streq 0"
"id:'200004',phase:2,t:none,deny,msg:'ModSecurity internal error flagged:
%{MATCHED_VAR_NAME}'"

相关内容