什么是PCRE限制?


11

在ModSecurity中存在PCRE limits exceeded错误。

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

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

但是,这些规则实际上在做什么?将PCRE限制递归设置为150,000是什么意思?通过将其设置得如此高,我可以允许哪些安全漏洞?什么是recursionlimit是什么意思?

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


我正在编辑此帖子,以将“ perl”标签更改为“ pcre”。尽管首字母缩写词让您相信,但PCRE并不是Perl。
安迪·莱斯特

Answers:


13

这些似乎是PCRE引擎的内部设置,以限制尝试将某些文本匹配到某个模式所花费的最大内存/时间。该手册pcreapi 很少用外行的术语进行解释:

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

在内部,PCRE使用一个称为match()的函数,该函数会反复调用(有时是递归调用)。match_limit设置的限制是在比赛期间调用此函数的次数所施加的,其作用是限制可以发生的回溯量。对于未锚定的模式,对于主题字符串中的每个位置,计数从零重新开始。

生成PCRE时可以设置限制的默认值。默认的默认值是1000万,可以处理除最极端情况以外的所有情况。您可以通过为pcre_exec()提供一个pcre_extra块来覆盖默认值,该块中设置了match_limit,并且在flags字段中设置了PCRE_EXTRA_MATCH_LIMIT。如果超出限制,则pcre_exec()返回PCRE_ERROR_MATCHLIMIT。

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

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


modsecurity似乎具有默认值1500,该值大大低于1M。OP的150000值将增加设置,而不是减小设置。
保罗·穆格尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.