【2026年】Jacksonの重大脆弱性CVE-2026-110879とは?Spring Bootへの影響と対策
2026年10月20日、JavaのJSON処理ライブラリ「Jackson Databind」に重大な脆弱性が公開されました。
今回の脆弱性は CVE-2026-110879 です。
深刻度はCritical、CVSSスコアは9.8と評価されています。
Jacksonは、Spring Bootを利用するWebアプリケーションでも広く使われているライブラリです。
そのため、JavaでAPIを開発しているエンジニアにとって、確認しておきたい脆弱性といえます。
本記事では、以下の内容を解説します。
- Jacksonとは何か
- CVE-2026-110879の仕組み
- Spring BootのAPIへの影響
- 影響を受けるバージョン
- Gradleでの確認・アップデート方法
- 安全なJSON処理の実装方法
※本記事は2026年11月1日時点の公式情報に基づいています。
Jacksonとは?
Jacksonは、JavaオブジェクトとJSONを相互変換するためのライブラリです。
例えば、次のようなJavaクラスがあるとします。
public record User(
Long id,
String name
) {}
このJavaオブジェクトは、Jacksonによって次のJSONに変換できます。
{
"id": 1,
"name": "Taro"
}
反対に、JSONを受け取ってJavaオブジェクトへ変換することもできます。
この処理をそれぞれ次のように呼びます。
| 処理 | 説明 |
|---|---|
| シリアライズ | Javaオブジェクト → JSON |
| デシリアライズ | JSON → Javaオブジェクト |
Spring BootでREST APIを開発する場合、@RequestBodyでリクエストのJSONをJavaオブジェクトに変換することがあります。
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public String create(
@RequestBody User user) {
return user.name();
}
}
このような処理の裏側で、Jacksonが利用される構成があります。
今回の脆弱性は、主にこのデシリアライズ処理の特定の機能に関係しています。
CVE-2026-110879とは?
今回の問題は、Jackson DatabindのPolymorphicTypeValidatorによる型の検証を回避できる脆弱性です。
少し難しい名前ですが、順番に見ていきましょう。
PolymorphicTypeValidatorとは?
Javaでは、インターフェースや継承を利用して、複数のクラスを共通の型として扱えます。
例えば、通知機能を考えてみます。
public interface Notification {
}
このインターフェースを実装するクラスが複数存在するとします。
public record EmailNotification(
String address
) implements Notification {}
public record PushNotification(
String deviceId
) implements Notification {}
JSONからJavaオブジェクトを作成するとき、Jacksonはどちらのクラスを生成するべきか判断する必要があります。
Jacksonには、JSONの情報を使って生成するクラスを選択する「ポリモーフィックデシリアライズ」という機能があります。
その際に、生成してよいクラスを検証する仕組みがPolymorphicTypeValidatorです。
通常、想定外の型が指定された場合には、その型の生成を拒否することが期待されます。
今回は何が問題だったのか?
CVE-2026-110879では、クラス名を利用した型情報の処理に問題がありました。
簡単に説明すると、外側のクラスの検証に成功すると、内側に指定された別の型について、検証を回避できる場合があったという問題です。
例えば、Javaには次のようなジェネリック型があります。
Map<String, String>
これは、キーと値がどちらも文字列であるMapです。
本来であれば、型の整合性やセキュリティ上の制約を確認したうえでオブジェクトを生成する必要があります。
しかし、特定のポリモーフィックデシリアライズ設定では、外側のMapなどが許可されると、型引数に含まれる意図しないクラスが受け入れられてしまう可能性がありました。
JSONを受信
↓
型情報を解析
↓
外側のクラスを検証
↓
内側の型の検証が不十分
↓
想定外のJavaクラスを生成する可能性
さらに、配列の要素型についても検証を回避できる問題がありました。
このような問題を悪用すると、アプリケーションが想定していないJavaクラスが生成されるおそれがあります。
どんな被害が発生するのか?
Jacksonの公式セキュリティ情報では、条件が揃った環境で以下のような影響が示されています。
- 意図しないJavaクラスの生成
- ファイルの作成・破損
- 外部URLへのアクセス
- 任意コード実行(RCE)
特にRCEは、サーバー上で不正な処理を実行される可能性があるため、影響が重大です。
ただし、Jacksonを使用しているだけで必ずRCEが成立するわけではありません。
実際の攻撃には、ポリモーフィックデシリアライズの設定、外部から操作できるJSON、利用可能なJavaクラスなどの条件が関係します。
Spring Bootにも影響する?
Spring Bootでも、条件に該当すれば影響を受ける可能性があります。
例えば、次のような構成です。
[React / Next.js]
↓
JSONリクエスト
↓
[Spring Boot API]
↓
Jackson Databind
↓
Javaオブジェクト
↓
業務処理・DB更新
一般的なSpring BootのWeb APIでは、JSONをDTOへ変換する処理がよく利用されます。
ただし、今回の脆弱性は、すべてのJSON変換で成立するものではありません。
特に確認したいのは、次のような機能を使用している場合です。
① @JsonTypeInfoを使用している
Jacksonでは、@JsonTypeInfoによって、JSONに型情報を含めることができます。
例えば、以下のような設定です。
@JsonTypeInfo(
use = JsonTypeInfo.Id.CLASS
)
public interface Notification {
}
Id.CLASSは、Javaのクラス名を型識別に使用する指定です。
このように、JSONから具体的なクラスを選択する構成では、今回の脆弱性との関係を確認する必要があります。
特にJackson 3.xでは、アプリケーション側で独自のPolymorphicTypeValidatorを実装していなくても、影響する経路が公式に報告されています。
② Default Typingを有効にしている
Jacksonには、型情報をJSONに含めて復元するDefault Typingという機能があります。
次のようなAPIを利用している場合は、設定内容を確認しましょう。
activateDefaultTyping(...)
なお、この機能を利用していることだけで、脆弱性の悪用が成立すると判断するものではありません。
どの型を許可しているか、どこからJSONを受け取るかが重要です。
③ RedisなどにJavaオブジェクトを保存している
今回の公式アドバイザリでは、Spring Data RedisのJSONシリアライザについても影響する経路が示されています。
例えば、JavaオブジェクトをJSONとしてRedisに保存し、後から復元する構成です。
Spring Boot
↓
JavaオブジェクトをJSON化
↓
Redisへ保存
↓
JSONを取得
↓
Javaオブジェクトへ復元
このような処理でクラス名による型復元が利用されている場合、確認が必要です。
特に、攻撃者がキャッシュやセッションに保存される値を操作できる構成では注意が必要です。
影響を受けるバージョン
公式セキュリティアドバイザリで公表された対象バージョンは以下のとおりです。
| Jackson | 影響バージョン | 修正版 |
|---|---|---|
| 2.x | 2.10.0〜2.18.11 | 2.18.12 |
| 2.x | 2.19.0〜2.21.7 | 2.21.8 |
| 2.x | 2.22.0〜2.22.3 | 2.22.4 |
| 3.x | 3.0.0〜3.1.7 | 3.1.8 |
| 3.x | 3.2.0〜3.2.3 | 3.2.4 |
Jackson 2.xとJackson 3.xでは、MavenのgroupIdが異なります。
Jackson 2.x
com.fasterxml.jackson.core:jackson-databind
Jackson 3.x
tools.jackson.core:jackson-databind
バージョンを確認するときには、この違いにも注意してください。
Spring Boot 4.1.2でも対策が必要?
2026年11月1日時点のSpring Boot公式ドキュメントでは、Spring Boot 4.1.2が管理するJacksonのバージョンは以下となっています。
| ライブラリ | 管理バージョン |
|---|---|
| Jackson 3 Databind | 3.1.7 |
| Jackson 2 Databind | 2.21.7 |
どちらも今回公表された影響バージョンの範囲内です。
つまり、Spring Boot本体を4.1.2にアップデートしただけでは、Jacksonの脆弱性が解消されない構成があります。
ただし、Spring Boot 4.1.2のアプリケーションがすべて攻撃可能という意味ではありません。
まずは実際に読み込まれているJacksonのバージョンと設定を確認しましょう。
GradleでJacksonのバージョンを確認する
Spring BootをGradleで開発している場合、次のコマンドで依存関係を確認できます。
① Jackson 3.xを確認
./gradlew dependencyInsight \
--dependency tools.jackson.core:jackson-databind \
--configuration runtimeClasspath
② Jackson 2.xを確認
./gradlew dependencyInsight \
--dependency com.fasterxml.jackson.core:jackson-databind \
--configuration runtimeClasspath
Windowsのコマンドプロンプトなら、./gradlewではなくgradlew.batを利用できます。
確認したいのは、実際に解決されたバージョンです。
例えば、Jackson 3.1.7が使用されている場合、今回の修正版3.1.8より前のバージョンとなります。
また、直接Jacksonを依存関係に追加していなくても、Spring BootのStarterなどから間接的に読み込まれている場合があります。
Gradleでのアップデート方法
Spring Bootでは、依存ライブラリのバージョンがBOMによって管理されることがあります。
そのため、Jacksonだけを個別に変更するのではなく、関連ライブラリのバージョンも揃えることが重要です。
方法① dependency-managementプラグインを使用している場合
Spring Boot 4.xでio.spring.dependency-managementを使用している場合、Groovy形式のbuild.gradleに以下を設定する方法があります。
ext['jackson-bom.version'] = '3.1.8'
Jackson 2.xも使用している場合には、必要に応じて以下も指定します。
ext['jackson-2-bom.version'] = '2.21.8'
これはSpring Boot 4.xの管理プロパティを利用する方法です。
Spring Boot 3.xではプロパティ名が異なるため、利用しているバージョンの公式ドキュメントを確認してください。
方法② Gradle標準のBOM管理を使用している場合
Gradleのplatform()を使用して依存関係を管理している場合、Jackson 3.xの修正版BOMを指定できます。
dependencies {
implementation platform(
'tools.jackson:jackson-bom:3.1.8'
)
}
ただし、他のBOMや依存関係でバージョンが強制されている場合は、期待したバージョンにならないことがあります。
設定を変更したら、必ずdependencyInsightで確認してください。
アップデート後に確認したいこと
アップデート後は、以下を確認しましょう。
jackson-databindが修正版になっているか- Jackson Coreなど関連ライブラリの整合性が取れているか
- APIのJSON変換が正常に動作するか
- ポリモーフィックデシリアライズの許可・拒否が想定どおりか
- Redisなどのシリアライズ処理に問題がないか
特に、今回の修正によって、それまで許可されていた型情報が拒否される場合があります。
既存のJSONやキャッシュデータを復元する処理についても、テストしておきましょう。
安全なJSON処理を実装するには?
今回の脆弱性から学べるのは、外部から受け取ったJSONに、自由にJavaのクラスを指定させないことが重要という点です。
例えば、通知タイプによって処理を切り替えるAPIを考えます。
JSONにJavaのクラス名を指定させる代わりに、業務上の種別名を指定させる方法があります。
{
"type": "email",
"address": "user@example.com"
}
Java側では、次のように許可する型を明示できます。
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
property = "type"
)
@JsonSubTypes({
@JsonSubTypes.Type(
value = EmailNotification.class,
name = "email"
),
@JsonSubTypes.Type(
value = PushNotification.class,
name = "push"
)
})
public interface Notification {
}
この方法では、JSONで指定されたemailやpushという値を使って、事前に定義されたクラスを選択できます。
Javaの任意のクラス名を直接指定させる方式とは異なります。
ただし、これだけでアプリケーションのセキュリティが完全に保証されるわけではありません。
入力値の検証、認証・認可、利用しているライブラリのアップデートなども必要です。
自分のプロジェクトで確認したいポイント
今回の脆弱性について、Spring Bootのプロジェクトでは次のような確認をおすすめします。
① Jacksonのバージョンを確認する
まず、実際に使用されているjackson-databindのバージョンを調べます。
② 型情報の設定を確認する
ソースコード内で以下のキーワードを検索してみましょう。
@JsonTypeInfo
Id.CLASS
Id.MINIMAL_CLASS
activateDefaultTyping
GenericJackson2JsonRedisSerializer
③ 外部入力の処理経路を確認する
外部から受け取ったJSONが、どの型にデシリアライズされるかを確認します。
④ 修正版へアップデートする
影響を受けるバージョンを利用している場合は、適切な修正版への更新を検討します。
アップデートまでの暫定対策として、公式では信頼できないデータに対するクラス名ベースのポリモーフィックデシリアライズの無効化や、許可する型の限定などを案内しています。
よくある質問
Q. Spring Bootで@RequestBodyを使用しているだけで危険ですか?
それだけで今回の攻撃が成立するわけではありません。
主な問題は、クラス名によるポリモーフィックデシリアライズでの型検証にあります。
ただし、フレームワークや外部ライブラリが内部で使用する設定もあるため、自作コードだけで判断せず依存関係を確認しましょう。
Q. JacksonのObjectMapperを使用していれば影響しますか?
通常のJSON変換だけで必ず影響するわけではありません。
型情報の扱い方やDefault Typingの設定が重要です。
また、Jackson 3ではJsonMapperを使用する構成があり、公式アドバイザリでは既定のJsonMapperでも特定の注釈設定で影響する経路が示されています。
Q. バージョンアップだけで問題は解決しますか?
今回のCVEに対する修正は指定されたバージョンに含まれています。
ただし、Jackson以外の依存ライブラリにも脆弱性が存在する可能性があります。
アプリケーション全体の依存関係を継続的に確認することが重要です。
まとめ
2026年10月に公開されたCVE-2026-110879は、Jackson Databindのポリモーフィックデシリアライズにおける型検証回避の脆弱性です。
今回、特に覚えておきたいポイントは以下のとおりです。
- 深刻度はCritical、CVSS 9.8
- 特定条件で想定外のJavaクラスを生成できる可能性がある
- Spring Bootで利用するJacksonにも影響するバージョンが存在する
- Jackson 2.x・3.xの両方で修正版が公開されている
- Gradleの
dependencyInsightで実際の依存バージョンを確認できる
Spring BootでAPIを開発していると、Jacksonの存在を意識する機会はそれほど多くないかもしれません。
しかし、普段何気なく使っているJSON変換も、アプリケーションのセキュリティに直結する重要な処理です。
まずは、自分のプロジェクトで使用しているJacksonのバージョンを確認してみましょう。
また、Webアプリケーションのセキュリティを考えるうえでは、JSON処理だけでなく、HTTPサーバーやJavaScriptの実行環境についても注意が必要です。
関連する脆弱性は、以下の記事でも解説しています。
参考情報
- FasterXML公式:CVE-2026-110879 / GHSA-m8xf-2cr7-77ph
- Spring Boot公式:管理される依存ライブラリのバージョン
- Spring Boot公式:Gradleでの依存関係管理
- Gradle公式:BOMとPlatformによる依存関係管理
是非フォローしてください
最新の情報をお伝えします
