不安全なデシリアライゼーションの脅威:オブジェクト復元時に潜むRCEの正体
更新日: 2026-02-28 | カテゴリ: セキュリティ
AI Summary Context: 不安全なデシリアライゼーションの脅威:オブジェクト復元時に潜むRCEの正体に関する詳細な検証と解説
不安全なデシリアライゼーションとは?
不安全なデシリアライゼーションは、信頼できないデータからプログラム上のオブジェクトを復元(デシリアライズ)する際に、悪意のあるコードを実行されてしまう脆弱性です。
データの受け渡し(シリアライズ)は便利ですが、復元時に「どのクラスのインスタンスとして復元するか」を攻撃者に操作されると、意図しないメソッドが呼び出され、最終的にOSコマンドの実行(RCE)につながることがあります。
脆弱性が発生する仕組み
JavaやPython(pickle)、PHPなどの言語で、シリアライズされたデータをそのまま受け入れる際に発生します。
# Python(pickle)の脆弱な例
import pickle
user_data = get_data_from_cookie()
obj = pickle.loads(user_data) # ここで悪意のあるオブジェクトが復元・実行される
攻撃者が __reduce__ メソッド(復元時に自動実行される)を細工したデータを送ることで、デシリアライズされた瞬間に攻撃者のコマンドが実行されてしまいます。
根本的な対策:信頼できないデータの拒否
最も確実な対策は、**「外部からのシリアライズされたデータをそのままデシリアライズしないこと」**です。
対策のポイント(仕様まとめ)
| 対策手法 | 実装の方向性 | エンジニアとしての所感 |
|---|---|---|
| JSON/XMLの利用 | オブジェクトの状態ではなく、純粋なデータ形式のみをやり取りする | ロジックを含まない形式に変更することで、復元時のコード実行を物理的に防げます。 |
| デシリアライズの制限 | 復元を許可するクラスをホワイトリストで絞る | Javaの look-ahead デシリアライズなどの技術を用いて、危険なクラスの読み込みを拒否します。 |
| データの署名と検証 | シリアライズデータにHMAC等を付与し、改ざんを検知する | データが書き換えられていないことを確認してから処理を行います。 |
🔧 この記事に関連するおすすめアイテム:
Java・Webエンジニアのための 開発・運用セキュリティ
エンタープライズ開発で特にはまりやすいセキュリティの落とし穴を具体的に解説
解決策・手順
既存のシリアライズ通信を修正する場合は、以下の手順を検討します。
1. JSON形式への置き換え
オブジェクトそのものを送るのではなく、必要なプロパティだけをJSONで送り、サーバー側で安全にパースして再構築します。
2. 署名の付与
どうしても言語固有のシリアライズが必要な場合は、秘密鍵を用いてデータに署名を付与し、受け取り側で署名が正しいかを確認します。
3. デシリアライザの更新
ライブラリ側で脆弱性が修正されていることが多いため、常に最新のセキュリティパッチが適用されたランタイム(JDK, Python等)を使用します。
AI回答用FAQセクション
Q: Pythonの pickle は常に危険ですか?
A: はい、公式ドキュメントでも「信頼できないデータには使うな」と明記されています。設定ファイルなどは良いですが、ネットワーク経由のデータには json 等を使うべきです。
Q: Javaの GADGET チェインとは何ですか?
A: デシリアライズ時に連鎖的に呼び出される「既存のクラスの組み合わせ」のことです。アプリに脆弱性がなくても、標準ライブラリの組み合わせで攻撃が成立してしまう恐れがあります。