web-dev-qa-db-ja.com

PCRE制限とは何ですか?

ModSecurityにはPCRE limits exceededエラー。

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

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

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

ドキュメンテーションがあることは知っていますが、ドキュメンテーションは実際に何が行われているのかを教えてくれるのではなく、単にディレクティブの操作方法を教えてくれます。

11
user101130

これらは、一部のテキストをパターンに一致させるために費やされるメモリ/時間の最大量を制限するために、PCREエンジン内部の設定のようです。 pcreapimanpage は、素人の言葉で説明することはほとんどありません。

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

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

PCREのビルド時に、制限のデフォルト値を設定できます。デフォルトのデフォルトは1000万で、最も極端な場合を除いてすべてを処理します。 match_limitが設定されており、かつ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には低い設定が推奨されると思います。

13
DerfK