CVE-2022-22963の検出と緩和: Spring Cloud RCE 脆弱性

By 清水 孝郎 - MARCH 31, 2022

SHARE:

本文の内容は、2022年3月30日にStefano Chiericiが投稿したブログ(https://sysdig.com/blog/cve-2022-22963-spring-cloud/)を元に日本語に翻訳・再構成した内容となっております。

本日、リサーチャーは、有名なSpring Cloud Functionにリモートコード実行(RCE)につながる新たな高い脆弱性を発見しました。この脆弱性CVE-2022-22963は、攻撃者がマシン上で任意のコードを実行し、ホスト全体を危険にさらすことを可能にするものです。

CVE 2022-22963に続き、新たにCVE 2022-22965が公開されました。この新たな重大な脆弱性は、Spring Frameworkに影響を与え、また、リモートでのコード実行を可能にします。

影響を受けるSpring Cloud Functionのバージョンは以下の通りです。
  • 3.1.6
  • 3.2.2
  • サポートされていない古いバージョンも影響を受けます
  • JDK >=9 で動作している場合
ルーティング機能を使用すると、特別に細工した Spring Expression Language (SpEL) をrouting functionalityとして提供し、ローカルリソースへのアクセスやホスト内のコマンドを実行することが可能です。

Spring Cloud Functionは、AWS lambdaやGoogle Cloud Functionsなどのクラウドサーバーレス機能で使用できるため、これらの機能にも影響が及ぶ可能性があります。

これは、Log4jのJavaライブラリに見つかったLog4jshellリモートコード実行の脆弱性に続き、ここ数カ月で発見された2つ目の非常に高い脆弱性です。

この記事では、CVE-2022-22963を理解し、それを悪用する方法とSysdigを使用して脆弱性を緩和する方法を説明します。
ゼロデイ脆弱性については発展途上の話であり、今後も順次情報を公開していく予定です。

Spring Cloud Functionとは

Springは、オープンソースの軽量Javaプラットフォームアプリケーション開発フレームワークで、Spring Frameworkを使用する何百万人もの開発者が、高性能でテストが容易なコードを作成するために使用しています。

特に今回の脆弱性では、Spring Cloud Functionフレームワークを見ることになります。Spring Cloud Functionフレームワークは、開発者がSpringの機能を使って、クラウドに依存しない関数を書くことを可能にします。これらの関数はスタンドアロンクラスとすることができ、どのクラウドプラットフォームにも簡単にデプロイしてサーバーレスフレームワークを構築することができます。

Spring Cloud Functionの大きな利点は、Spring Bootのような自動構成と依存性注入の機能をすべて提供することです。

それでは、脆弱性CVE-2022-22963をめぐる問題の所在を確認しましょう。

CVE-2022-22963の問題点

CVE-2022-22963の問題は、HTTPリクエストヘッダspring.cloud.function.routing-expressionパラメータとSpEL式を使用して、StandardEvaluationContextを介して注入・実行することを許可する点です。

エディターノート:Springには複数の脆弱性が存在し、いずれもSpring4Shellと表記されています。以下の議論は、Spring Coreの脆弱性ではなく、Spring Expression Languageのインジェクションを許可するSpring Cloud Functionに影響する脆弱性に関してです。


パッチからわかるように、新しいフラグisViaHeaderが追加され、ヘッダーコンテンツをパースする前に検証を行うようになりました。このことは、この脆弱性がHTTP攻撃経路に限定されることを示唆しています。

cve-2022-22963 spring cloud codeCVE-2022-22963 Spring Cloud コード

また、検証前に値が使用される以前の動作にも気づくことができます。

CVE-2022-22963の影響

CVSSシステムによると、重大度は9.8です。

機密性整合性可用性に対する高い影響と、先に見たような悪用のしやすさから、このソリューションを採用するすべてのユーザにとって、本当に重大です。

この脆弱性を悪用することで、ホストやコンテナを完全に危険にさらし、任意のコマンドを実行させることが可能です。

Spring Cloud Functionはクラウドのサーバーレス機能で使用されている可能性があるため、それらの機能も同様に脆弱であり、攻撃者はあなたのクラウドアカウント内に侵入してくる可能性があります。

CVE-2022-22963を悪用する方法

本脆弱性を利用することは、非常に簡単です。GitHubに、脆弱性攻撃のための実行イメージが掲載されています。以下は、本脆弱性を悪用するためのcurlコマンドの報告です。

curl -i -s -k -X $'POST' -H $'Host: 192.168.1.2:8080' -H $'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec(\"touch /tmp/test")' --data-binary $'exploit_poc' $'http://192.168.1.2:8080/functionRouter'

このcurlを使えば、オペレーティングシステム上にファイルを作成するのは簡単ですが、脆弱なホストやコンテナ上でリバースシェルを開くのに使われる可能性もあります。

CVE-2022-22963の検出と緩和の方法

CVE-2022-22963の影響を受ける場合は、アプリケーションを最新版の3.1.7 & 3.2.3にアップデートする必要があります。

この脆弱性の影響を受けるコンテナに対して、すでにライブラリをアップグレードしたり、他の緩和策を適用している場合でも、環境における悪用の試みと侵害後の活動を検出する必要があります。

この脆弱性は、アプリケーションライフサイクルの3つの異なるフェーズで検出することができます。

  • ビルドプロセス:イメージスキャナーを使用する。
  • デプロイメントプロセス:アドミッションコントローラー上のイメージスキャナーを使用する。
  • ランタイム検出エンジンを使用したランタイム検出フェーズ:すでにデプロイされたホストやポッドから悪意のある動作を検出する。
では、それぞれをさらに掘り下げてみましょう。

1. ビルド: イメージスキャナー

ソフトウェア構成分析(SCA)ツールであるイメージスキャナーを用いて、コンテナイメージの内容やビルドプロセスを分析し、セキュリティ上の問題や脆弱性バッドプラクティスを検出することができます。

レポート結果では、すでに環境に導入されているイメージで特定のCVEが検出されているかどうかを検索することができます。

CVE-2022-22963は、脆弱なバージョンを使用している特定の1つのイメージに影響を及ぼしていることが確認できます。

この記事の執筆時点では、複数の脆弱性追跡データベースは、この脆弱性の深刻度を反映するようにまだ更新されていません。応急処置として、下の画像のように、影響を受けるパッケージの脆弱なバージョンをブラックリスト化することも可能です。下記は “warn “ポリシーで、脆弱性のあるイメージの実行を停止しません。

cve-2022-22963 spring cloud image scannerCVE-2022-22963 Spring Cloud イメージスキャナー

2. デプロイ:アドミッションコントローラーのイメージスキャナー

アドミッションコントローラーにイメージスキャンを実装することで、スキャンポリシーに準拠したワークロード・イメージのみをクラスターでの実行を許可することができるようになります。

このコンポーネントは、名前、タグ、ネームスペース、CVE深刻度レベルなどに基づいて、さまざまな基準でイメージを拒否することが可能です。

この特定の CVE-2022-22963 に対するポリシーを作成して割り当てると、アドミッション・コントローラーは新しいデプロイメント・イメージを評価し、このセキュリティ問題が検出された場合はデプロイメント差し止めるようになります。

この場合も、脆弱性フィードが不完全な場合、特定のパッケージ名とバージョンを含むイメージをブロックすることができます。

3. ランタイムレスポンス :イベントの検出

Falcoのようなランタイム検出エンジンツールを使用すると、コンテナがすでに本番稼動しているときにランタイムで発生する攻撃を検出することができます。

以下は、リバースシェルルールの例です。誤検知を避けるために、条件に例外を追加することで、より環境に適応させることができます。
- rule: Reverse shell
  desc: Detect reverse shell established remote connection
  condition: evt.type=dup and container and fd.num in (0, 1, 2) and fd.type in ("ipv4", "ipv6")
  output: >
    Reverse shell connection (user=%user.name %container.info process=%proc.name parent=%proc.pname cmdline=%proc.cmdline terminal=%proc.tty container_id=%container.id image=%container.image.repository fd.name=%fd.name fd.num=%fd.num fd.type=%fd.type fd.sip=%fd.sip)
  priority: WARNING
  tags: [container, shell, mitre_execution]
  append: false

まとめ

Spring4Shellは、一連のJavaの大きな脆弱性の一つです。Log4jのように、攻撃者がJavaアプリのHTTPサービスに悪意のある文字列を送ることができればいいのです。CVE-2022-22963は悪用のハードルが非常に低いので、攻撃者がインターネットを激しくスキャンしているのを見ることになるでしょう。発見された場合、彼らはおそらくクリプトマイナーボットネットエージェント、またはリモートアクセスツールキットをインストールすることになるでしょう。

この種の脆弱性に対する最善の防御策は、できるだけ早くパッチを適用することです。自分の環境で使用されているパッケージを明確に理解することは、今日の世界では必須です。SCA のような最新のツールを使用することで、この目標を達成し、システムの優先順位を適切に設定することができます。