DanLevy.net

セキュリティノート: 正規表現

正規表現に脆弱性はあるか?

Hero image for セキュリティノート: 正規表現. Photo by Markus Spiske on Unsplash

Photo by Markus Spiske on Unsplash

正規表現によるサービス拒否攻撃: ReDoS

私が発見した、より意外でありながら見つけにくい脆弱性の1つが、正規表現に関連するものです。 書き方が不適切か、実装が不適切かのどちらかです。

大規模な、または特別に細工されたユーザー入力によって、メモリ/CPUが枯渇する可能性があります。

これはサービス拒否(DoS)脆弱性であり、単なるパフォーマンスの問題ではありません。悪意のある入力によってCPUが長時間占有され、正当なユーザーがサービスを受けられなくなる場合、それはセキュリティ脅威モデルに含める必要があります。

警告サイン

  1. 入れ子になった量指定子、繰り返しグループ、または重複する代替パターン
  2. タイムアウトや入力長制限のない、バックトラック型のエンジン
  3. 未検証のユーザー入力に対して正規表現が使用されている
  4. 正規表現による検証がクリティカルなリクエストパス上で実行されている

緩和策 / 解決策

  1. 正規表現は難しいものです。
    1. 例えば、OWASPの専門家が[IPアドレスの検証をどのように推奨しているか][owasp]をご覧ください: ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
    2. 4バイトのIPアドレスに対して、これは(昔ながらの)ツイートよりも長い文字列です!!!
  2. 正規表現の評価前に入力長を制限してください。
  3. プラットフォームがサポートしている場合、タイムアウト、静的解析、または非バックトラック型エンジンを導入してください。
  4. これはほぼすべての言語とプラットフォーム(.NET/Node/Python/PERL/Java)に影響します。

参考資料