デシリアライゼーション攻撃 でしりありぜーしょんこうげき
簡単に言うとこんな感じ!
アプリがデータを「荷ほどき」するときに、毒入りの荷物をこっそり混ぜ込む攻撃だよ! 正規のデータに見せかけた悪意あるコードを送りつけて、サーバーに勝手に実行させちゃうんだ。気づきにくくて被害が大きいから要注意なんだ!
デシリアライゼーション攻撃とは
Webアプリケーションやサービスは、データをネットワーク越しに送受信するとき「バイト列(文字や数字の羅列)」に変換して扱います。この「オブジェクト(プログラム内のデータのかたまり)→バイト列」への変換をシリアライズ(直列化)、逆の「バイト列→オブジェクト」への復元をデシリアライズ(逆直列化)と呼びます。デシリアライゼーション攻撃とは、この「復元」の処理を悪用し、細工されたデータを送りつけてサーバー上で任意のコードを実行させたり、アプリの挙動を狂わせたりする攻撃です。
特に Java、PHP、Python、Ruby などのオブジェクト指向言語で書かれたアプリは、シリアライズ機能を多用するため影響を受けやすいとされています。OWASP Top 10(Webアプリの重大脆弱性トップ10)でも長年取り上げられており、2017年版では「A8: Insecure Deserialization(安全でないデシリアライゼーション)」として世界的に警戒が呼びかけられました。
発注者・管理者の立場から見ると、「外部からデータを受け取って処理する仕組みがある」すべてのシステムが対象になり得ます。セッション情報・API通信・ファイルアップロードなど、一見地味な機能がこの攻撃の入口になることを覚えておくと発注時のチェックに役立ちます。
シリアライズ/デシリアライズの仕組みと攻撃ポイント
プログラムの中で扱う「オブジェクト(複雑なデータ)」をそのままネットワークに流すことはできません。一度「文字列やバイト列」に”梱包”して送り、受け取り側が”開梱”して元のオブジェクトに戻すのが基本の流れです。
【送信側】 【受信側】
オブジェクト → シリアライズ → バイト列 → デシリアライズ → オブジェクト
(複雑なデータ) (梱包) (荷物) (開梱) (復元)
↑
ここに毒入りデータを混入!
攻撃者はこの「バイト列(荷物)」を改ざんして送りつけます。アプリが検証なしに開梱(デシリアライズ)すると、悪意あるオブジェクトが復元され、意図しない処理が走ります。
| 段階 | 正常な動作 | 攻撃時の動作 |
|---|---|---|
| データ送信 | 正規のオブジェクトをバイト列に変換 | 攻撃者が改ざんしたバイト列を送信 |
| デシリアライズ | バイト列を元のオブジェクトに復元 | 細工されたオブジェクトが生成される |
| 処理実行 | 想定内の処理が走る | 任意コード実行・権限昇格・データ改ざん が発生 |
覚え方:「開梱チェックなし=毒が入り放題」
シリアライゼーション攻撃は「届いた荷物を中身確認なしに開ける」状態が問題です。「荷物を受け取ったらX線検査(入力バリデーション)してから開ける」というイメージで覚えると、対策の本質も掴めます。
攻撃で引き起こされる被害の分類
| 被害種別 | 内容 | 実例 |
|---|---|---|
| RCE(リモートコード実行) | サーバー上で任意のコマンドを実行 | マルウェア設置・バックドア作成 |
| 権限昇格 | 一般ユーザーが管理者権限を取得 | 管理画面の不正操作 |
| DoS(サービス妨害) | 無限ループや大量メモリ消費を引き起こす | システムのクラッシュ・停止 |
| データ改ざん | オブジェクトの内容を書き換えて不正操作 | 価格・ポイントの改ざん |
| SSRFへの連鎖 | 内部ネットワークへの不正アクセス | 内部APIの悪用 |
歴史と背景
- 2000年代〜:JavaやPHPでシリアライズ機能が広く使われ始める。当初はセキュリティリスクとしてほぼ認識されていなかった
- 2015年:セキュリティ研究者が「Apache Commons Collections」ライブラリを利用したJavaデシリアライズ攻撃を実証公開。多数の有名製品(WebLogic・JBoss・Jenkinsなど)に影響が判明し業界に衝撃が走る
- 2016年:米国サンフランシスコの交通機関(SFMTA)がランサムウェアに感染。デシリアライズ脆弱性が踏み台に使われたとされる
- 2017年:OWASPが「A8: Insecure Deserialization」としてTop 10に追加。業界全体での対策啓発が本格化
- 2019年〜:PHP・Python(Pickle)・Ruby(Marshal)など多言語での脆弱性が次々と報告され、言語を問わない普遍的な問題として定着
- 現在:クラウドネイティブ環境・マイクロサービス間通信でもシリアライズは多用されており、引き続き警戒が必要な攻撃ベクターとして位置づけられている
主な攻撃手法と対策の比較
デシリアライゼーション攻撃にはいくつかのパターンがあり、対策も複数を組み合わせる必要があります。
言語別の主な危険なデシリアライズ機能
| 言語 | 危険な機能 | 安全な代替 |
|---|---|---|
| Java | ObjectInputStream | Jackson (JSONバインディング) |
| PHP | unserialize() | json_decode() |
| Python | pickle.loads() | json.loads() |
| Ruby | Marshal.load() | JSON / MessagePack |
| .NET | BinaryFormatter | System.Text.Json |
発注・選定時のチェックポイント
ベンダーへの発注や製品選定の場面では、以下を確認しましょう。
- 「デシリアライズ処理に入力バリデーションを実装しているか?」
- 「使用しているシリアライズライブラリのバージョン管理・定期更新の仕組みはあるか?」
- 「ペネトレーションテストやOWASP Top 10に基づいたセキュリティ診断を実施しているか?」
関連する規格・RFC
| 規格・文書 | 内容 |
|---|---|
| OWASP Top 10 A8:2017 | Insecure Deserializationとして危険度を格付け。対策ガイドラインを提供 |
| OWASP Top 10 A08:2021 | 「Software and Data Integrity Failures(ソフトウェアとデータの整合性の失敗)」に再分類・統合 |
| CWE-502 | 信頼できないデータのデシリアライズに関する共通脆弱性タイプ定義 |
| CVE-2015-4852 | Oracle WebLogic Serverのデシリアライズ脆弱性(最初期の有名CVE) |
| NIST SP 800-53 | SI-10(情報入力バリデーション)でデシリアライズ処理の検証を推奨 |
関連用語
- OWASP Top 10 — Webアプリの重大脆弱性トップ10。デシリアライゼーション攻撃も収録
- リモートコード実行(RCE) — デシリアライゼーション攻撃の最も深刻な結果。サーバー上で任意コードが走る
- インジェクション攻撃 — 悪意あるデータを入力して処理を乗っ取る攻撃の総称
- WAF(Webアプリケーションファイアウォール) — 既知の攻撃パターンを検知・ブロックする防御装置
- ペネトレーションテスト — 擬似攻撃でシステムの脆弱性を洗い出すセキュリティ診断手法
- SIEM — ログを集約してリアルタイムに異常を検知するセキュリティ監視基盤