どうやら、ReDos攻撃はいくつかの(そうでなければ有用な)正規表現の特性を悪用します...本質的にNFAによって定義されたグラフの可能なパスの爆発を引き起こします。
同等の「非悪」正規表現を記述することにより、このような問題を回避することは可能ですか?そうでない場合(したがって、文法はNFAによって実用的な空間/時間で処理できない)、どの構文解析アプローチがより良いでしょうか?どうして?
どうやら、ReDos攻撃はいくつかの(そうでなければ有用な)正規表現の特性を悪用します...本質的にNFAによって定義されたグラフの可能なパスの爆発を引き起こします。
同等の「非悪」正規表現を記述することにより、このような問題を回避することは可能ですか?そうでない場合(したがって、文法はNFAによって実用的な空間/時間で処理できない)、どの構文解析アプローチがより良いでしょうか?どうして?
回答:
正規表現か正規表現かによって異なります:正規表現は悪ですが、正規表現は美しさのものであり、悪をもたらすことはありません。
正規表現とは、現代の正規表現を意味します。つまり、後方参照などの追加の現代機能を備えた正規表現です。たとえば、Perl互換の正規表現です。古典的な正規表現では後方参照、先読み、後読みなどが許可されていないため、これは正式な言語/オートマトン理論の教科書の古典的な正規表現よりも強力です。
古典的な正規表現の場合、マッチャーの適切な実装があれば、正規表現が悪すぎることはありません。特に、マッチングの標準アルゴリズムは、正規表現をNFAに変換してから、入力文字列でNFAを実行することです。このアルゴリズムでは、テストする時間実行最悪の場合 -character列は正規表現が固定されています、。これは、実行時間が急速に爆発しないことを意味します。実行時間の指数関数的な増加を引き起こす文字列はありません。したがって、このアルゴリズムを使用するマッチャーを使用している場合、古典的な正規表現は悪ではありません。
これは、正規表現マッチャーの実装に依存します。正規表現ツールの実装が単純または不十分な場合、照合には指数関数的な時間がかかります。確かにその特性を持つアルゴリズムがあります。しかし、それに対する最善の答えは、おそらく正規表現を変更しないことです。サービス拒否攻撃が懸念される場合は、より良いマッチャーを選択することをお勧めします。
それに比べて、現代の正規表現の中には、やむを得ず悪なものがあります。最新の正規表現を使用している場合、マッチングには指数時間が必要になる場合があります。特に、後方参照を含む正規表現はNPハード言語を認識できます。その結果、もっともらしい仮定の下で、一致のテストに指数時間がかかる悪の正規表現のクラスが存在します。したがって、いくつかの現代の正規表現は避けられないほど邪悪です:実行時間の指数関数的な爆発を引き起こさない同等の正規表現を見つけるための実行可能な方法はありません。
(そのような同等物が存在し、理論的には見つけられるかもしれませんが、もっともらしい仮定の下で、同等の正規表現を見つけることは指数関数的な時間がかかり、実際には実行できません。 、その後、多項式時間でNP困難問題を解くことができ、P = NPであることを証明します。あなたの生涯に実際にそれを見つける方法がない場合、同等の正規表現が存在することはあまり良くありません。)
背景とソース:
Perl互換の正規表現はどの言語を認識しますか?そして、現代の正規表現の表現力は、現代の正規表現がNP困難言語を認識できることを正当化するための参照を提供します。
有限状態オートマトンで後方参照、先読み、および後読みをシミュレートする方法は?そして、すると、正規表現は、正規表現ではないでしょうか?正規表現と正規表現の違いを理解するのに役立ちます。
Russ Coxのこの記事では、正規表現マッチャーを作成する2つの異なる方法について説明し、適切なアルゴリズムを使用した場合の実行時間が入力文字列の長さに対して線形である理由を説明します(正規表現が固定されている場合とその長さは定数として扱われます)。特に、NFAベースのアルゴリズム(Thompsonアルゴリズムとしても知られています)には、最悪の場合の線形実行時間があります。また、いくつかの一般的な言語が、いくつかの正規表現で指数関数的になりうる正規表現の実装をどのように示しているかを示し、現代の正規表現のどの側面が指数関数的な実行時間を導入できるかについて説明します。
この投稿では、P!= NPと仮定します。さらに言えば、「妥当な仮定」を指すときは、指数時間仮説を指します。
この回答では、複雑性理論がサイバーセキュリティに適用可能であり、例にはこの領域で発生する可能性のある重要なニュアンス/微妙さが含まれている、この異常な横断的状況のより包括的な見解を取ります。これは、特定の予期しない入力によってシステムがクラッシュしたり、異常に長い時間がかかったりする病理学的な動作を引き起こす「インジェクション攻撃」に本質的に似ています。
ウィキペディアには15種類のサービス拒否攻撃があり、この攻撃はそのリストの「アプリケーションレベルのフラッド」に該当します。別のやや似た例は、アプリケーションログをいっぱいにする攻撃です。
インジェクション攻撃の1つの修正は、「入力のクリーンアップ」です。潜在的に悪意のあるユーザーによって提供された任意の正規表現をコンパイルする必要がある場合、アプリケーション設計者は再評価できます。この攻撃を回避するには、正規表現のネストされた式を削除するか、他の同様の制限を適用するだけで十分でしょう。それらは多くの最新のソフトウェアに固有のものですが、正規表現を評価せずに大量の機能を提供できます。コンテキストが重要であり、一部のアプリケーションはそのようなセキュリティを必要としません。
ここで適用できるフォールトトレランス/復元力を向上させる別のアプローチは、ソフトウェアスタック/階層のさまざまなレベルで指定されるタイムアウトです。「平均」正規表現評価で時間/ CPUまたは命令制限を指定し、それを超えた場合は早期に終了するという考え方です。カスタムソリューションを使用して実装できますが、この目的のために組み込みのタイムアウトやフレームワークを持つソフトウェアやプログラミング言語はあまりありません。
ここでは、このような問題を軽減するために、フォールトトレランスやショーハイレベルの設計/アーキテクチャ/ POVを改善するためのタイムアウトの使用の良い例です:システム分散型大容量でのフォールトトレランス、 /ネットフリックス。正規表現に特に関連するものは何もありませんが、それがここでのポイントです。事実上、すべて/すべてのアプリケーションレベルロジックがこのフレームワークまたは類似のものに適合することができます。
この記事では、特にバックトラックを行うと正規表現のマッチングが遅くなる可能性があることを指摘しています。正規表現には多くの異なる機能があり、どの機能が最悪の場合の動作につながるかを評価することができます。
静的分析ソリューションが提案されたこの特定のトピックに関する素晴らしい科学調査です:
部分構造論理を介した正規表現指数ランタイムの静的解析 /ラティナヤケ、ティーレケ
バックトラッキングを使用した正規表現マッチングでは、指数関数的なランタイムが発生する可能性があり、システムセキュリティに関する文献でREDoSとして知られるアルゴリズムの複雑さの攻撃につながります。このホワイトペーパーでは、最近公開された静的分析に基づいて、特定の正規表現がいくつかの入力に対して指数関数的なランタイムを持つことができるかどうかを検出します。遷移関係の力と積を形成することにより、より正確な分析を体系的に構築し、それによってREDoS問題を到達可能性にまで減らします。分析の正確性は、探索木の部分構造計算を使用して証明されます。この場合、指数関数的な爆発を引き起こす木の分岐は、非線形性の形態として特徴付けられます。