再現の手順
バージョン 1.7.0 以上の AngularJS パッケージには、この正規表現によるサービス拒否 (ReDoS) の脆弱性があります。アプリが$locale.NUMBER_FORMATS.PATTERNS[1].posPreにユーザー提供の値を代入する場合、攻撃者は' '.repeat(1000000)のようなサービス拒否を引き起こすために、極端に多い数の空白からなる値を提供する可能性があります。このエクスプロイトを実証する概念実証は、StackBlitzで入手可能です。
問題への対処
この問題はAngularJSの1.7.0以上のすべてのバージョンに存在し、修正されたライブラリのバージョンはありません。しかし、開発者は$locale.NUMBER_FORMATS.PATTERNS[1].posPreにユーザが提供した値が代入されていないか、代入されている場合は値の長さが数文字に制限されているかを確認することができます。
学習と予防
サービス拒否攻撃は、ターゲット・システムのリソースを使用し、システムの正当なユーザのためにリソースを残さないように設計されています。このエクスプロイトは正規表現サービス拒否(ReDoS)タイプで、ターゲット・システムに、長い時間を要する正規表現パターン・マッチを解決させようとします。
正規表現エンジンは、マッチを見つけようとする一連のステップを実行する。これらのステップのいくつかはすぐに達成できますが、他のステップ、特に失敗したステップには多くの時間がかかります。1000000個の空白のような非常に多くの空白からなる文字列値が与えられると、ブラウザは結果を返すのに非常に長い時間を費やすかもしれません。
これは、いくつかのマッチングステップが失敗し、正規表現エンジンがバックアップして代替を実行しなければならない場合に特に当てはまる。このような場合、1,000,000の空白の数は欺瞞的である。エンジンが実行しようとする実際のステップ数は、1,000,000の指数的な値になる可能性があり、それによってターゲット・システムを独占することになる。
結論
このエクスプロイトにはフィックスがありませんが、HeroDevsのNever-Ending Support for AngularJSのクライアントには、このエクスプロイトが公開された際に通知されました。クライアントでない方で、サブスクリプションにご興味のある方は、今すぐ営業チームまでご連絡ください。
リソース
NIST 2022-25844エントリー
弊社がサポートするオープンソースソフトウェアに新たな脆弱性が修正された場合、いつでもアラートを受け取ることができます。