web-dev-qa-db-ja.com

ユーザーに検索入力として正規表現を入力させても安全ですか?

数日前に商店街にいて、表示パネルでお店を探しました。

好奇心から、(.+)で検索してみましたが、モール内のすべてのショップのリストが表示されて少し驚きました。

evil regexes について少し読みましたが、この種の攻撃は、攻撃者が検索するエントリと検索入力(正規表現)の両方を制御できる場合にのみ発生するようです。

攻撃者が検索入力を制御することしかできないので、モール表示パネルはDOSから安全であると考えることができますか? (店がaaaaaaaaaaaaのような奇妙な名前と呼ばれる可能性を除いて)

94
Xavier59

コード実行のリスクに関して、ユーザー指定の正規表現を受け入れることと、日付文字列やマークダウンなど、ほとんどの種類の構造化ユーザー入力を解析することを比較します。正規表現は日付文字列やマークダウンよりもはるかに複雑です(ただし、信頼できないマークダウンからhtmlを安全に作成することには独自のリスクがあります)、悪用される余地が多くなりますが、基本的な原則は同じです:悪用には、解析の予期しない副作用の発見/コンパイル/マッチングプロセス。

ほとんどの正規表現ライブラリは成熟しており、多くの言語の標準ライブラリの一部です。これは、コードの実行につながる主要な問題がないことを示す非常に良い(しかし確実ではない)指標です。
つまり、攻撃対象領域が増加しますが、その比較的小さなリスクを受け入れるために測定された決定をすることは不合理ではありません。

サービス拒否攻撃は少しトリッキーです。ほとんどの正規表現ライブラリはパフォーマンスを考慮して設計されていると思いますが、意図的に遅い入力の緩和を中核的な設計目標に含めていません。 DoSの観点からユーザー提供の正規表現を受け入れることの妥当性は、ライブラリーにより依存しています。
たとえば、.NET regexライブラリ タイムアウトを受け入れる DoS攻撃を緩和するために使用できます。
RE2 入力サイズに対して線形の時間での実行を保証 これは、検索コーパスがある程度の適切なサイズ制限内にあることがわかっている場合に許容できます。

可用性が絶対に重要である状況や、攻撃対象領域を可能な限り最小限にしようとする状況では、ユーザーの正規表現を受け入れないようにするのが理にかなっていますが、それは防御可能な方法だと思います。

82
Ryan Jenkins

正規表現を受け入れる際の主な脅威は、正規表現自体を受け入れるのではなく、正規表現実行エンジンにあります。適切に実装されたエンジンでは、脅威は非常に低くなると思います。エンジンは、特権システムリソースにアクセスする必要はなく、エンジンに直接提供される入力でロジックを実行するだけで済みます。これは、誰かがインタープリターでエクスプロイトを見つけたとしても、実行できる被害は最小限であることを意味します。

全体として、正規表現はすべて、値内のパターンを探すように設計されています。チェックする値が適切なセキュリティで保護されている限り、エンジン自体が値を変更するためのアクセス権を持っている必要はありません。私はそれを一般的にかなり安全であると分類します。

とは言っても、そうすることが理にかなっている状況でのみ提供します。 Regexは複雑で、実行に時間がかかる可能性があり、間違った場所で使用すると、セキュリティコンテキスト外のアプリケーションに望ましくない影響を与える可能性がありますが、適切な使用例では非常に強力で非常に価値があります。 (私は、正規表現を使用して数十万行のコードを定期的にリファクタリングするソフトウェアアーキテクトです。)

15
AJ Henderson

他の回答が指摘しているように、攻撃ベクトルはおそらく正規表現エンジンであると考えられます。

これらのエンジンは非常に成熟していて、堅牢で、徹底的にテストされていると想定しますが、過去に発生しました。

CVE-2010-1792 Apple Safari and iOS。 Patch notes

WebKitの正規表現の処理にメモリ破損の問題が存在します。悪意を持って作成されたWebサイトにアクセスすると、アプリケーションが予期せず終了したり、任意のコードが実行される可能性があります。

しかし、もちろん、欠陥のある可能性のあるライブラリの議論は、すべてのものに当てはまります- ユーザーが提供したJPEGファイル も同様です。

他の側面は、本質的に技術的ではありませんが、(.+)あなたが言及したケース:製品は任意のデータ検索を許可するべきですか?

8
PhilLab

問題は、正規表現エンジンが「バックトラック」することです。正規表現にレプティション操作(+または*など)がある場合、正規表現エンジンはそれを可能な限り多くの入力文字列と照合しようとします。後で一致が失敗した場合は、バックトラックして、入力文字列のより小さな部分との一致を試みます。

複数の繰り返し操作はネストされたバックトラッキングにつながる可能性があり、これは特に繰り返し演算子がネストされている場合、大量の正規表現を評価する時間につながる可能性があります。

https://www.regular-expressions.info/catastrophic.html

8
Peter Green

いいえ、ReDoSでは、攻撃者が不自然な検索結果を作成する必要はありません。

ReDoSの基本的な考え方は、複数の方法で一致し、検索文字列の末尾以外のほぼすべての場所に一致するサブ式があり、そのサブ式を反復して壊滅的なバックトラックを取得することです。たとえば、ショップの説明がLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.の場合は、([^q]|[^q][^q])+のようなもの(または先読みなどのより複雑な構成)を使用できます。

それが問題であるかどうかは異なります-他の回答で説明されているように、正規表現エンジンが利用できる時間を制限するだけで済みます。

5
Tgr