何が起きるか

安全でないデシリアライズは、外部から受け取ったファイルなどをオブジェクトへ復元する処理で、入力の指定した関数呼び出しまで実行してしまう問題です。

説明用に、モデルのロード機能が、攻撃者の配布したファイルをサーバーへ保存し、関数の呼び出し方まで表せる復元形式として読み込む場合を考えます。ファイル内に指定された関数名と引数に従って復元器が処理を実行すると、モデルを使う前の読み込み段階で攻撃者の処理がサーバー上で動きます。 復元形式には、値だけでなく元のクラスや再構築用の関数と引数を記録するものがあります。たとえば座標オブジェクトを保存したファイルから、型と二つの数値を使って同じ座標オブジェクトを作り直すのが正常な目的です。復元器がその指定を入力任せにして関数を呼べば、必要な型の生成以外の処理も起動され得ます。

その処理がアプリのOSユーザーの権限で設定ファイルを読み、外部サーバーへ内容を送れるなら、攻撃者は設定内の秘密情報を取得できます。危険な処理を呼べる形式とロード設定、ファイルの読み取り権限、結果を取得する経路が必要です。JSONの値を解析するだけの処理まで、同じ任意コード実行と扱うものではありません。

正常ならどう動くか

設定アップロードでは、アプリが必要な文字列・数値・配列だけを読み取り、項目名・型・範囲・容量をスキーマで検査してから使います。入力のデータで任意のクラスや関数を選ばせず、アプリ側が実行する処理を決めます。

モデルファイルやセッションデータを復元する場合も、誰が内容を作ったか、保存後に変更できるかを確認します。サーバーへ保存されたファイルでも、内容を利用者が作れるなら、アプリ内部でだけ使う高機能なオブジェクト復元器をそのまま適用する根拠にはなりません。

不備と攻撃が成立する流れ

攻撃者が復元時の関数呼び出しなどを指定したファイルを作り、アップロードやモデル配布の経路からアプリへ渡します。アプリがファイルを保存した後、ロード機能がその内容を汎用のオブジェクト復元APIへ渡します。復元器がファイル内の指定に従って関数を呼ぶと、モデルを使い始める前の読み込み段階で、攻撃者の処理が実行されます。

直接コードを書けない形式でも、アプリ内にあるクラスと復元時の処理を組み合わせて、危険な関数へ到達する場合があります。使う形式、ロード設定、存在するクラスによって成立条件が異なるため、ファイル名を指定できるだけで任意コード実行と判断してはいけません。 架空の構成で説明すると、復元時に自分のhandler.run()を呼ぶPreviewクラスと、run()でファイルを読むReaderクラスがアプリ内にある場合です。攻撃者が保存データ内のクラス名とhandler、ファイルパスを選び、PreviewのhandlerをReaderへ対応付けられると、復元時の自動呼び出しから既存の読取処理へ進みます。攻撃者が新しい関数のコードを送る方法とは異なり、実在するクラスと復元時の動作が条件です。

起こり得る被害と条件

コード実行の例では、復元時に動いた処理がアプリの設定ファイルを読み、その内容を攻撃者のサーバーへ送ります。アプリのOSユーザーが設定を読め、外部送信もできれば、攻撃者は設定内の秘密情報を入手できます。

状態改変の別の例では、サイトが利用者IDや管理者フラグを含むセッションオブジェクトを直列化し、Cookieへ入れてブラウザに保存させる構成を仮定します。署名などで完全性を確認せず復元し、管理者フラグを認可に採用する実装なら、攻撃者は自分のCookie内のフラグを変えて送信し、管理者として扱わせるおそれがあります。モデルのアップロードとは別の経路で、復元時の任意コード実行とも条件が異なります。

防ぎ方と、防げる理由

外部から受け取る設定は、JSONなど必要な値だけを表せる形式にし、復元後の項目・型・容量をスキーマで検証します。汎用のクラスや関数をデータから選べないようにするためです。高機能なモデル形式が必要なら、配布元と完全性をロード前に確認し、実際のロード設定も点検します。秘密を渡さずホストのファイルを共有しない隔離環境は、読み込み時に問題が起きた場合の被害を減らします。

よくある誤解

拡張子.pthや.modelも、ファイルが存在することも、内容の安全性を証明しません。署名があっても、信頼できる発行者の正しい対象を検証している必要があります。またJSONを読むだけで任意クラスが復元されるわけではありません。

実装の確認点

pickle、torch.load、任意型の復元APIを探し、誰が作るファイルのどの内容を読み込むか確認します。保存処理とロード処理が別でも、配布・アップロードから実際の復元までを追います。復元時に呼べる処理と、復元した値を認可やパス指定へ使う箇所を分けて確認します。

出典・確認範囲

  1. [1] Web Security Academy: 安全でないデシリアライズPortSwigger / 確認日 2026-10-29