Skip to main content

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の例のように個別のパッケージを除外することです。

<dependencies>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-rest</artifactId>
       <exclusions>
           <exclusion>
               <groupId>com.fasterxml.jackson.core</groupId>
               <artifactId>jackson-databind</artifactId>
           </exclusion>
       </exclusions>
   </dependency>
   <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
       <version>2.9.9.3</version>
   </dependency>
…
</dependencies>

「より良い方法は、Mavenのプロパティに適切なバージョンを設定することです。これによりSpring Bootは、Jacksonの個々の依存関係を管理する修正版のJackson BOM(Bill of Materials)をインポートします。Gradleプロジェクトでは、同様の設定をgradle.propertiesファイルで行えます。Maven BOMの詳細と、Spring Bootにおいて重要な理由については、ブログ記事「What’s a Bill Of Material BOM File」をご覧ください。」

<properties>
    <jackson.version>2.9.9.20190807</jackson.version>
</properties>

jackson-databindのようなライブラリは、多くの場合、より大きなフレームワークの一部となる間接依存関係です。そのため、特にこうした間接依存関係に既知の脆弱性がないか、アプリケーションをスキャンすることが重要です。定期的にスキャンすれば、脆弱性の影響を受けているかを把握でき、適切な修正につなげることができます。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。