Jacksonのデシリアライズ脆弱性
2019年8月21日
0 分で読めます2019年7月29日、com.fasterxml.jackson.core:jackson-databindのバージョン2.9.9.2以前すべてに影響する、深刻度の高い信頼できないデータのデシリアライズの脆弱性(CVE-2019-14379、CVE-2019-14439)が公開されました。
Spring Bootをご利用の方は、現行リリース(2.1.7)が、脆弱性のある古いjackson-databind 2.9.9パッケージに依存している点にご注意ください。
この情報はすでにデータベースに反映済みで、jackson-databindパッケージのメンテナーは修正版を作成しています。Snykをご利用の場合、この脆弱性についてはすでに通知されています。jackson-databindパッケージのメンテナーチームは、脆弱性を含まない新バージョン(2.9.9.3)をすでにリリースしており、迅速な対応を行いました。Snykのスキャナーは修正案としてこのバージョンを提示するため、以後この脆弱性の影響を受けることはありません。
脆弱性について
jackson-databindパッケージが信頼できないデータのデシリアライズ脆弱性の影響を受けるのは、今回が初めてではありません。実際、2018年以降に知られ、公開された同種の脆弱性は十数件に上り、そのほぼすべてが深刻度の高い脆弱性とみなされています。
このライブラリの主な役割は、JavaオブジェクトをJSONにシリアライズし、その逆も行うことです。問題となるのは、JSONをJavaオブジェクトにデシリアライズする処理です。脆弱な実装のJavaアプリケーションが信頼できないソースからJSON文字列をデシリアライズできる場合、攻撃者はこれを利用してリモートコード実行を仕掛ける可能性があります。
Jacksonでポリモーフィック型指定が有効になっている場合、攻撃者はJSON入力を制御できると、ガジェットを使って攻撃を仕掛けることができます。ガジェットとは、脆弱なプロセス内にすでに存在する実行可能なコードを含むクラスや関数のことです。この既存の実行可能コードを悪用できます。
今回の脆弱性では、Jacksonのデフォルト型指定が有効な場合に、Ehcacheのガジェットが悪用される可能性がありました。jackson-databindのメンテナーは、既存のブラックリストに該当するガジェットを追加し、速やかに問題を解決しました。バージョン2.9.9.3がリリースされ、この脆弱性は修正されています。
Spring Boot
この記事の執筆時点で、Spring Bootの最新リリースは2.1.7です。このバージョンは、古いjackson-databind 2.9.9パッケージに依存しています。
つまり、Spring Boot Initialzrを使って新しいSpring Bootアプリケーションを作成すると、脆弱性のあるバージョンのjackson-databindが必ず含まれることになります。
Spring Bootまたはspring-boot-starter-data-restの新バージョンがリリースされるまでは、jackson-databindのバージョンを切り替えることができます。1つの方法は、以下のMavenの例のように個別のパッケージを除外することです。
「より良い方法は、Mavenのプロパティに適切なバージョンを設定することです。これによりSpring Bootは、Jacksonの個々の依存関係を管理する修正版のJackson BOM(Bill of Materials)をインポートします。Gradleプロジェクトでは、同様の設定をgradle.propertiesファイルで行えます。Maven BOMの詳細と、Spring Bootにおいて重要な理由については、ブログ記事「What’s a Bill Of Material BOM File」をご覧ください。」
jackson-databindのようなライブラリは、多くの場合、より大きなフレームワークの一部となる間接依存関係です。そのため、特にこうした間接依存関係に既知の脆弱性がないか、アプリケーションをスキャンすることが重要です。定期的にスキャンすれば、脆弱性の影響を受けているかを把握でき、適切な修正につなげることができます。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。
