
調べた情報によると、これはSpring SecurityフレームワークのRegexRequestMatcherクラスに関連する脆弱性です。具体的には、正規表現にドット(.)が含まれるRegexRequestMatcherを使用するアプリケーションは、\r(%0a)、\n(%0d) の文字を使用してバイパスされる可能性があります。これにより、攻撃者は認証なしで許可されていないパスにアクセスできるようになります。
影響を受けるSpring Securityフレームワークのバージョン:
5.5.x は 5.5.7 より前5.6.x は 5.6.4 より前この脆弱性を静的に分析するために、Spring Securityのソースコードにアクセスする必要があります。具体的には、Github上で脆弱性のあるバージョン5.6.3と修正されたバージョン5.6.4のコミットを比較する機能を使用します。次のリンクを参照: Comparing 5.6.3...5.6.4 · spring-projects/spring-security (github.com)

RegexRequestMatcherクラスの変更を確認します。バージョン5.6.4では、このクラスはデフォルトの.の代わりにPattern.DOTALLを使用していることがわかります。
ここで:
Pattern: java.util.regexパッケージ内の3つのクラスの1つであり、正規表現を処理する機能を持ちます。Pattern.DOTALL: このフラグを使用すると、正規表現の.が\n、\rなどの改行文字も含むすべての文字にマッチするようになります。Pattern.CASE_INSENSITIVE: 大文字小文字を区別しません。
デフォルトでは、正規表現の.は\n、\rなどの改行文字を除くすべての文字にマッチします。そのため、ある文字列のパターンを検証する正規表現関数がある場合、文字列内に改行文字が含まれていると正規表現はマッチしません。これを回避するには、Pattern.DOTALLフラグを使用できます。
ただし、誰かが意図的に\nの代わりに%0d、\rの代わりに%0aを使用した場合、上記の正規表現は依然としてマッチしません。そのため、バージョン5.6.4では、RegexRequestMatcherTests.javaにこのケースをチェックする追加のコードが追加されました。具体的には、%0dと%0aをそれぞれ\nと\rに変換してから正規表現でチェックします。

手順1: Spring Initializr を使用して、Spring SecurityとSpring Webの2つの依存関係を含むSpring Boot Webアプリケーションを作成します。

手順2: /admin/* パスへのリクエストがあるときに This is a CVE-2022-22978 demo という文字列を出力するコントローラーを作成します。

手順3: ユーザーが /admin/<任意> パスにアクセスするたびに認証メカニズムを設定します。regexMatchers("/admin/.*").authenticated() を使用します。これが、攻撃者が認証なしで /admin/<任意> ページの内容を表示するために悪用する脆弱性です。

手順4: 構成ファイルで、脆弱性を含むSpring Securityのバージョンを宣言します。ここではバージョン 5.6.3 を選択します。

手順5: gradlew bootRun コマンドでアプリケーションを実行します。プログラムはデフォルトでApache Tomcatを使用し、ポート8080でリッスンします。/admin/xyz (または /admin/ で始まる任意のパス) にアクセスします。

結果として 403 Forbidden が返され、認証されていないためアクセスできないことがわかります。
ここで、Spring Security (バージョン 5.6.3) の regexMatchers 関数の脆弱性を悪用します。この関数は \r(%0d) や \n(%0a) などの改行文字にマッチしません。そのため、ペイロード /admin/%0dxyz を使用して、認証なしで上記のパスにアクセスできます。

同様に、ペイロード /admin/%0axyz も機能します。

このように、非常にシンプルなペイロードだけでCVE-2022-22978の脆弱性を悪用することに成功しました。
5.7.1 を使用します。
同じペイロード /admin/%0dxyz を使用してWebアプリケーションを攻撃してみます。

このとき、アプリケーションは攻撃者が期待する応答を返しません。
git clone https://github.com/ducluongtran9121/CVE-2022-22978-PoC.git
cd CVE-2022-22978-PoC
gradlew bootRun
Java 18
Gradle 7.4.1