【デシリアライゼーション編】復元されるデータを信頼しない設計|CTF思考フレームワーク #29

保存したデータを読み戻すだけで、どうしてコード実行まで起きるの?

形式によっては「どのオブジェクトを作り、何を呼び出すか」までデータに含められるから、信頼できない入力を復元すると危険なんだ。
シリアライズは、オブジェクトや状態を保存・送信できる形へ変換する処理です。デシリアライズはその復元です。
問題になるのは、外部から受け取ったデータを、危険なオブジェクト生成や副作用を伴う形式のまま復元してしまう場合です。
📚 CTF思考フレームワーク シリーズ
#29 【デシリアライゼーション編】復元されるデータを信頼しない設計 / 全86記事。全シリーズ記事はこちら。
難易度:中級〜上級 / 読了目安:10分 / 学習順:#29
- JSONの読み込みと危険なネイティブ復元処理を区別する
- 署名や暗号化だけで設計上の危険が消えるわけではないと理解する
- 安全なデータ形式と権限分離を考える
- シリアライズ:データを保存・通信しやすい形式へ変換する処理です。
- デシリアライズ:保存されたデータをプログラム上の値へ戻す処理です。
- ガジェット:復元時に意図しない動作へ利用される既存コードの組み合わせです。
🔍 観察フェーズ:まず何を見る?

最初から攻撃方法を探すのではなく、どの機能や設定が外から見えているかを整理するところから始めるよ。

いきなり試すんじゃなくて、まず「どこが入口になり得るか」を整理するんだね。
💡 仮説フェーズ:なぜ危険になり得る?

観察した内容から、被害につながる条件を仮説として並べるよ。
安全でない形式では、単なる値ではなく動作につながる構造を復元してしまう場合があります。
入力が署名されていても、署名鍵の管理不備や内部からの誤生成があれば危険は残ります。
高権限プロセスで処理すると、事故時の被害範囲が広がります。
🔬 検証フェーズ:安全に確かめる

検証の目的は、実在サービスを攻撃することではなく、自分のラボで仕組みと防御の効き方を理解することだよ。
学習では、危険な復元形式が存在することと、安全なデータ転送形式との違いを確認するに留めます。公開サービスへのペイロード送信やコード実行確認は行いません。

許可された環境で、結果だけじゃなく「なぜそうなったか」まで確認するんだね。
⚔️ 攻撃フェーズ:成立すると何が起きる?

ここでは実サービスへの手順ではなく、成立した場合の影響を押さえよう。
攻撃者にとって利用価値のある入口や情報が増え、次の侵害につながる可能性があります。
設定や権限の範囲によっては、情報漏えい・改ざん・業務停止などへ影響が広がります。
検知や記録が不足していると、侵害の発見や原因調査が遅れます。
🛡️ 防御フェーズ:守る側はどうするか

守りは「気をつける」では終わらせず、設定・実装・監視に落とし込もう。
外部入力には単純なデータ形式を用い、任意オブジェクトの復元を避ける
許可する型を限定し、不要なライブラリや危険な機能を減らす
処理プロセスを最小権限で動かし、異常な復元エラーを監視する
🤝 大事なお約束
この記事で扱う確認・検証は、自分の環境、CTF、または明示的に許可された演習環境だけで行ってください。他人のサービスや端末に無断で試す行為は、不正アクセス等に該当するおそれがあります。学んだ知識は守る側で活用しましょう。
📝 まとめ
デシリアライゼーション対策は、危険な入力をうまく弾くより、そもそも信頼できないデータから任意オブジェクトを復元しない設計にすることが基本です。
