3行でいうと

  • 古い形式のpickleは、開いた瞬間にプログラムが動く仕組みを持ちます。safetensorsはそれを避ける形式です。
  • Hugging Faceの自動検査は補助です。公式の文書が「完全ではない」と書いています。
  • 「ゲート付き」は申請制の公開です。ライセンス(使ってよい範囲)とは別の話です。
  • スクリプトに渡すアクセストークンは、用途ごとに分け、できれば範囲を絞ります。

この記事は、実際に使って確かめた記録ではありません。この記事は公式の文書や論文を読んでまとめたものです。法律や契約の判断が必要な場面では、条文・公式資料の紹介にとどまります。個別の判断は専門家に相談してください。

先に結論

見立てです。ローカルで動かすモデルを入れるときの順番は、次の4つで足りると考えています。

  1. 配布元が、そのモデルを作った組織本人かを確かめる。
  2. ファイル形式は、.safetensorsまたはGGUFを選ぶ。.bin、.pt、.pklは避ける。
  3. ライセンスと、申請の条件を読む。
  4. 「リモートコードを信頼する」という設定は、使わない。

3つ目までは、ダウンロードの前に1分でできます。以下、それぞれの理由を公式文書で確かめます。

前提:何が危ないのか

モデルの本体は、数字の巨大な表(重み)です。これをファイルに保存する方法が「形式」です。数字を入れるだけの箱なら、開いても何も起きません。ところが、形式によっては、箱の中にプログラムの命令を入れられます。

pickleとは

Hugging Faceの文書は、pickleを「機械学習で広く使われる保存形式で、PyTorchのモデルの重みの標準形式」と説明しています。そして、pickleのファイルを開くと、任意のコードが実行される攻撃が可能だと書いています。

仕組みは、文書の説明では次のとおりです。pickleは「命令の列」で、開くときに上から順に実行されます。命令の中に「このPythonの関数を呼べ」というものがあり、そこにexecのような関数を指定されると、好きなプログラムが動きます。文書は、危険な命令としてGLOBAL、STACK_GLOBAL、REDUCEを挙げています。

つまり、モデルを「開く」だけで被害が出る可能性があります。AIに質問する前の段階です。

safetensorsとは

safetensorsは、数字の表だけを入れる形式です。公式のリポジトリは、pickleをやめるために作った形式だと説明しています。ファイルの構造は、先頭に8バイトの長さ、次にJSONの見出し、残りが数字のデータ、というものです。コードを入れる場所がありません。

さらに、READMEには次の点が書かれています。

安全性の確認として、Hugging Faceの2023年5月23日の発表は、Trail of Bitsという外部の会社が監査をしたと述べています。致命的な(任意のコード実行につながる)欠陥は見つからなかったが、仕様の不正確さなどは見つかって直した、という内容です。同じ発表は、「欠陥がないことを証明するのは不可能」とも書いています。これは開発側の発表なので、その点は割り引いて読んでください。

GGUFは

llama.cppやOllamaなど、手元で動かす道具でよく使うGGUFについて、Hugging Faceの文書は「推論に向けて、素早く読み書きできる形式」で、数字の表に加えて標準化されたメタデータ(付随情報)も入る、と説明しています。この文書は、GGUFの安全性については何も述べていません。僕らも確認できていません。形式の説明を読んだ限りでは、pickleのような「命令の列」ではなさそうですが、これは僕らの推測であり、保証ではありません。

Hugging Faceの自動検査は、どこまで頼れるか

Hugging Faceは、置かれたファイルを自動で調べています。公式文書の内容は次のとおりです。

検査 内容
マルウェア検査 2GB未満のファイルを、ClamAV(オープンソースのウイルス対策ソフト)にかける。コミットのたびに実行
pickleの検査 pickleの中の「呼び出す関数の一覧」を取り出して、ファイルの横に表示。怪しいものは強調
第三者の検査 Protect AI(Guardian)とJFrogの検査結果も、画面に出る

ただし、pickleの文書には、はっきり書いてあります。この検査は「100%確実ではない」こと、安全かどうかを確かめる責任は利用者にあること、そして安全・危険の一覧は「できる範囲で」保守していること、です。マルウェア検査の文書も、okでもinfectedでもない表示は「検査中か、検査待ちか、エラー」の可能性がある、と書いています。印がないことと安全は、同じではありません。

公開された事例

セキュリティ会社ReversingLabsは、Hugging Face上の2つのモデルが、検査をすり抜ける方法を使っていたと報告しました。同社のブログ(The Hacker Newsは2025年2月8日付で報道。ブログ自体のページには公開日の表示が見当たりませんでした)の内容は、次のとおりです。

同社のブログによると、報告を受けたHugging Faceのセキュリティ担当は24時間以内にモデルを削除し、検査ツールも壊れたpickleを見つけられるように変更しました。同社は、この2つは新しい方法を試す概念実証(方法を示す実験)のようだ、と書いています。同時に、その方法自体は本物で、開発者にとって危険だとも書いています。

見立てです。この事例は、「検査があるから大丈夫」ではなく、「形式そのものにコードを入れられない」ことのほうが、守りとして強いことを示していると読みました。

PyTorch側の備え

PyTorchのtorch.loadの文書は、内部でpickleを使うので「信頼できない出所のデータは決して読み込むな」と警告しています。確認した2.14版の文書では、weights_onlyという引数の既定値がTrueで、読めるものを数字の表や基本的な型などに限ります。ただし、警告の文は残っています。僕らは、既定が安全側になった点を、手放しの安心材料とは考えません。

Hugging Faceのtransformersの文書は、from_pretrainedが、あればsafetensorsを読み込む、と書いています。PyTorchの従来の形式は「安全でないことで知られるpickle」とも書いています。

入れる前に見る点

1. 配布元

Hugging Faceには、誰でもモデルを置けます。同じ名前の「作り直した版」も多くあります。見る点は次の3つです。

2. ファイル形式

「Files and versions」の一覧を開き、.safetensors(または.gguf)があるかを見ます。.bin、.pt、.pklしかないモデルは、pickleの可能性があります。

3. ライセンス

Hugging Faceの文書では、ライセンスはモデルカード(README.md)の先頭の設定に書かれ、モデルのページに表示されます。一覧には、Apache 2.0、MITのほか、Llama 3.1やGemmaの利用条件のような、提供元ごとのものもあります。標準にない場合はlicense: otherとし、名前と文書へのリンクが付きます。

商用利用や再配布の可否は、ライセンスの本文を読まないと分かりません。ここでは個別の判断はしません。専門家に確認してください。

4. ゲート付きモデル

「ゲート付き」は、モデルの作者が、アクセスの申請を必須にしたものです。文書によると、申請するとユーザー名とメールアドレスが作者に共有されます。自動承認のものは、すぐに入手できます。手動承認のものは、作者の返事を待ちます。

公式文書の注意が、2つあります。

つまり、手元に入れたあとは使い続けられても、あとから同じ版を取り直せるとは限りません。必要なファイルは、自分の手元に残すとよい、というのが僕らの見立てです。

5. アクセストークン

スクリプトやコマンドで入れるには、アクセストークン(本人確認の合言葉のようなもの)を使います。文書の推奨は次のとおりです。

流出させないこと、とも書かれています。流出したら、設定画面から無効化して作り直します。

公式文書の例:リモートコードの読み込みと、版の固定

transformersの文書は、モデルが専用のプログラムを同梱している場合、trust_remote_code=Trueを指定して読み込む、と説明しています。同時に、Hubにマルウェア検査があっても、悪意あるコードを実行しないよう「十分に注意せよ」と書いています。追加の備えとして、特定の版(コミット)を指定する方法も示しています。公式文書の例です。この記事では、実行していません。

from transformers import AutoModelForImageClassification

commit_hash = "ed94a7c6247d8aedce4647f00f20de6875b5b292"
model = AutoModelForImageClassification.from_pretrained(
    "sgugger/custom-resnet50d",
    trust_remote_code=True,
    revision=commit_hash,
)

trust_remote_code=Trueは、「そのモデルが持ってきたプログラムを、そのまま動かしてよい」という意味です。後から中身が差し替えられることがあるので、版を固定する、という説明です。

コマンドラインのhf downloadにも、--revisionで、コミット、ブランチ、タグを指定する機能があります。

よくある失敗

気をつけること

出典

更新履歴