デシリアライゼーションとは?バイトからデータを再構築する仕組みを解説
デシリアライゼーションはシリアライゼーションの逆操作であり、ディスクやネットワークから読み取ったバイトストリームからメモリ上のデータ構造を再構築します。
デシリアライゼーションは、プログラムがデータを取り戻す方法です。フラットなバイトストリーム - JSONファイル、cacheされたblob、ネットワークのpayload - を読み取り、それが表す構造化オブジェクトを再構築します。地味に思えますが、信頼できない入力をデシリアライズすることはソフトウェアの中でも特に危険な操作の一つであり、外部データを処理するCIにとって現実的な懸念事項です。
デシリアライゼーションとは何か
デシリアライゼーションは、シリアライズされたバイトストリームを解析し、元のメモリ上の構造 - オブジェクト、リスト、レコード - を再構築します。シリアライゼーションの逆であり、互換性のあるフォーマット、そして多くの場合は互換性のあるスキーマを使う必要があります。そうでなければ失敗するか、誤った値を生み出します。
なぜ信頼できない入力は危険なのか
一部のデシリアライザは、オブジェクトを再構築する過程で任意の型をインスタンス化したりコードを実行したりできます。そうしたデシリアライザに攻撃者が操作したバイトを与えると、リモートコード実行につながりかねません。この「安全でないデシリアライゼーション」はよく知られた脆弱性の一種であり、特に型情報を埋め込むフォーマットで顕著です。
安全なデシリアライゼーションの実践
対策は、JSONのようなデータのみのシンプルなフォーマットを優先すること、信頼する前にスキーマに対して入力を検証すること、そして信頼できないソースから任意のオブジェクトを構築できるデシリアライザを避けることです。信頼境界を越えるデータは、検証されるまで敵対的なものとして扱いましょう。
CIにおけるデシリアライゼーション
CIのpipelineは多くの外部データをデシリアライズします。webhookのpayload、サードパーティのAPIレスポンス、ダウンロードしたartifactなどです。信頼できないpayloadを解析するpipelineのステップはそれを検証すべきであり、CIのセキュリティスキャナはコード中の安全でないデシリアライゼーションのパターンを特に指摘します。
# Scan for unsafe deserialization in CI
steps:
- uses: actions/checkout@v4
- run: semgrep --config p/insecure-deserialization .なぜpipelineで重要なのか
CIのrunnerはしばしば広範なアクセス権 - 秘密情報、クラウド認証情報、リポジトリへの - を持ちます。そこで信頼できない入力をデシリアライズするのが危険なのは、まさに影響範囲が大きいからです。payloadを検証し、安全でないパターンをスキャンすることで、pipelineが攻撃経路になるのを防げます。
重要なポイント
- デシリアライゼーションは、シリアライズされたバイトストリームからメモリ上のデータを再構築する。シリアライゼーションの逆である。
- 信頼できない入力のデシリアライズはコードを実行しうるため、深刻な脆弱性の一種である。
- CIはwebhookやAPIレスポンスをデシリアライズする - それらを検証し、危険なパターンをスキャンすること。