safetensors・GGUF・pickleは何が違う?モデルファイルの安全性を確認する

目次
モデルファイルを取得するとき、「.safetensorsなら安全」「.ggufなら安全」「.binなら危険」と拡張子だけで決めるのは不十分だ。
ファイル形式そのものの性質と、配布元、それを読み込むソフト、追加コードや拡張機能の安全性は別だからだ。
形式の違いを理解したうえで、実際に何をどこから取得し、何で読み込むのかまで確認する。
pickleは読み込み時のコード実行リスクを意識する
PyTorchのtorch.loadの公式資料では、信頼できない配布元のデータを読み込まないよう警告している。
pickleはPythonのオブジェクトを復元できる柔軟な仕組みだが、その性質から、信頼できないデータの読み込みが任意コード実行につながる危険がある。
知らない配布元から取得したチェックポイントを、「モデルの重みだから単なる数値データだろう」と考えてそのまま読み込まない。
PyTorchにはweights_onlyなど読み込み範囲を制限する仕組みもあるが、それは配布元の確認を不要にするものではない。
safetensorsはテンソル保存時の危険を小さくすることを目的とする
Hugging Faceはsafetensorsを、pickleと比べてテンソルを安全に保存することを目的とした形式として案内している。
この違いは重要だが、.safetensorsというファイルが含まれているだけで、そのリポジトリ全体や実行手順まで安全になるわけではない。
モデルを使うために、別途次のようなものを導入する場合がある。
- 独自のPythonコード
- ComfyUIのカスタムノード
- 拡張機能・プラグイン
- インストール用スクリプト
- 外部からコードを取得するモデル読み込み処理
重みファイルがsafetensorsでも、これらは別の確認対象になる。
GGUFはメタデータとテンソルを格納するモデル形式
ggmlの公式GGUF仕様では、GGUFをGGML系で推論へ使うバイナリ形式として扱い、メタデータとテンソルデータを格納する構造が定義されている。
ここから分かるのは形式の構造であり、「どこから取得したGGUFでも安全」ということではない。
GGUFを読み込むllama.cppなどの実行環境、配布リポジトリ、変換に使われたソフト、周辺スクリプトも別に確認する。
形式以外に4点確認する
1. 配布元
誰が配布しているかを見る。モデル提供元の公式リポジトリなのか、第三者が変換した配布物なのかを分ける。
2. リビジョン
同じモデル名でもファイルは更新される。コミットやリビジョンを確認できる場合は記録する。
3. チェックサムや署名
配布元が信頼できるチェックサムや署名を提供している場合は一致を確認する。
チェックサムは「参照したファイルと同じか」を確認するものであり、参照値の配布元自体が信頼できるかも重要だ。
4. 読み込みソフトと追加コード
ファイルだけでなく、何がそれを読み込むのかを見る。
trust_remote_code、カスタムノード、インストール用スクリプトなどが必要なら、重みファイルの形式とは別にコードとして確認する。
「安全な形式」を環境全体の安全保証にしない
確認順は次のように分けると整理しやすい。
配布元
↓
リビジョン・ファイルの同一性
↓
ファイル形式
↓
読み込みソフト・実行環境
↓
追加コード・拡張機能
↓
ネットワーク・ファイルアクセス権限
safetensorsやGGUFを選ぶことは確認項目の一つであり、配布元や周辺コードの確認を省略する理由にはならない。
ローカルAI全体でデータがどこを通るか確認したい場合は、ローカルAIは本当に安全?データの流れから確認する方法へ進める。MCPへファイル権限を与える場合は、MCPへファイル操作を許可する前のフォルダー設計も確認できる。
まとめ
- safetensorsはpickleより安全にテンソルを保存することを目的とする形式だが、周辺コードまで含む安全保証ではない
- pickleを読み込む処理には任意コード実行の危険があるため、信頼できない配布元のファイルを読み込まない
- GGUFはメタデータとテンソルを格納するモデル用形式であり、読み込むソフトや配布元の安全性は別に確認する
- 形式名だけで判断せず、配布元、リビジョン、チェックサム、追加コード、読み込みソフトを一緒に確認する