正規表現のユーザー入力を攻撃から保護する


9

正規表現のサービス拒否(ReDoS)を知っています。ユーザーが指数関数的に遅いパターンを送信しないことを保証しながら、ユーザーがカスタム正規表現を作成できるようにする合理的な方法はありますか?


詳細が不足しています。プラットフォーム、使用法など
whatsisname

8
ユーザーが不適切な正規表現を送信するのを回避する代わりに、おそらく一定期間後に実行をキャンセルするソリューションですか?
Samuel

回答:


8

正規表現の問題は、正規表現自体ではなく、バックトラックなどのあらゆる種類の「便利な」機能を備えた正規表現エンジンにあります。したがって、これらの機能なしで正規表現エンジンを使用することは避けられます。

コンピュータサイエンスの概念は、有限状態機械にコンパイルされた後、線形時間で常に一致させることができる正規表現です。したがって、ステートマシンベースの正規表現エンジンはReDoSには使用できません。ただし、病理学的な例では、必要なステートマシンがかなり大きくなる場合があります。ただし、使用可能なメモリを制限する方が、使用可能な計算時間を制限するよりも簡単な傾向があります。

RE2エンジンは信頼されていない正規表現に対処するために特別に開発され、線形時間の実行のために設計されました。

もう1つの方法は、簡略化された表記法から正規表現を自分で組み立てることです。たとえば、ユーザーにのようなglobパターンの使用を許可することができます*.txt。次に、たとえばネストを許可せず、貪欲な量指定子のみを使用することにより、バックトラックを防ぐ方法でそれを解析できます。多くの使用例では、単純なパターン表記で完全に十分です。


11

正規表現を分析して、それ自体が遅くなるかどうかを確認し、分析自体が遅くなることなく、停止の問題を解決することになります。つまり、正しい完全なソリューションを見つけることはできません

あなたは、もちろん、正しいとされる解決策を見つけることができます中に完全に。たとえば、安全に使用できる機能の制限付きホワイトリスト(たとえば、文字クラスyes、繰り返しno ...)を使用できます。これにより、多くの重要でない正規表現を通過させ、すべての重要な正規表現を拒否し、(間違って)大丈夫であるが複雑すぎて自動的に安全であることを証明できないものを拒否できます。


3
最初のステートメントの引用はありますか?私はそのような証拠を見ることに興味があります。正規表現はチューリング完全ではないため、停止の問題は適用されない可能性があります。
Sebastian Redl 2017年

3
@SebastianRedl厳密に言うと、正規表現はチューリング完全ではありませんが、一般的に使用されているすべての正規表現ライブラリには、もはや正規ではない拡張機能があります。ユーザーを文字通り正規表現に制限することは、実際、この状況の良い解決策になる可能性があります。
キリアンフォス2017年

2
@KilianFoth:IIRC、真の正規表現(単語のCompSciの意味で)でも、指数関数的なバックトラッキングが必要になる場合があります。しかし、それらはチューリング完全ではないので、どの正規表現に対しても、この上限を確立することは理論的に可能です。ただし、これには2つの問題が残ります。上限を自動的に決定することは重要な作業であり、結果は不当に高い結果をもたらす可能性があります(期待される時間よりもはるかに高い上限など)。
MSalters 2017年

@msaltersの真の正規表現は、決定論的な有限状態オートマトンに機械的に変換できます。つまり、バックトラックすることなく、常に式を一致させることができます。もちろん、FSAは不当に大きくなる可能性がありますが、生成されたFSAの状態数の制限は、問題の攻撃を防ぐための十分なソリューションであることを示唆しています。
ジュール

1

ラザロプロジェクトのパーサーの作成者として、特定のテキストで消費するリソースを特定の正規表現で理解する方法はないと言います。

同じリソースを費やすことなく、私は(少なくともBig-Oの意味で)意味します。

したがって、最良のアプローチ-別のスレッドでreパーサーを実行し、タイムアウト後にそれを強制終了します。


0

他の回答に加えて、解決策として、独自の正規表現ライブラリをロールすることもできます。これにより、実行中にパフォーマンスインストルメンテーションが可能になり、いくつかの基準が満たされた場合に実行を途中で中止することができます。

同様に、別のスレッドで正規表現を実行し、時間がかかりすぎる場合はスレッドを強制終了することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.