Regex

什麼是 PCRE 限制?

  • April 29, 2021

在 ModSecurity 中有PCRE limits exceeded錯誤。

我知道我可以通過設置以下規則來解決這個問題:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

但是,這些規則實際上在做什麼?PCRE 限制遞歸設置為 150,000 是什麼意思?通過將這些設置如此之高,我允許通過哪些安全漏洞?recursion和是什麼limit意思?

我知道有文件,但文件實際上並沒有告訴我發生了什麼,它只是告訴我如何使用指令。

這些似乎是 PCRE 引擎內部的設置,以限制嘗試將某些文本與模式匹配所花費的最大記憶體量/時間。pcreapi 聯機幫助頁幾乎沒有用外行的術語來解釋它:

match_limit 欄位提供了一種防止 PCRE 在執行不會匹配但在其搜尋樹中有大量可能性的模式時耗盡大量資源的方法。經典的例子是使用嵌套的無限重複。

在內部,PCRE 使用一個名為 match() 的函式,它會重複呼叫(有時是遞歸的)。match_limit 設置的限制是對比賽期間呼叫此函式的次數施加的,這具有限制可以發生的回溯量的效果。對於未錨定的模式,對於主題字元串中的每個位置,計數從零開始。

建構PCRE時可以設置limit的預設值;預設預設值為 1000 萬,可處理除最極端情況外的所有情況。您可以通過為 pcre_exec() 提供一個設置了 match_limit 的 pcre_extra 塊來覆蓋預設值,並且在 flags 欄位中設置了 PCRE_EXTRA_MATCH_LIMIT。如果超出限制,pcre_exec() 返回 PCRE_ERROR_MATCHLIMIT。

match_limit_recursion 欄位與 match_limit 類似,但不是限制呼叫 match() 的總次數,而是限制遞歸的深度。遞歸深度小於呼叫總數,因為並非所有對 match() 的呼叫都是遞歸的。此限制僅在設置為小於 match_limit 時才有用。

由於 PCRE 庫內置預設值為 10000000,我猜測 mod_security 建議設置較低,以防止請求被長時間擱置。

引用自:https://serverfault.com/questions/408265