すべての「悪」正規表現に対して、悪ではない代替が存在しますか、または文法に悪魔がありますか?


16

どうやら、ReDos攻撃はいくつかの(そうでなければ有用な)正規表現の特性を悪用します...本質的にNFAによって定義されたグラフの可能なパスの爆発を引き起こします。

同等の「非悪」正規表現を記述することにより、このような問題を回避することは可能ですか?そうでない場合(したがって、文法はNFAによって実用的な空間/時間で処理できない)、どの構文解析アプローチがより良いでしょうか?どうして?


正確な専門用語を使用できた場合、それは偶然です。アカデミックでない場合の回答をバカにしてください:
デビッドブロック

1
私は実際にReDosされることを回避する実用的な方法を見つけようとしていますが、この質問が出てきました。
デビッドブロック

質問を言い換えます(?):すべての正規言語には、最小NFAの状態数の多項式で長さが制限された正規表現がありますか?
A.シュルツ

1
@ A.Schulz。私はそれが問題だとは思わない。それは、ReDos攻撃の仕組みではありません。ReDos攻撃では、正規表現はプログラムのソースコードにハードコーディングされ、開発者によって提供されます。開発者は信頼されていると推定されます。次に、攻撃者は入力文字列を提供し、プログラムは正規表現と照合します。敵がマッチャーを長時間実行する入力文字列を見つけることができる場合、敵が勝ちます。そのため、敵対的な正規表現ではなく、敵対的な入力を懸念しています。(続き)
DW

したがって、私は代わりに質問だと思います:すべての正規言語には正規表現があり、文字の文字列をその正規表現と一致させるには時間がかかりますか?はそうではありません-急速に成長する関数(たとえば、多項式、またはそのようなもの)?[ちなみに、この再定式化は、答えがマッチングに使用されるアルゴリズムに依存することを明らかにしています...私の答えで述べたように。]最小NFAのサイズの関数としての正規表現のサイズはここで本当に重要です。nO(f(n))f(n)n
DW

回答:


14

正規表現か正規表現かによって異なります:正規表現は悪ですが、正規表現は美しさのものであり、悪をもたらすことはありません。

正規表現とは、現代の正規表現を意味します。つまり、後方参照などの追加の現代機能を備えた正規表現です。たとえば、Perl互換の正規表現です。古典的な正規表現では後方参照、先読み、後読みなどが許可されていないため、これは正式な言語/オートマトン理論の教科書の古典的な正規表現よりも強力です。

古典的な正規表現の場合、マッチャーの適切な実装があれば、正規表現が悪すぎることはありません。特に、マッチングの標準アルゴリズムは、正規表現をNFAに変換してから、入力文字列でNFAを実行することです。このアルゴリズムでは、テストする時間実行最悪の場合 -character列は正規表現が固定されています、。これは、実行時間が急速に爆発しないことを意味します。実行時間の指数関数的な増加を引き起こす文字列はありません。したがって、このアルゴリズムを使用するマッチャーを使用している場合、古典的な正規表現は悪ではありません。nO(n)

これは、正規表現マッチャーの実装に依存します。正規表現ツールの実装が単純または不十分な場合、照合には指数関数的な時間がかかります。確かにその特性を持つアルゴリズムがあります。しかし、それに対する最善の答えは、おそらく正規表現を変更しないことです。サービス拒否攻撃が懸念される場合は、より良いマッチャーを選択することをお勧めします。

それに比べて、現代の正規表現の中には、やむを得ず悪なものがあります。最新の正規表現を使用している場合、マッチングには指数時間が必要になる場合があります。特に、後方参照を含む正規表現はNPハード言語を認識できます。その結果、もっともらしい仮定の下で、一致のテストに指数時間がかかる悪の正規表現のクラスが存在します。したがって、いくつかの現代の正規表現は避けられないほど邪悪です:実行時間の指数関数的な爆発を引き起こさない同等の正規表現を見つけるための実行可能な方法はありません。

(そのような同等物が存在し、理論的には見つけられるかもしれませんが、もっともらしい仮定の下で、同等の正規表現を見つけることは指数関数的な時間がかかり、実際には実行できません。 、その後、多項式時間でNP困難問題を解くことができ、P = NPであることを証明します。あなたの生涯に実際にそれを見つける方法がない場合、同等の正規表現が存在することはあまり良くありません。)


背景とソース:


正規表現を複数の小さな正規表現に分割し、それらを組み合わせて使用​​することで、悪ではない代替を見つけるのは簡単ではありませんか?
inf3rno

1

この回答では、複雑性理論がサイバーセキュリティに適用可能であり、例にはこの領域で発生する可能性のある重要なニュアンス/微妙さが含まれている、この異常な横断的状況のより包括的な見解を取ります。これは、特定の予期しない入力によってシステムがクラッシュしたり、異常に長い時間がかかったりする病理学的な動作を引き起こす「インジェクション攻撃」に本質的に似ています。

ウィキペディアには15種類のサービス拒否攻撃があり、この攻撃はそのリストの「アプリケーションレベルのフラッド」に該当します。別のやや似た例は、アプリケーションログをいっぱいにする攻撃です。

インジェクション攻撃の1つの修正は、「入力のクリーンアップ」です。潜在的に悪意のあるユーザーによって提供された任意の正規表現をコンパイルする必要がある場合、アプリケーション設計者は再評価できます。この攻撃を回避するには、正規表現のネストされた式を削除するか、他の同様の制限を適用するだけで十分でしょう。それらは多くの最新のソフトウェアに固有のものですが、正規表現を評価せずに大量の機能を提供できます。コンテキストが重要であり、一部のアプリケーションはそのようなセキュリティを必要としません。

ここで適用できるフォールトトレランス/復元力を向上させる別のアプローチは、ソフトウェアスタック/階層のさまざまなレベルで指定されるタイムアウトです。「平均」正規表現評価で時間/ CPUまたは命令制限を指定し、それを超えた場合は早期に終了するという考え方です。カスタムソリューションを使用して実装できますが、この目的のために組み込みのタイムアウトやフレームワークを持つソフトウェアやプログラミング言語はあまりありません。

ここでは、このような問題を軽減するために、フォールトトレランスやショーハイレベルの設計/アーキテクチャ/ POVを改善するためのタイムアウトの使用の良い例です:システム分散型大容量でのフォールトトレランス、 /ネットフリックス。正規表現に特に関連するものは何もありませんが、それがここでのポイントです。事実上、すべて/すべてのアプリケーションレベルロジックがこのフレームワークまたは類似のものに適合することができます。

この記事では、特にバックトラックを行うと正規表現のマッチングが遅くなる可能性があることを指摘しています。正規表現には多くの異なる機能があり、どの機能が最悪の場合の動作につながるかを評価することができます。

静的分析ソリューションが提案されたこの特定のトピックに関する素晴らしい科学調査です:

  • 部分構造論理を介した正規表現指数ランタイムの静的解析 /ラティナヤケ、ティーレケ

    バックトラッキングを使用した正規表現マッチングでは、指数関数的なランタイムが発生する可能性があり、システムセキュリティに関する文献でREDoSとして知られるアルゴリズムの複雑さの攻撃につながります。このホワイトペーパーでは、最近公開された静的分析に基づいて、特定の正規表現がいくつかの入力に対して指数関数的なランタイムを持つことができるかどうかを検出します。遷移関係の力と積を形成することにより、より正確な分析を体系的に構築し、それによってREDoS問題を到達可能性にまで減らします。分析の正確性は、探索木の部分構造計算を使用して証明されます。この場合、指数関数的な爆発を引き起こす木の分岐は、非線形性の形態として特徴付けられます。


この答えは、ReDoのいくつかの側面について混乱しているようです。1. ReDoSは、インジェクション攻撃とは関係ありません。インジェクション攻撃(XSS、SQLインジェクション、コマンドインジェクションなど)はまったく異なります。2. ReDosは、攻撃者によって提出された悪意のある正規表現に関するものではありません。通常、正規表現はプログラムにハードコーディングされ(開発者が提供)、入力文字列はユーザ​​ーが提供します。通常、問題を解消するのに十分な明確な入力検証ポリシーがないため、入力検証によって問題を合理的に解決することはできません。
DW

あなたのポイントは、ReDos refに基づいた技術/ヘアスプリッティングに相当すると考えてください。その類似した「細工インジェクション攻撃」へ。答えは、コードで正規表現を使用する代わりがあることを指摘しています。静的分析は「悪の正規表現」を見つけることができます。答えのポイントはすべて有効です。「通常、正規表現はプログラムにハードコーディングされ(開発者が提供)、入力文字列はユーザ​​ーが提供する」などの文は、ReDosの記述と完全には一致せず、場所がより曖昧で、悪意のある攻撃者などを指します。
vzn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.