【入門編】Software and Data Integrity Failures: 安全なデシリアライゼーション – アプリケーションセキュリティ & 安全な開発防御ガイド

「玄関の鍵を開けたら、知らない泥棒が座っていた?」――安全なデシリアライゼーションの正体

こんにちは。セキュリティの世界へようこそ。
今日は、多くの開発者が一度は耳にするけれど、実は一番の「落とし穴」になりやすい「デシリアライゼーション(Deserialization)」というテーマについて、お話ししたいと思います。

難しい名前ですよね。でも、身近な例えで考えると、実はとってもシンプルで、かつ「絶対に無視しちゃいけない」恐ろしい罠が隠されているんです。

—

1. そもそも「デシリアライゼーション」って何?

想像してみてください。あなたは、遠く離れた友人に「お気に入りのプラモデル」を送りたいとします。

1. シリアライズ(直列化): プラモデルをバラバラにして、コンパクトに箱詰めすること。
2. デシリアライゼーション(復元): 届いた箱を開けて、元のプラモデルを組み立て直すこと。

プログラムの世界でも全く同じです。データをネットワーク越しに送るために「箱詰め(シリアライズ)」し、受け取った側で「組み立て(デシリアライゼーション)」て元のデータとして使います。

何が問題なの?

問題は、「誰が組み立ての作業をしているか」です。
もし、悪意ある泥棒が、箱の中に「プラモデルの部品」ではなく「爆弾」や「侵入ツール」を混ぜて送ってきたらどうなるでしょうか? 受け取った側は何も疑わずに、その「中身」をそのまま組み立ててしまいますよね。

これが、「安全でないデシリアライゼーション」の正体です。攻撃者は、信頼できないデータを送りつけることで、あなたのサーバー上で勝手にプログラムを実行(RCE: リモートコード実行)できてしまうのです。

—

2. なぜこれが「最強の攻撃」になり得るのか

攻撃者は、あなたのシステムが「組み立て」を行う際に、本来あるべきデータではない「命令文」を仕込みます。

例えば、Webアプリでユーザーのログイン情報を保存する際、シリアライズされたデータをクッキー(Cookie)としてブラウザに保存させることがあります。攻撃者はこのクッキーの中身を書き換えて、サーバーに「管理者権限を奪え」という命令を埋め込んで送り返すのです。

サーバー側が「これは信頼できるユーザーのデータだよね?」と疑わずに「組み立て(復元)」ボタンを押した瞬間、あなたのシステムは乗っ取られます。

—

3. どうやって防ぐのか? 一歩ずつ対策を学ぼう

「じゃあ、シリアライズなんて使わなきゃいいの?」と思うかもしれません。でも、現代のシステムでは避けて通れない場面もあります。そこで、以下の3つの防衛線を覚えておきましょう。

対策①:信頼できないデータは絶対に「そのまま」組み立てない

最も重要なのは、「外部から来たデータはすべて泥棒の贈り物」と考えることです。もし可能なら、シリアライズされたオブジェクトそのものを送るのではなく、JSONのような「ただの文字データ」として受け取り、必要な情報だけを抽出するようにしましょう。

対策②:デジタル署名で「中身の改ざん」を見抜く

「この箱は、確かに私が梱包しましたよ」という証明(署名)を付けます。
受け取った側は、その署名を確認します。もし中身が少しでも書き換えられていれば、署名の不一致ですぐに分かります。

(コード例:署名検証のイメージ)

import hmac
import hashlib

秘密鍵(これだけは誰にも教えないこと!)
SECRET_KEY = b’super-secret-key’

def is_data_valid(data, signature):
# 届いたデータから計算したハッシュ値と、署名を照らし合わせる
expected_signature = hmac.new(SECRET_KEY, data, hashlib.sha256).hexdigest()

# hmac.compare_digestは攻撃者が時間をかけて推測するのを防ぐ比較関数です
return hmac.compare_digest(expected_signature, signature)

これなら、泥棒が中身を書き換えても署名が合わずに弾けます!

対策③:シリアライズ形式を制限する

JavaのObjectInputStreamのように、あらゆるオブジェクトを復元できてしまうような強力な仕組みは、なるべく避けましょう。使うなら「このクラスのデータしか受け付けない」というホワイトリスト方式を採用してください。

—

4. 最後に:セキュリティは「疑うこと」から始まる

セキュリティエンジニアとして、多くの現場を見てきましたが、インシデントの多くは「自分たちの作っているデータは、自分たちしか触らないはず」という思い込みから発生します。

「自分の家の鍵を、誰が作っているか分からない合鍵屋さんに預けますか?」

答えはNoですよね。データも同じです。誰が触ったか分からないデータを受け取るときは、常に「これは本当に安全か? 誰が保証しているか?」を問いかけてみてください。

最初は難しく感じるかもしれませんが、こうした小さな疑念の積み重ねが、あなた自身と、あなたが作った素晴らしいサービスを守る最高の防具になります。

次回の記事では、この「署名」をもっと深掘りして、具体的な実装方法を解説しますね。一歩ずつ、強固なシステムを一緒に作っていきましょう!

コメント

タイトルとURLをコピーしました