AIモデルのサプライチェーン攻撃完全ガイド
悪性モデルとpickle爆弾の正体
「便利そうなモデルを1つダウンロードしただけ」で、あなたのPCやサーバーが乗っ取られる——。
Hugging Faceの悪性モデル・pickle爆弾・タイポスクワットの仕組みと、安全にモデルを使うための実務的な防御を、無害な再現デモつきで硬派に解説します。
ChatGPTのようなクラウドAIではなく、自分の手元でモデルを動かす——ローカルLLM、画像生成、音声認識。そのために私たちは Hugging Face のようなリポジトリから、日々“モデルファイル”をダウンロードしています。Ollamaでpullするのも、Stable Diffusionの.ckptを拾ってくるのも同じ構図です。ところが、この「モデルを落として読み込む」という何気ない操作が、ソフトウェアサプライチェーン攻撃の新しい入口になっていることは、まだあまり知られていません。
本記事は、ローカルAIを「使う/作る」記事群に対する「守る」側のスポーク記事です。AIモデルは単なるデータの塊に見えて、形式によっては読み込むだけで任意のコードが実行される危険な“実行可能ファイル”になりえます。ここでは、なぜモデル供給網が狙われるのか、悪名高いpickle爆弾の仕組み、実際に確認されている攻撃手口、無害な再現デモ、そして安全にモデルを扱うための実務的な防御策を、初心者にもわかるように、しかし中身は妥協せず解説します。
本記事は防御を目的とした解説です。掲載する再現例はすべて無害化・簡略化したサンプル(ファイル作成やメッセージ表示のみ)で、攻撃用ペイロードや悪性モデルの作り方を提供するものではありません。検証は自分が管理する隔離環境でのみ行ってください。他者に悪性モデルを配布する行為は犯罪です。一次情報として NIST・OWASP・MITRE ATLAS・各プラットフォームの公式ドキュメントを参照しています(末尾の出典参照)。
📋 目次
🧭 AIモデルのサプライチェーンとは
「モデルがあなたのPCに届くまでの道のり」全体が、攻撃対象です。
サプライチェーン攻撃って?
サプライチェーン攻撃とは、あなたが直接狙われるのではなく、あなたが信頼して使う“部品”の供給経路に毒を仕込む攻撃です。ソフトウェアでは、ライブラリやパッケージに悪意を混ぜる手口が有名。AIではその“部品”がモデルファイルや学習データ、ライブラリになります。
現代のAI開発は、ゼロから全部自作することはほとんどありません。誰かが公開した事前学習済みモデルをダウンロードし、必要なら少し追加学習(ファインチューニング)して使います。この「他人が作ったモデルを信頼して取り込む」という文化こそが、利便性の源泉であり、同時に弱点でもあります。モデルがあなたの環境にたどり着くまでには、いくつもの“受け渡し”があり、そのどこかに毒が混ぜられる余地があるのです。
🔧 モデルが届くまでの供給網と、毒の混入点
図のどの段階も攻撃点になりえますが、本記事が特に注目するのは右端、「あなたの環境でモデルを読み込む瞬間」です。多くの人は「モデル=ただの数値データ(重み)だから、読み込んでも害はない」と思っています。ところが、もっとも普及しているモデル保存形式のひとつpickle(ピクル)は、読み込むだけでプログラムを実行できてしまう仕様なのです。次のセクションで、その正体を解き明かします。
「データのつもり」が「実行ファイル」だった
画像や音声ファイルを開くのと違い、AIモデルの読み込みはあなたのPCの権限でコードを走らせうる操作になりえます。この“データと実行コードの境界の曖昧さ”が、AIサプライチェーン攻撃の核心です。RAGデータポイズニングがデータの中身を汚すのに対し、こちらはファイルそのものに爆弾を仕込むイメージです。
なぜ2026年の“いま”これが効いてくるのか
少し前まで、AIモデルは一部の研究者や大企業が扱う“特別なもの”でした。ところがオープンモデルの爆発的な普及で、いまや個人の開発者から中小企業まで、誰もが気軽に他人のモデルをダウンロードして業務に組み込む時代になりました。Hugging Faceには数百万ものモデルが公開され、その多くは善意のものですが、これだけ巨大になると、悪意ある投稿者が紛れ込む余地も同じだけ広がります。「ライブラリのnpm/PyPI汚染」で起きてきたことが、いま“モデル”という新しい部品で繰り返されようとしているのです。
しかもAIモデルには、従来のソフトウェア部品にはない厄介さがあります。それは「中身を人間が読んで理解できない」こと。プログラムのコードなら差分をレビューできますが、何GBもある重みの羅列を目で見て「ここに毒がある」と判断するのは不可能です。だからこそ、後述する形式の選択・スキャン・出所確認・隔離といった“中身を読まずに守る”仕組みが決定的に重要になります。
🥒 pickle爆弾の正体:なぜ読み込みでコードが走るのか
「pickle」というPythonのしくみがわかればAIモデルの危険性が腑に落ちます。
pickleとは、Pythonでオブジェクト(プログラム上のデータ)をファイルに保存・復元するための標準のしくみです。PyTorch製モデルの定番形式.bin/.pt/.ckptは、内部でこのpickleを使っています。便利なのですが、pickleには設計上の“仕様”として、復元(デシリアライズ)時に任意のコードを実行できる機能が組み込まれています。
鍵になるのは、Pythonのオブジェクトが持てる__reduce__という特別なメソッドです。pickleはファイルを復元するとき、「このオブジェクトを作り直すには、どの関数に何の引数を渡せばいいか」という“レシピ”を読み取って、その関数を呼び出します。攻撃者はこのレシピに、「os.system に『悪意あるコマンド』を渡して実行せよ」と書いておくことができます。すると、モデルをloadした瞬間に、そのコマンドがあなたの権限で走ってしまうのです。
⚙️ 「モデルを読み込む」だけでコードが実行される流れ
これが俗に「pickle爆弾」と呼ばれるものです。モデルの重み(本来のデータ)はちゃんと入っているので、AI自体は普通に動きます。利用者から見れば「ちゃんと使えるモデル」。けれど読み込んだ裏で、こっそりバックドアの設置や情報の送信が走っている——表面上は無害に見えるからこそ、発見が遅れます。さらに近年は、スキャナーの検査をすり抜けるためにあえて壊れたpickleを使う回避技法(通称 nullifAI など)も報告されており、攻防はいたちごっこの様相です。
注意したいのは、この危険が特殊なファイルではなく、ごく一般的なモデル形式に潜んでいる点です。PyTorchで保存したpytorch_model.bin、画像生成で広く出回る.ckpt、各種チェックポイントの.pt——これらは内部でpickleを使っているため、原理的にこの爆弾を仕込めます。「拡張子が実行ファイル(.exe)じゃないから安全」という直感は、AIモデルには通用しません。むしろ“ただのデータに見える拡張子”だからこそ、警戒されずに開かれてしまうのです。
では、なぜpickleはこんな危険な仕様のままなのでしょうか。それはpickleが本来、「信頼できる自分のプログラム内でデータをやり取りする」ための便利な道具として作られたからです。手元で完結する分には、コードを実行できる柔軟さはむしろ長所でした。問題は、その道具が「見知らぬ他人からダウンロードしたファイルを開く」という、まったく信頼前提の異なる用途に使われるようになったこと。便利な道具が想定外の場所で使われて牙をむく——サプライチェーン攻撃の典型的な構図がここにもあります。
合言葉:「pickleは信頼できる相手のものだけ」
Python公式ドキュメントも「信頼できないpickleデータを絶対にunpickleするな」と明記しています。AIモデルも例外ではありません。逆に、コードを実行できない安全な形式(後述のsafetensors)を選べば、この爆弾の大半は無力化できます。まずはこの一点を覚えておくだけでも、守りの土台ができます。
🗂 攻撃の手口カタログ(5つの型)
「悪性モデルを置く」だけでなく、利用者に“間違って掴ませる”工夫が肝です。
pickle爆弾という“弾”があっても、利用者がそれをダウンロードしてくれなければ攻撃は成立しません。そこで攻撃者は、正規のモデルと見分けがつかないように見せかけるさまざまな手口を使います。代表的な5つの型を押さえましょう。技術的な「弾」と、人をだます「届け方」がセットになって初めて攻撃が成立する、という視点で読むと理解しやすくなります。
悪性モデルの直接公開
pickle爆弾を仕込んだモデルを、便利そうな名前でリポジトリに公開する。「高速版」「日本語強化版」など魅力的な触れ込みでダウンロードを誘う。実際にHugging Face上で多数の悪性モデルが発見されている。
タイポスクワット(名前の偽装)
有名モデルと1文字違いの名前でそっくりのリポジトリを用意。llamaに対するllarnaのように、打ち間違いやコピペミスで掴ませる。配布元の組織名も似せてくる。
名前空間混乱・依存混乱
社内用の非公開モデル名と同じ名前を公開側に登録し、ツールが誤って公開(悪性)側を取りに行くよう仕向ける。自動化されたパイプラインほど引っかかりやすい。
正規アカウント乗っ取り
信頼されている作者や組織のアカウントを乗っ取り、本物のモデルを毒入りに差し替える。利用者は「いつもの信頼できる配布元」と思い込んでいるため、疑わずに更新してしまう。
学習データ・依存ライブラリ汚染
モデル本体でなく、その材料(学習データ)や周辺ライブラリに毒を混ぜる。バックドアを“学習”させたり、requirements.txtの悪性パッケージで攻撃したり。供給網の上流を狙う高度な型。
共通点は「信頼の見た目」を盗むこと
5つの型に共通するのは、技術的な突破よりも“正規に見える”という信頼の演出で人を動かす点です。ダウンロード数バッジ、それっぽいREADME、有名な組織に似た名前——見た目の安心感ほど、立ち止まって確かめる価値があります。
🧪 無害な再現デモで仕組みを体感する
「読み込んだだけで実行される」を、安全な例で一度見ておきましょう。
ここでは、攻撃用ペイロードを含まない無害なサンプルで、pickleが“復元時にコードを実行する”性質だけを示します。実行内容はメッセージ表示と無害なファイル作成だけ。自分の隔離環境(使い捨ての仮想マシンなど)でのみ、しくみの理解のために確認してください。
デモ①:pickleが復元時に“コマンド”を走らせる
下のコードは、__reduce__ を使って「このオブジェクトを復元するときは、このコマンドを実行せよ」というレシピを埋め込む例です。ここでは害のないecho(メッセージ表示)にしてあります。
ポイントは、pickle.loads()(モデル読み込みに相当)を呼んだその瞬間にechoが走ることです。本物の攻撃では、このechoが情報送信やバックドア設置のコマンドに置き換わります。そして、このオブジェクトを本物のモデルの重みと一緒に保存すれば、「ちゃんと動くのに、読み込むと毒が走るモデル」が完成してしまうわけです。たった数行で再現できてしまうという事実こそ、この問題を「専門家だけの心配ごと」で済ませてはいけない理由です。
デモ②:安全な形式 safetensors との違い
同じ重みを保存するのでも、safetensorsという形式を使えばこの問題は起きません。safetensorsは「数値データ(テンソル)だけを格納し、コードを一切実行しない」ように設計された形式だからです。下の比較で、選ぶべき形式が一目でわかります。
📊 モデル保存形式の安全性くらべ
| 形式 | 主な用途 | 読み込みでコード実行 | 安全度 |
|---|---|---|---|
| safetensors | 重みの保存(推奨) | なし(データのみ) | |
| GGUF | Ollama/llama.cpp系 | 原則なし(要更新) | |
| .bin / .pt (pickle) | PyTorch標準 | あり(危険) | |
| .ckpt (pickle) | 画像生成等 | あり(危険) |
※ 安全度は「読み込み時のコード実行リスク」の目安。GGUF等もパーサーの脆弱性が見つかることがあり、更新が重要。執筆時点の評価です。
本物の攻撃コマンドを埋め込んだpickleを作る・配布する・他者の環境で試すのは明確な攻撃行為であり、犯罪です。上記デモはechoのみの無害例で、しくみ理解のためのものです。検証は必ずネットワークから隔離した使い捨て環境で行い、外部に影響しないようにしてください。
🎬 実務で起きる5つの想定シナリオ
「自分の使い方でどう関係するか」を具体的な場面で確認しましょう。
📊 シナリオ別リスク早見表
| シナリオ | 入り口 | 起こりうる被害 | 危険度 |
|---|---|---|---|
| ① 個人の試用 話題のモデルを手元で試す |
悪性モデル/タイポ | PC乗っ取り・暗号資産窃取・常駐 | |
| ② 本番サーバーへ導入 社内サービスにモデル組込 |
毒入りモデルのデプロイ | サーバー侵害・顧客データ漏えい | |
| ③ CI/CDの自動取得 パイプラインが自動pull |
名前空間混乱・依存混乱 | ビルド環境侵害・横展開・鍵窃取 | |
| ④ 信頼モデルの更新 いつもの配布元を更新 |
アカウント乗っ取り | 気づかぬ毒入り更新・広範囲影響 | |
| ⑤ ファインチューニング ベースモデルに追加学習 |
学習データ・依存汚染 | 埋め込まれたバックドアの継承 |
※ 危険度は「権限の大きさ × 自動化の度合い」の目安。執筆時点の評価です。
とくに②③が深刻です。本番サーバーやCI/CD(自動ビルド環境)は、強い権限と機密(APIキー・顧客データ・クラウド認証情報)を抱えているうえ、人の目を介さずモデルを自動取得することが多い。つまり「強い権限 × 無人の取り込み」という、サプライチェーン攻撃にとって理想的な条件がそろっています。ローカルAIを業務に組み込むなら、ローカルLLMセキュリティ完全ガイドとあわせて、モデルの取得経路を必ず見直してください。
⑤のファインチューニングも見落とされがちです。毒入りのベースモデルに自分のデータで追加学習しても、仕込まれたバックドアはそのまま受け継がれる可能性があります。「自分で手を加えたから安心」とはならず、土台が汚れていれば、その上に何を積んでも汚染は残るのです。最初に選ぶベースモデルの安全性が、その後のすべてに影響する——この“出発点の重要性”は、サプライチェーンという言葉そのものが教えてくれる教訓です。
「自分は個人で趣味に使うだけだから①でしょ」と油断しがちですが、個人PCにも守るべきものはたくさんあります。ブラウザに保存したパスワード、暗号資産のウォレット、各種サービスのログインセッション、家族の写真——これらはすべて、PCを乗っ取った攻撃者にとって価値ある“戦利品”です。さらに、乗っ取られた個人PCが踏み台にされ、勤務先や知人への攻撃の起点にされることもあります。規模の大小にかかわらず、自衛の基本(safetensorsを選ぶ・出所を確かめる)は同じだと考えてください。
「動いているから安全」は通用しない
毒入りモデルは、本来の性能を保ったまま裏で悪事を働けます。AIの精度テストに合格することと、そのファイルが安全であることはまったくの別問題です。性能評価とセキュリティ検証は、必ず分けて考えましょう。
🛡 防御の実務:安全にモデルを扱う7段階
「選ぶ・確かめる・隔離する」を重ねれば、リスクは大きく下げられます。
AIモデルのサプライチェーン攻撃にも特効薬はありません。形式の選択・出所の確認・読み込みの隔離を重ねる多層防御で、被害の確率と影響を下げます。ローカルAIを運用する人向けの実践チェックリストです。
7段階すべてを一度に整えるのが理想ですが、優先順位をつけるなら、まず「1. safetensorsを選ぶ」と「5. 隔離環境で初回ロードする」の2つから着手するのが効果的です。前者は最も多い攻撃(pickle爆弾)を形式レベルで無力化し、後者は万一の毒が走っても被害を箱の中に閉じ込めます。“入口で弾を抜く”と“万一の爆発を封じ込める”の組み合わせは、少ない手間で大きく効きます。そこからスキャン・ピン留め・監視へと段階的に広げていきましょう。
safetensorsを最優先で選ぶ
同じモデルでも、コードを実行しないsafetensors形式が提供されていればそちらを選ぶ。.bin/.ckptしかない、あるいは古いモデルは要警戒。pickleを読むなら PyTorch の weights_only=True を使う。
取得元と作者を確かめる
公式の組織アカウントか、ダウンロード実績や来歴は妥当か、名前は1文字も間違っていないか。タイポスクワットと偽組織名を疑い、URLとリポジトリ名を一字ずつ確認する。怪しい「高速版」「無制限版」は避ける。
スキャナーで検査する
ダウンロードしたモデルを、使う前にpicklescan や ModelScan などの専用スキャナーで検査する。プラットフォーム側のスキャン結果も確認する。ただしスキャンは万能でない(回避技法あり)前提で、他の対策と併用する。
バージョン固定とハッシュ検証
「最新」を自動で取りに行かせない。特定のコミット/リビジョンにピン留めし、ファイルのハッシュ値を記録・照合する。これでアカウント乗っ取りによる“こっそり差し替え”を検知できる。
隔離環境で初回ロードする
新しいモデルの初回読み込みは、ネットワークを遮断したサンドボックス/使い捨てコンテナで行う。万一コードが走っても外部に通信できず、本番データにも触れられないようにする。最小権限で実行する。
SBOM・来歴を管理する
どのモデル・データ・ライブラリを、どのバージョンで使っているかを一覧(AI-BOM)にして管理する。脆弱性や汚染が報告されたとき、影響範囲を即座に特定できるようにしておく。署名付きモデルがあれば検証する。
実行時監視と最小権限
モデルを動かすプロセスの不審な挙動(外部通信・ファイル書き込み・子プロセス起動)を監視する。実行ユーザーの権限を絞り、アクセスできる範囲を限定。異常があればすぐ遮断・調査できる体制にする。
□ safetensors版を選んだか(pickleなら weights_only)/□ 公式の取得元か・名前は正確か/□ スキャナーで検査したか/□ バージョンをピン留めしハッシュ照合したか/□ 初回ロードは隔離環境か/□ 使用モデルを一覧(AI-BOM)で管理しているか/□ 実行時の挙動を監視し権限を最小化したか
これらは、従来のソフトウェアサプライチェーン対策(依存パッケージの検証・SBOM・ピン留め)を、AIモデルという新しい“部品”に広げたものです。社内ルールに落とし込む際は、企業のAI利用ガイドライン雛形に「外部モデルの導入基準と検証フロー」を1条として加えておくと、現場が迷いません。
🙋 運用者・利用者の自衛とまとめ
難しい知識がなくても、習慣だけでリスクは大きく減らせます。
最後に、立場別の自衛策を整理します。完璧な防御はありませんが、形式選びと出所確認という地味な習慣が、いちばん効きます。難しいツールを導入する前に、まず「自分はどの立場で、何を守るべきか」を意識するだけでも、打つべき手は変わってきます。個人の試用と本番サーバーでは、許容できるリスクも、かけるべき手間もまったく違うからです。
個人で試す人
safetensorsを選び、公式配布元から。怪しい「強化版」は触らない。
本番に組む人
ピン留め・ハッシュ照合・隔離ロードを最初から設計に入れる。
管理する人
使用モデルを棚卸し(AI-BOM)。導入は承認フローを通す。
覚えておくべき合言葉は、たった2つです。「形式はsafetensorsを選ぶ」と「出所を一字ずつ確かめる」。この2つを習慣にするだけで、pickle爆弾とタイポスクワットという最も多い入り口の大半を塞げます。AIモデルは“便利な部品”であると同時に、あなたの権限で動く他人のコードでもある——その意識を持って付き合えば、サプライチェーン攻撃の多くは未然に防げます。AIを賢く活用することと、安全に活用することは、決して矛盾しません。正しく怖がりながら、これからもローカルAIの可能性を存分に楽しんでいきましょう。
Ollamaでpullするモデルも危険ですか?
有名なモデルなら安心では?
ウイルス対策ソフトで悪性モデルを防げますか?
もっと広くAIのリスクを学ぶには?
①AIモデルは形式によっては「読み込むだけでコードが走る実行ファイル」になりうる。②その正体がpickle爆弾(__reduce__でコマンド実行)。③攻撃は悪性モデル・タイポスクワット・名前空間混乱・アカウント乗っ取り・データ汚染の5型。④本番サーバーやCI/CDなど「強い権限×自動取得」が最も危険。⑤防御はsafetensors優先・出所確認・スキャン・ピン留め&ハッシュ・隔離ロード・AI-BOM・実行時監視の多層防御。⑥合言葉は「形式はsafetensors」「出所を一字ずつ確かめる」。
📚 主な参考・一次情報
- Python公式ドキュメント「pickle」(信頼できないデータの危険性に関する警告)
- OWASP「Top 10 for LLM Applications」(LLM05: Supply Chain ほか)
- NIST「Secure Software Development / Supply Chain(SSDF・SP 800-218等)」
- MITRE ATLAS(AIサプライチェーン侵害の手法分類)
- Hugging Face safetensors / モデルスキャン(picklescan・ModelScan)公式情報
- IPA/JPCERT/CC のソフトウェアサプライチェーンに関する注意喚起
※ 本記事は防御目的の解説です。掲載例は無害化したサンプルであり、攻撃の実装手順ではありません。
AIの「守り方」3部作
AIは「どこを汚されるか」で攻撃が変わります。指示・データ・ファイルの3つの急所と、その守り方を1本ずつ深掘りした実践シリーズです。
インジェクション
Web・メール・PDFに潜む「見えない命令」でAIが乗っ取られる仕組みと防御。
解説を読む →ポイズニング
社内文書AIの知識源(ナレッジベース)を汚染する攻撃と、取り込みから回答までの多層防御。
解説を読む →サプライチェーン攻撃
Hugging Faceの悪性モデル・pickle爆弾の仕組みと、安全にモデルを扱う7段階の対策。
解説を読む →いずれも「やさしいサイバーセキュリティ」の実践解説シリーズ


コメント