PCRE制限とは何ですか?


11

ModSecurityにはPCRE limits exceededエラーがあります。

次のようなルールを設定することでこれを修正できることを知っています。

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

しかし、これらのルールは実際に何をしているのでしょうか?PCRE制限再帰が150,000に設定されているとはどういう意味ですか?これらを非常に高く設定することで、どのセキュリティホールを通過できますか?何をしてないrecursionとはlimitどういう意味ですか?

ドキュメントがあることは知っていますが、ドキュメントは実際に何が起こっているかを教えてくれません。ディレクティブをどのように扱うかを単に教えてくれます。


この投稿を編集して、「perl」タグを「pcre」に変更しています。PCREは、頭字語があなたに信じさせることにもかかわらず、Perlではありません。
アンディレスター

回答:


13

これらは、一部のテキストをパターンに一致させるために費やされるメモリ/時間の最大量を制限するために、PCREエンジン内部の設定であるように見えます。pcreapi manページには、普通の言葉でそれを説明するために少し行います。

match_limitフィールドは、一致しないが、検索ツリーで非常に多くの可能性があるパターンを実行するときに、PCREが膨大なリソースを使い果たすのを防ぐ手段を提供します。典型的な例は、ネストされた無制限の繰り返しの使用です。

内部的に、PCREはmatch()と呼ばれる関数を使用し、繰り返し(時には再帰的に)呼び出します。match_limitによって設定された制限は、一致中にこの関数が呼び出される回数に課されます。これは、発生する可能性のあるバックトラッキングの量を制限する効果があります。アンカーされていないパターンの場合、件名文字列の各位置のカウントはゼロから再開されます。

制限のデフォルト値は、PCREの構築時に設定できます。デフォルトのデフォルトは1000万で、これは最も極端な場合を除いてすべてを処理します。match_limitが設定され、flagsフィールドにPCRE_EXTRA_MATCH_LIMITが設定されているpcre_extraブロックでpcre_exec()を供給することにより、デフォルトをオーバーライドできます。制限を超えた場合、pcre_exec()はPCRE_ERROR_MATCHLIMITを返します。

match_limit_recursionフィールドはmatch_limitと似ていますが、match()が呼び出される合計回数を制限する代わりに、再帰の深さを制限します。match()のすべての呼び出しが再帰的ではないため、再帰の深さは呼び出しの総数よりも小さい数値です。この制限は、match_limitよりも小さく設定されている場合にのみ使用できます。

PCREライブラリの組み込みのデフォルトは10000000であるため、リクエストが長時間保持されるのを防ぐために、mod_securityには低い設定が推奨されると推測されます。


modsecurityのデフォルト値は1500で、1Mよりかなり低いようです。OPの値150000は、設定を減少させるのではなく、増加させることになります。
ポールムーゲル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.