不正なオブジェクト復元 - 安全でないデシリアライゼーション
信頼できないデータのデシリアライズにより、任意のコード実行やアプリケーションロジックの改ざんが可能になる脆弱性。
概念図
攻撃シナリオ
安全でないデシリアライゼーションの例
bash
# Python - 危険なコード
import pickle
data = pickle.loads(user_provided_bytes) # 任意コード実行の可能性
# Java - 危険なコード
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject(); // 任意コード実行の可能性JSON を使った安全なデータ交換
bash
# 安全な代替
import json
data = json.loads(user_provided_string) # JSON は構造データのみデシリアライゼーション攻撃の仕組み
シリアライゼーションはオブジェクトをバイト列に変換する処理、デシリアライゼーションはその逆変換です。
信頼できないデータをデシリアライズすると、以下の攻撃が可能になります。
- リモートコード実行(RCE): 悪意あるオブジェクトがデシリアライズ時にコードを実行する。Java の
ObjectInputStream、Python のpickle、PHP のunserialize()が対象 - 権限昇格: シリアライズされたユーザーオブジェクトの
roleフィールドをadminに書き換えるなど - DoS 攻撃: 巨大なオブジェクトグラフや循環参照を含むデータでメモリを枯渇させる
OWASP Top 10 2017 では A8 に、2021 では A08(Software and Data Integrity Failures)に分類されています。
対策
- デシリアライゼーションを使わない: 可能な限り JSON や Protocol Buffers などの安全なデータフォーマットを使用する
- 入力の検証: デシリアライズ前にデジタル署名やハッシュでデータの完全性を検証する
- ホワイトリスト方式: デシリアライズ可能なクラスを明示的に制限する(Java の
ObjectInputFilter等) - サンドボックス: デシリアライズ処理を低権限の環境で実行する
- ライブラリの更新: 既知のガジェットチェーンが修正されたバージョンを使用する
