Spring バグへの対応 : CVE-2022-22963 および Spring4Shell (CVE-2022-22965) の 脆弱性について
背景
2種類の RCE の脆弱性が混同して理解され、混乱を招いています。そのひとつは CVE-2022-22963 (Spring Cloud に影響) で、もうひとつは CVE-2022-22965 (Spring Framework に影響) です。
どちらのバグについても、エクスプロイトコードが現在も使用されています。
Fastly のお客様は、この脆弱性への対策をご自身で行えます。
CVE-2022-22963 と CVE-2022-22965 に対するパッチはすでに公開されています。
Spring は Java アプリケーションの開発を加速化させるフレームワークで、Java 開発者の間で広く利用されています。このブログ記事でご紹介するバグは、Spring Cloud と Spring Framework のパッケージが対象となります。今週、これらのバグが同じものであるという誤解が広まり混乱が起きました。実際は、2つは異なる種類のバグであり、それぞれ別の問題なのです。どちらのバグも、脆弱性のあるバージョンのソフトウェアを実行した場合に、Web アプリケーションを提供しているリモートホスト上で任意のコードが実行される可能性を引き起こします。社外の人がアクセスする可能性のあるインフラでこのレベルのコントロールが可能になると、深刻な問題が起こるリスクが当然生まれます。
影響範囲
CVE-2022-22963
この脆弱性は非常に簡単に悪用されやすく、攻撃者は spring.cloud.function.routing-expression
という HTTP ヘッダーを介して Spring 式言語 (SpEL) に任意のコードを渡すことができます (このパラメータは Cloud Function で検証されないため)。悪用されやすいという意味では、この脆弱性の影響は非常に大きいといえます。しかし影響を受けるのは Spring Cloud Function のバージョン3.1.6 (3.1.x の場合) と3.2.2 (3.2.x の場合)、およびそれ以前のバージョンを利用しているサービスのみなので、影響の範囲は限定的です。
CVE-2022-22965
この脆弱性は、JDK 9 以上で動作する Spring MVC と Spring WebFlux アプリケーションに影響を及ぼします。具体的には、アプリケーションが Tomcat 上で WAR デプロイとして動作している場合に悪用されます。アプリケーションが Spring Boot の実行可能な JAR としてデプロイされている場合は、この悪用に対する脆弱性はありません。しかし今回の脆弱性はより一般性があり、今後悪用される方法が他にも発見される可能性があります。
興味深いポイント
CVE-2022-22963 は式言語の脆弱性であり、リモートコード実行 (RCE) が発生する条件を生み出します。同様の条件を悪用して RCE を引き起こす脆弱性は、これまでにもありました (CVE-2017-8046 など)。同じフレームワークで同様の実行能力を持つこの種のバグが再度発生した場合、利用者はそのフレームワークを見直す必要があります。
CVE-2022-22965 も Spring Framework における RCE の脆弱性です。この脆弱性に関しては、CVE 公開前に、同じコードに関わる12年前の脆弱性 (CVE-2010-1622) について概念実証が公開されています。
それでも発生した脆弱性
CVE-2022-22963
この脆弱性は、Spring Cloud Function のバージョン3.1.6 (3.1.x の場合) と3.2.2 (3.2.x の場合)、およびそれ以前のバージョンに影響を及ぼします。この脆弱性は、リクエストヘッダーを修正するだけで簡単に悪用されてしまいます。しかし Spring Cloud Function を利用しているサービスの数は、Spring Framework 自体の利用数に比べて圧倒的に少ないため、実際の影響範囲はそれほど広くないと思われます。
CVE-2022-22965
この脆弱性の悪用は以下の前提条件で起こります 。
JDK 9 以上の環境
Apache Tomcat をサーブレットコンテナとして利用
(Spring Boot の実行可能な JAR ではなく) 従来の WAR としてパッケージ化
spring-webmvc
またはspring-webflux
に依存Spring Framework のバージョン5.3.0から5.3.17、バージョン5.2.0から5.2.19、およびそれ以前のバージョンを利用
上記の条件に該当する場合でも、リモートコード実行が必ず発生するとは限りません。
詳細
CVE-2022-22963
CVE-2022-22963 の調査が開始されてすぐに、この脆弱性がヘッダーを介して悪用されることが判明しました。 悪用される方法がシンプルなので、そのエクスプロイトコードがさまざまな場所で公開されています。以下は、この脆弱性を利用する POST リクエストの例です。
POST /functionRouter HTTP/1.1host:127.0.0.1:8080User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15Connection: closespring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("touch /tmp/pwned")Content-Length: 1
.
この例では、イベントルーティング機能を操作して Spring Cloud で利用可能な関数にアクセスできる脆弱性がシンプルな方法で悪用されているのが分かります。攻撃者は、特定の文字列セットを持つ spring.cloud.function.routing-expression を HTTP ヘッダーとして含めることで、通常は利用できない関数にアクセスできるようになります。この方法により、getRunTime().exec() や getByName() といった関数へのアクセスが可能になります。
CVE-2022-22965undefined
このバグでは 、クラスの読み込みに関連する Java プロパティが不適切にフィルタリングされ、攻撃者が読み込み元のクラスの場所とテンプレート名を指定できるようになります。詳細は公開されている POC で確認できます。具体的には以下のプロパティを HTTP POST で送信し、ローカルファイルシステム上にファイル名を作成します。
class.module.classLoader.resources.context.parent.pipeline.first.directory
class.module.classLoader.resources.context.parent.pipeline.first.prefix
class.module.classLoader.resources.context.parent.pipeline.first.suffix
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat
その後 class.module.classLoader.resources.context.parent.pipeline.first.pattern
プロパティを利用して次のステップで渡すテンプレート名を指定し、ファイルに書き込まれて実行されるオブジェクトを指定します。
次に攻撃者は、テンプレート名を HTTP ヘッダーとして送信し、その中に実行される Java コードを含めます。
私たちのチームが入手した、公開済みの概念実証では、シェルの起動に以下のコードが利用されています。
Runtime.getRuntime().exec(request.getParameter("cmd"))
この脆弱性の悪用が成功するかどうかは POST リクエストによって設定されるプロパティに左右されるように見えます。しかし一部の研究者たちは、 classLoader プロパティを含む GET コマンドの使用によるリスクを検証するメソッドを共有しています。
検証や悪用には classLoader プロパティを操作する必要があるため、防御側がフォレンジック調査時に検索しやすい文字列が残されます。プロパティに割り当てられた具体的な値を参照することで、ファイルシステムの検索場所や試行されたコマンドに関する詳細が得られます。
解決策
すべてのバグについて言えることですが、利用可能なパッチを適用して問題の根本原因を取り除く、あるいは解決することをお勧めします。パッチの提供前は CVE-2022-22965 を悪用するエクスプロイトが野放しになっていましたが、本ブログ記事の執筆時点では両方のバグに対するパッチがすでにリリースされています。
CVE-2022-22963
利用可能なパ ッチの詳細はこちらから確認できます。
対象となるバージョンをお使いの方は、バージョン3.1.7および3.2.3にアップグレードしてください。それ以外の対応は必要ありません。この問題は以下のリリースによって修正されています。
Spring Cloud Function
3.1.7
3.2.3
CVE-2022-22965
利用可能なパッチの詳細はこちらから確認できます。
修正を含む Spring Framework のバージョン5.3.18と5.2.20がリリースされました。
Spring Framework 5.3.18 を利用しているユーザー向けに、Spring Boot 2.6.6 および 2.5.12 もリリースされています。
今回の脆弱性に関して Spring は、パッチの提供の他に、パッチが適用できない場合に影響を抑えるための詳細情報も提供しています。
また、@ControllerAdvice
を介して disallowedFields
を WebDataBinder
に設定することを推奨する一方、注意も促しています。
@ControllerAdvice@Order(Ordered.LOWEST_PRECEDENCE)public class BinderControllerAdvice {
@InitBinder public void setAllowedFields(WebDataBinder dataBinder) { String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"}; dataBinder.setDisallowedFields(denylist); }
}
この設定は一般的には有効ですが、一元的に適用される回避策としては、問題がある可能性があります。Spring のブログで紹介されている詳しい説明をお読みになることをお勧めします。
また、Fastly のお客様は、私たちの WAF プロダクトを利用してこれらの脆弱性への対応策を講じることができます。
CVE-2022-22963
Fastly 次世代 WAF (Powered by Signal Sciences) では、この脆弱性を検出できます。同プロダクトをご利用のお客様は、以下の手順で CVE-2022-22963 の悪用を防ぐテンプレートルールを有効にできます。
Templated Rules にアクセスして CVE-2022-22963 を見つけます。
Configure をクリックし、Block requests from an IP immediately if the CVE-2022-22963 signal is observed を有効にします。
Fastly WAF の旧バージョンをご利用の場合、この脅威に対する VCL ベースの対策のデプロイが可能です。この設定にてサポートが必要な場合は、CSOC (securitysupport@fastly.com) までご連絡ください。
CVE-2022-22965
Fastly 次世代 WAF (Powered by Signal Sciences) では、この脆弱性を検出できます。同プロダクトをご利用のお客様は、以下の手順で CVE-2022-22965 の悪用を防ぐテンプレートルールを有効にできます。
Templated Rules にアクセスして CVE-2022-22965 を見つけます。
Configure をクリックし、Block requests from an IP immediately if the CVE-2022-22965 signal is observed を有効にします。
Fastly WAF の旧バージョンをご利用の場合、この脅威に対する VCL ベースの対策のデプロイが可能です。この設定にてサポートが必要な場合は、CSOC (securitysupport@fastly.com) までご連絡ください。