New Vulnerability in Spring Framework Detected の翻訳版です。
Spring Framework における脆弱性を検出
HCL AppScanチームにより、Spring FrameworkのSpringShellと呼ばれる脆弱性が最近発見されました。
SpringShellは、CVE IDがCVE-2022-22965であり、悪用に成功するとリモートコード実行(RCE)となり、Webサーバーが危険にさらされ、攻撃者の制御下に置かれることになります。Spring Frameworkバージョン5.3.17/5.2.19以下に影響します(バージョン5.3.18/5.2.20でパッチが適用されました)。
AppScanのユーザーは、AppScanのSCAサービス、およびAppScanのDASTエンジンの最新バージョンの両方を通じて、この脆弱性を検出できます。
この問題自体はSpring Frameworkに関するものですが、この問題をうまく利用するためには、さらにいくつかの前提条件が必要です。
Spring Frameworkは、Webアプリケーションの開発に広く使用されているアプリケーションフレームワークである。その多くの機能の中にデータバインディングがあり、リクエストハンドラを扱う際の開発者のワークフローを大幅に簡素化することができます。通常のリクエストハンドラでは、開発者はリクエストパラメータから情報を解析する必要がありますが、Springのデータバインディング機能は、リクエストパラメータの値を、リクエストハンドラのコード内で、その名前に基づいて対応する引数に自動的にバインドします。これにより、コードが大幅に簡素化され、読みやすくなります。
しかし、このデータバインディング機能には、たまたまバグがあります。この実装では、class という名前の機密性の高いプロパティ (バインドされるオブジェクトのクラスを指す) が意図せず公開されてしまい、これを悪用してリクエストパラメーターの値をメモリ内の任意のオブジェクトのフィールドにバインドできます。これは、Javaにおける高レベルのwrite-what-whereプリミティブのようなものです。この脆弱性を利用して、慎重に選択されたフィールドを変更することで、任意のコードを実行できます。
この脆弱性は、Apache Tomcatのロギング機能、つまりAccessLogValveクラスのインスタンスを悪用します。そのクラスには、Tomcatのロギング動作を定義する複数のフィールドがあり、以下のフィールドに注目します。
これらのフィールドを write-what-where プリミティブで変更することで、サーバ上で任意のコードを実行することが可能です。
上記の手順が完了すると、攻撃者はTomcatが何かを記録するのを待つ必要があり(または、ウェブサイトのページにアクセスすることで記録イベントを発生させる)、悪意のあるJSPファイルが作成され、アクセスできるようになります。
上記の悪用方法は、複数の前提条件に依存していますが、より広いケースで機能する新しい方法が発見される可能性があります。そのため、使用する Spring Framework をパッチ適用済みのバージョン (Spring Framework 5.3.18 または 5.2.20) に更新することが、この問題に対する適切な対処法です。