SpringShell RCE の脆弱性: CVE-2022-22965 に対する保護と検出のガイダンス

news

2022 年 4 月 11 日の更新Azure Application Gateway を使用したリージョン WAF を使用する Azure Web アプリケーション ファイアウォール (WAF) のお客様は、Spring の重大な脆弱性 ( CVE-2022-22963CVE-2022-22965 、およびCVE-2022-22947 ) に対する保護が強化されました。見る詳細については、「 Azure Web アプリケーション ファイアウォール (Azure WAF) による検出と保護」セクションを参照してください

2022 年 3 月 31 日、Spring Framework for Java の脆弱性が公開されました。マイクロソフトは現在、これらの脆弱性に関連する影響を評価しています。このブログは、エクスプロイトに対する保護と、重大なリモート コード実行 (RCE) の脆弱性CVE-2022-22965 (SpringShell または Spring4Shell とも呼ばれる) のネットワーク上の脆弱なインストールを検出する方法を探しているお客様を対象としています。

Spring Framework は、最も広く使用されている Java 用の軽量オープンソース フレームワークです。 Java Development Kit (JDK) バージョン 9.0 以降では、特定の条件が満たされている場合、リモートの攻撃者がフレームワークのパラメーター バインディング機能を介してAccessLogValveオブジェクトを取得し、悪意のあるフィールド値を使用してパイプライン メカニズムをトリガーし、任意のパスにあるファイルに書き込むことができます。会った。

セキュリティ コミュニティでは SpringShell または Spring4Shell と呼ばれる Spring Core の脆弱性は、Spring Core フレームワークを実行している Web サーバーに攻撃者が特別に細工したクエリを送信すると、悪用される可能性があります。同じコンポーネントで公開されているその他の脆弱性はそれほど重要ではなく、このブログの一部として追跡されていません。

影響を受けるシステムには、次の特徴があります。

  • JDK 9.0 以降の実行
  • Spring Framework バージョン 5.3.0 から 5.3.17、5.2.0 から 5.2.19、およびそれ以前のバージョン
  • サーブレット コンテナーとしての Apache Tomcat:
    • 従来の Java Web アーカイブ (WAR) としてパッケージ化され、スタンドアロンの Tomcat インスタンスにデプロイされます。組み込みサーブレット コンテナーまたはリアクティブ Web サーバーを使用する典型的な Spring Boot デプロイメントは影響を受けません。
    • Tomcat にはspring-webmvcまたはspring-webflux依存関係があります

JDK 9.0 以降を使用し、Spring Framework または派生フレームワークを使用しているシステムは、脆弱であると見なす必要があります。次の悪意のないコマンドを使用して、脆弱なシステムを特定できます。

$ curl host:port/path?class.module.classLoader.URLs%5B0%5D=0

HTTP 400 応答を返すホストは、以下の概念実証 (POC) で詳述されている攻撃に対して脆弱であると見なす必要があります。このテストは、攻撃に対するシステムの脆弱性を示す良い指標ですが、上記の影響を受けるシステムの範囲内にあるシステムは、依然として脆弱であると見なされるべきであることに注意してください。

Microsoft 365 Defender内の脅威と脆弱性の管理コンソールは、この脆弱性の検出とレポートを提供します。

このブログでは、次のトピックについて説明します。

  1. 観察された活動
  2. 攻撃の内訳
  3. 脆弱性とエクスプロイトの詳細
  4. 発見と緩和
  5. 検出

観察された活動

Microsoft は、クラウド インフラストラクチャとサービスに対する攻撃を定期的に監視して、防御を強化しています。 Spring Core の脆弱性が発表されて以来、Spring Cloud および Spring Core の脆弱性に対するエクスプロイトの試みをクラウド サービス全体で追跡してきました。 CVE-2022-22965 の試みは、この投稿で説明されている基本的な Web シェルの POC と密接に一致しています。

Microsoft が継続的に脅威の状況を監視している結果、現時点で攻撃や新しいキャンペーンの数が大幅に増加していることは示されていません。

攻撃の内訳

CVE-2022-22965 は、Spring Framework 内でリクエスト マッピング アノテーションと Plain Old Java Object (POJO) パラメータを使用する関数に影響します。 POC コードは、Tomcat にロードされたときに HTTP 要求を処理するコントローラーを作成します。

公開されている唯一の有効な POC は、 propertyDescriptorキャッシュのClassLoaderモジュールを介した Tomcat サーバーのロギング プロパティに固有のものです。攻撃者は、このモジュールを使用してAccessLogValveクラスを更新し、Tomcat ルート ディレクトリにshell.jspという Web シェルを作成できます。その後、攻撃者はデフォルトのアクセス ログを任意のファイルに変更できます。

コード行を含むアプリケーション UI のスクリーンショット。上記のコード行の 1 つが強調表示され、英語以外の言語で書かれた注釈が付いています。
図 1. 元の POC コード投稿のスクリーンショット

AccessValveLogへの変更は、HTTP 要求を使用してサービスのルート ディレクトリに.jspファイルを作成できる攻撃者によって達成される可能性があります。以下の例では、各 GET パラメータが Java オブジェクト プロパティとして設定されています。次に、各 GET 要求は、次の例に似た Java コードを実行します。ここで、最後のセグメント「setPattern」は、各呼び出し (setPattern、setSuffix、setDirectory など) で一意になります。

実際のエクスプロイトの Java コードのスクリーンショット。
HTTP URL の数行のスクリーンショット。
図 2. 元の POC コード投稿のスクリーンショット
コード行を含むアプリケーション UI のスクリーンショット。
図 3. 元の POC コード投稿のスクリーンショット

.jspファイルには、次の形式のパスワードで保護された Web シェルを含むペイロードが含まれるようになりました。

ペイロードの Web シェル コードのスクリーンショット。

その後、攻撃者は HTTP リクエストを使用してコマンドを実行できます。上記の POC では挿入されたコードとしてコマンド シェルが示されていますが、この攻撃は任意の実行可能コードを使用して実行される可能性があります。

脆弱性とエクスプロイトの詳細

Spring の脆弱性により、場合によっては、HTTP リクエストを慎重に作成することにより、クライアントが Web サーバーまたはアプリケーション内の機密内部変数を変更できるようになります。

Tomcat Web サーバーの場合、この脆弱性により、アクセス ログのその操作が、多少恣意的な内容の任意のパスに配置される可能性がありました。上記の POC は、内容を JSP Web シェルに設定し、Tomcat の Web アプリケーション ROOT ディレクトリ内のパスを設定します。これにより、基本的に Tomcat 内にリバース シェルがドロップされます。 Web アプリケーションが脆弱になるには、Spring のリクエスト マッピング機能を使用し、Java オブジェクトをパラメーターとして受け取るハンドラー関数を使用する必要があります。

バックグラウンド

リクエスト マッピングとリクエスト パラメータ バインディング

Spring を使用すると、開発者は HTTP リクエストを Java ハンドラー メソッドにマップできます。 Web アプリケーションの開発者は、ユーザーが特定の URI を要求するたびに適切なハンドラー メソッドを呼び出すように Spring に依頼できます。たとえば、次の Web アプリケーション コードは、ユーザーが URI /WeatherReportをリクエストするたびに、Spring がメソッドhandleWeatherRequestを呼び出すようにします。

@RequestMapping( " /WeatherReport " )
public string handleWeatherRequest(Location reportLocation)
{
…
}

さらに、ハンドラー メソッドは、リクエスト パラメーター バインディングを通じて、GET/POST/REST リクエストのパラメーターを介して渡された引数を受け入れることができます。上記の例では、Spring はLocationオブジェクトをインスタンス化し、HTTP リクエストのパラメーターに従ってそのフィールドを初期化し、それをhandleWeatherRequestに渡します。したがって、たとえば、場所が次のように定義される場合:

class Location
{
    public void setCountry(string country) {…}
    public void setCity(string city) {…}
    public string getCountry() {…}
    public string getCity() {…}
}

次の HTTP リクエストを発行すると:

example.com/WeatherReport?country=USA&city=Redmond

結果として得られるhandleWeatherRequestの呼び出しには、国が USA に設定され、都市がレドモンドに設定されたreportLocation引数が自動的に含まれます。

Locationに、経度緯度のパラメーターを含む、座標という名前のサブオブジェクトがある場合、Spring は、着信要求のパラメーターからそれらを初期化しようとします。たとえば、GET params でリクエストを受信すると、 coordinates.longitude=123&coordinate.latitude=456 Spring は、制御をhandleWeatherRequestに渡す前に、 location座標メンバーにこれらの値を設定しようとします。

SpringShell の脆弱性は、Spring がこれらのフィールドに入力するために使用するプロセスに直接関連しています。

プロパティバインディングのプロセス

上記のように、Spring がハンドラー メソッドにマップされた HTTP リクエストを受信するたびに、ハンドラー メソッドの各引数に対してリクエストのパラメーターをバインドしようとします。ここで、前の例に固執するために、クライアントは次のことを求めました。

example.com/WeatherReport?x.y.z=foo

Spring は引数をインスタンス化します (この場合、 Locationオブジェクトを作成します)。次に、パラメーター名をドット (.) で分割し、一連の手順を実行しようとします。

  1. Java イントロスペクションを使用して、すべてのアクセサーとミューテーターを場所にマップする
  2. location に getX ()アクセサーがある場合は、それを呼び出して location のxメンバーを取得します
  3. Java イントロスペクションを使用して、 xオブジェクト内のすべてのアクセサーとミューテーターをマップします。
  4. xオブジェクトにgetY () アクセサーがある場合は、それを呼び出してxオブジェクト内のyオブジェクトを取得します。
  5. Java イントロスペクションを使用して、すべてのアクセサーとミューテーターをyオブジェクトにマップします。
  6. yオブジェクトにsetZ()ミューテーターがある場合は、パラメーター「foo」で呼び出します

基本的に、詳細を無視して、 location.getX().getY().setZ(“foo”)を取得します。

脆弱性とその悪用

前置き: CVE-2010-1622

2010 年 6 月に、Spring フレームワークの CVE が 公開されました。 CVE の核心は次のとおりです。

  1. すべての Java オブジェクトには、オブジェクトのクラスを記述するClassを返すgetClass()アクセサーが暗黙的に含まれています。
  2. Classオブジェクトには、 ClassLoaderオブジェクトを取得するgetClassLoader()アクセサーがあります。
  3. Tomcat は、Web アプリケーションに独自のクラス ローダーを使用します。このクラス ローダーには、Tomcat の動作に影響を与える可能性があるさまざまなメンバーが含まれています。そのようなメンバーの 1 つがURLs です。これは、クラス ローダーがリソースを取得するために使用する URL の配列です。
  4. URL の 1 つをリモート JAR ファイルへの URL で上書きすると、Tomcat はその後、攻撃者が制御する場所から JAR をロードします。

このバグは、Spring で、プロパティ バインディング フェーズ中にClassオブジェクトのgetClassLoader()またはgetProtectionDomain()アクセサーのマッピングを防止することで修正されました。したがって、 class.classLoaderは解決されず、攻撃が阻止されます。

現在のエクスプロイト: CVE-2022-22965

現在のエクスプロイトは、CVE-2010-1622 と同じメカニズムを利用して、以前のバグ修正をバイパスします。 Java 9 では、Java モジュールと呼ばれる新しいテクノロジーが追加されました。 getModule()と呼ばれるアクセサがClassオブジェクトに追加されました。 ModuleオブジェクトにはgetClassLoader()アクセサーが含まれています。 CVE-2010-1622 の修正では、 ClassオブジェクトのgetClassLoader()アクセサーのマッピングのみが防止されたため、Spring はModuleオブジェクトのgetClassLoader()アクセサーをマッピングしました。繰り返しになりますが、 class.module.classLoaderパラメーター名のプレフィックスを介して、Spring からクラス ローダーを参照できます。

ClassLoaderからAccessLogValveへ

最新のエクスプロイトは、Tomcat クラス ローダーを介して同じアクセサー チェーンを使用し、サーバーに JSP Web シェルをドロップします。

これは、Tomcat のパイプラインでAccessLogValveオブジェクトのプロパティを操作することによって行われます。 AccessLogValveは、 class.module.classLoader.resources.context.parent.pipeline.firstパラメーター プレフィックスを使用して参照されます。

次のプロパティが変更されます。

  1. ディレクトリ: Tomcat のルート ディレクトリからの相対パスで、アクセス ログを保存するパス。これは、Web アプリケーションのディレクトリなど、http 要求によってアクセス可能な場所を指すように操作できます。
  2. Prefix:アクセスログファイル名のプレフィックス
  3. Suffix:アクセスログファイル名のサフィックス。ログ ファイル名は、プレフィックスとサフィックスを連結したものです。
  4. パターン:ログ レコード構造を説明する文字列。これは、各レコードが本質的に JSP Web シェルを含むように操作できます。
  5. FileDateFormat:これを設定すると、新しいアクセス ログ設定が有効になります。

Web シェルがサーバーにドロップされると、攻撃者はサーバー上で Tomcat としてコマンドを実行できます。

発見と緩和

脆弱なデバイスを見つける方法

Microsoft Defender for Endpoint脅威と脆弱性の管理機能は、組織の全体的なセキュリティ体制を監視し、継続的な脆弱性の発見、インテリジェントな優先順位付け、および脆弱性をシームレスに修復する機能を通じて、組織のリスクに関するリアルタイムの洞察をお客様に提供します。

CVE-2022-22965 を検索して、脅威と脆弱性の管理の弱点ページから脆弱なデバイスを見つけることができるようになりました。

CVE-2022-22965 を検索して脆弱なデバイスを見つけることができる脆弱性ページのスクリーンショット。
図 4. Microsoft Defender for Endpoint の弱点ページ

Azure Firewall Premium による強化された保護

Azure Firewall Premiumを使用しているお客様は、SpringShell CVE-2022-22965 の脆弱性とエクスプロイトからの保護が強化されています。 Azure Firewall Premium Intrusion Detection and Prevention System (IDPS) は、すべての East-West トラフィック、インターネットへの送信トラフィック、およびインターネットからの受信 HTTP トラフィックに対して IDPS 検査を提供します。脆弱性ルールセットは継続的に更新され、2022 年 3 月 31 日以降、SpringShell の脆弱性保護が含まれています。以下のスクリーンショットは、Azure Firewall Premium によって積極的に軽減されているすべてのシナリオを示しています。

CVE-2022-22965 エクスプロイトに対するプロアクティブな保護のために、IDPS アラート & 拒否モードと TLS インスペクションの両方を有効にして Azure Firewall Premium を構成します。

図 5. CVE-2022-22965 の悪用の試みを検出する Azure Firewall Premium ポータル。

Azure Firewall Standard を使用しているお客様は、次の手順に従って Premium に移行できます。 Azure Firewall Premium を初めて利用するお客様は、 Firewall Premiumについて詳しく知ることができます。

Azure Web アプリケーション ファイアウォール (Azure WAF) で検出して保護する

Azure Front Door と Azure Application Gateway をデプロイしている Azure Web アプリケーション ファイアウォール (WAF) のお客様は、SpringShell のエクスプロイト ( CVE-2022-22965 ) と、影響の大きいその他の Spring の脆弱性CVE-2022-22963およびCVE-2022-22947に対する保護が強化されました。これらの重要な Spring の脆弱性を検出して軽減するために、4 つの新しいルールをリリースしました。

Azure Front Door を使用したグローバル WAF

Azure WAF は、既定のルール セット (DRS) バージョン 2.0/1.1/1.0 を更新しました。

  • ルール グループ: MS-ThreatIntel-WebShells 、ルール ID: 99005006 – Spring4Shell インタラクション試行
  • ルール グループ: MS-ThreatIntel-CVEs 、ルール ID: 99001014 – Spring Cloud ルーティング式インジェクションの試み (CVE-2022-22963)
  • ルール グループ: MS-ThreatIntel-CVEs 、ルール ID: 99001015 – Spring Framework の安全でないクラス オブジェクトの悪用の試み (CVE-2022-22965)
  • ルール グループ: MS-ThreatIntel-CVEs 、ルール ID: 99001016 – Spring Cloud Gateway アクチュエータ インジェクションの試み (CVE-2022-22947)

Azure Front Door の WAF ルールは、既存の Microsoft マネージド ルール セットでは既定で無効になっています。

WAF Spring の脆弱性のスクリーンショット
図 6. WAF Spring の脆弱性のスクリーンショット

Azure Application Gateway を使用したリージョン WAF

Azure WAF は、Azure Application Gateway WAF V2 リージョン デプロイの OWASP Core Rule Set (CRS) バージョンを更新しました。新しいルールは、 Known_CVEsルール グループの下にあります。

  • ルール ID: 800110 – Spring4Shell インタラクション試行
  • ルール ID: 800111 – Spring Cloud ルーティング式インジェクションの試行 – CVE-2022-22963
  • ルール ID: 800112 – Spring Framework の安全でないクラス オブジェクトの悪用の試み – CVE-2022-22965
  • ルール ID: 800113 – Spring Cloud Gateway Actuator インジェクションの試行 – CVE-2022-22947

Azure Application Gateway の WAF ルールは、サポートされている CRS バージョンに対して既定で有効になっています。

Azure Application Gateway OWASP コア ルール セット (CRS) の Spring 脆弱性ルールのスクリーンショット
図 7. Azure Application Gateway OWASP コア ルール セット (CRS) の Spring 脆弱性ルール

推奨事項: WAF SpringShell ルールを有効にして、これらの脅威から保護します。引き続き脅威パターンを監視し、必要に応じて新しい攻撃パターンに対応して上記のルールを変更します。

Azure Front Door でのマネージド ルールと既定のルール セット (DRS) の詳細については、「 Web アプリケーション ファイアウォールの DRS ルール グループとルールのドキュメント」を参照してください。 Azure Application Gateway のマネージド ルールと OWASP コア ルール セット (CRS) の詳細については、 Web アプリケーション ファイアウォールの CRS ルール グループとルールのドキュメントを参照してください。

パッチ情報と回避策

この脅威の影響を軽減するために、これらの軽減策を適用することをお勧めします。監視対象の軽減策の展開状態については、Microsoft 365 Defender の脅威と脆弱性の管理の推奨カードを確認してください。

  • CVE-2022-22965 の更新プログラムが利用可能です。管理者は、バージョン 5.3.18 以降または 5.2.19 以降にアップグレードする必要があります。パッチが適用されている場合、他の軽減策は必要ありません。

CVE-2022-22965 にパッチを適用できない場合は、 Springによって公開されている次の一連の回避策を実装できます。

  • アプリケーションで @InitBinder アノテーションをグローバルに検索して、メソッド本体で dataBinder.setDisallowedFields メソッドが呼び出されているかどうかを確認します。このコード スニペットの導入が見つかった場合は、 {"class.*","Class.*","*.class.*", "*.Class.*"}を元のブラックリストに追加してください。 (注:このコード スニペットが頻繁に使用される場合は、各場所に追加する必要があります。)
  • 次のグローバル クラスを、コントローラーが配置されているパッケージに追加します。次に、プロジェクトを再コンパイルして機能をテストします。
import org.springframework.core.annotation.Order;
        import org.springframework.web.bind.WebDataBinder;
        import org.springframework.web.bind.annotation.ControllerAdvice;
        import org.springframework.web.bind.annotation.InitBinder;
        @ControllerAdvice
        @オーダー(10000)
        パブリッククラスGlobalControllerAdvice{
             @InitBinder
             public void setAllowedFields(webdataBinder dataBinder){
             String[]abd=new string[]{"class.*","Class.*","*.class.*","*.Class.*"};
             dataBinder.setDisallowedFields(abd);
             }
        }

検出

Microsoft 365 ディフェンダー

エンドポイントの検出と応答 (EDR)

セキュリティ センターの次のタイトルのアラートは、ネットワークでの脅威の活動を示している可能性があります。

  • SpringShell のエクスプロイトの可能性

観測された攻撃に対して次のアラートが表示されますが、この脆弱性の悪用に固有のものではない可能性があります。

  • ネットワークサービスによって実行される不審なプロセス

ウイルス対策

Microsoft Defender ウイルス対策バージョン1.361.1234.0以降は、次の検出でこの脅威に関連するコンポーネントと動作を検出します。

  • トロイの木馬:Python/SpringShellExpl
  • エクスプロイト:Python/SpringShell
  • バックドア:PHP/Remoteshell.V

狩猟

Microsoft 365 Defender の高度な検索クエリ

以下のクエリを使用して、被害者のデバイスと悪用を実行しているデバイスの両方で CVE-2022-22965 の悪用を明らかにします。このクエリは、エクスプロイトの HTTP の使用のみを対象としており、HTTPS は対象としていないことに注意してください。

デバイス ネットワーク イベント
| |タイムスタンプ > ago(7d)
| |ここで、ActionType =~ "NetworkSignatureInspected"
| |ここで、AdditionalFields には「.jsp?cmd=」が含まれます
| | makeset(AdditionalFields, 5), min(Timestamp), max(Timestamp) を DeviceId, DeviceName ごとにまとめる

マイクロソフト センチネル

Microsoft Sentinel のお客様は、次のクエリを使用して、この脅威の活動を探すことができます。

  • SpringShell の悪用の可能性のある試み (CVE-2022-22965) – このハンティング クエリは、Azure Web アプリケーション ファイアウォールのデータを調べて、SpringShell の悪用の可能性のある試み (CVE-2022-22965) を見つけ、HTTP 要求によってアクセス可能な場所に悪意のある Web シェルをドロップします。次に攻撃者は、悪意のあるバックドアにシステム コマンドを実行するよう要求します。
  • SpringShell の脆弱性に関連する AV 検出– このクエリは、SpringShell の脆弱性に関連する Microsoft Defender for Endpoint のヒットを探します。 Microsoft Sentinel では、 SecurityAlertsテーブルには、影響を受けるデバイスのデバイス名のみが含まれます。このクエリは、 DeviceInfoテーブルを結合して、デバイス グループ、IP アドレス、サインインしているユーザーなどの他の情報を明確に関連付けます。これにより、Microsoft Sentinel アナリストは、アラートに関連するより多くのコンテキストを利用できるようになります (利用可能な場合)。

改訂履歴

[2022 年 4 月 11 日] – Application Gateway では、重要な Spring の脆弱性 ( CVE-2022-22963CVE-2022-22965 、およびCVE-2022-22947 ) に対する保護が強化されました。詳細については、検出と緩和のセクションを参照してください

[2022 年 4 月 8 日] – Azure Front Door を使用する Azure Web アプリケーション ファイアウォール (WAF) のお客様は、Spring4Shell エクスプロイト (CVE-2022-22963、CVE-2022-22965、および CVE-2022-22947) に対する保護が強化されました。詳細については、検出と緩和のセクションを参照してください。
[2022 年 4 月 5 日] – SpringShell のエクスプロイト アクティビティを探すために Microsoft Sentinel ハンティング クエリを追加しました。

参照: https://www.microsoft.com/en-us/security/blog/2022/04/04/springshell-rce-vulnerability-guidance-for-protecting-against-and-detecting-cve-2022-22965/

Comments

タイトルとURLをコピーしました