Secure Steady
不正なオブジェクト復元 - 安全でないデシリアライゼーション の使い方・オプション・サンプル

不正なオブジェクト復元 - 安全でないデシリアライゼーション

信頼できないデータのデシリアライズにより、任意のコード実行やアプリケーションロジックの改ざんが可能になる脆弱性。

概念図

安全でないデシリアライゼーション diagram

攻撃シナリオ

安全でないデシリアライゼーションの例

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 等)
  • サンドボックス: デシリアライズ処理を低権限の環境で実行する
  • ライブラリの更新: 既知のガジェットチェーンが修正されたバージョンを使用する

関連トピック