30秒で判断
対応すべき人
- jackson-databind 2.10.0〜2.18.7、2.21.0〜2.21.3、3.0.0〜3.1.3を使用している
- かつ、ポリモーフィック型デシリアライゼーションが有効な環境(
@JsonTypeInfo、enableDefaultTyping()、activateDefaultTyping()等) - かつ、
PolymorphicTypeValidator(PTV)による許可リスト制御を実施している
対応不要な人
- jackson-databindを使用していない
- ポリモーフィック型デシリアライゼーションを使用していない
- すでに修正版(2.18.8 / 2.21.4 / 3.1.4以降)を使用している
- 外部から制御されたJSONを受け付けない完全に信頼された入力のみを処理している
確認コマンド
# Mavenプロジェクト
mvn dependency:tree | grep jackson-databind
# Gradleプロジェクト
./gradlew dependencies | grep jackson-databind
概要
jackson-databindのPolymorphicTypeValidator(PTV)において、ジェネリクス型パラメータを含む型IDの検証が不完全です。
型ID文字列に<が含まれる場合(例:java.util.ArrayList<com.example.Target>)、DatabindContext._resolveAndValidateGeneric()はコンテナクラス名(<の前の部分)のみをPTVで検証します。コンテナ型が承認されると、ジェネリクス型引数(<>内の型)を検証なしにTypeFactory.constructFromCanonical()で解決・インスタンス化します。
攻撃シナリオの例: java.util.ArrayListが許可リストに含まれている場合、java.util.ArrayList<com.evil.Gadget>という型IDを送信することで、com.evil.Gadgetが許可リストにない場合でもClass.forName()でロード・インスタンス化されます。
CVSSベクトル
| 項目 | 値 |
|---|---|
| Attack Vector | Network |
| Attack Complexity | High |
| Privileges Required | None |
| User Interaction | None |
| Scope | Unchanged |
| Confidentiality | High |
| Integrity | High |
| Availability | High |
| CVSSスコア | 8.1 (High) |
影響を受けるソフトウェア
| 製品 | 影響バージョン | 修正バージョン |
|---|---|---|
| jackson-databind | 2.10.0〜2.18.7 | 2.18.8 |
| jackson-databind | 2.21.0〜2.21.3 | 2.21.4 |
| jackson-databind | 3.0.0〜3.1.3 | 3.1.4 |
修正バージョンと回避策
修正版へのアップグレード:
<!-- Maven: pom.xml -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.8</version>
</dependency>
// Gradle: build.gradle
implementation 'com.fasterxml.jackson.core:jackson-databind:2.18.8'
注意: Spring Boot等のフレームワークを使用している場合、親POM/BOMで管理されるjackson-databindバージョンがあります。フレームワークのアップグレードによって解決できる場合があります。
暫定的な回避策:
- 外部から制御されたJSONでのポリモーフィック型デシリアライゼーションを無効化する
- 信頼されていない入力を処理するエンドポイントでジェネリクス型を含む型IDを拒否するカスタムバリデーションを追加する
関連リンク
データソース: NVD (NIST), GitHub Advisory Database
AI解説は Claude API により自動生成されています。正確性については原文をご確認ください。
