3行でいうと
- 入れる前に確かめられるのは、おもに「誰が出したか」(来歴)と「途中で変わっていないか」(完全性)です。「中身が安全か」は、署名やスキャンの保証の外にあり、別の評価が要ります。
- 形式で防げる危険もあります。pickle形式の重みは読み込むだけでコードが走りえますが、safetensors形式は仕組みの上でコードを持ちません。ただし値の中の悪意(バックドア)までは別の話です。
- プラグインとMCPサーバーは、コードを動かすものです。Claude Codeの公式文書は、版の固定(コミットSHA、アーカイブのsha256)、入れてよい供給元の許可リスト、入れる前の読み取りを、具体的な手段として示しています。
この記事は、実際に使って確かめた記録ではありません。この記事は、公式の文書を読んでまとめたもので、実際に使って確かめた記録ではありません。情報は2026年10月16日に確認しました。変わることがあります。
先に結論
- 入れるものは3種類に分けると考えやすくなります。重みのファイル(モデル)、拡張の束(プラグイン)、外部の道具の窓口(MCPサーバー)です。モデルは「読み込み時に何が起きるか」、後ろ2つは「自分のマシンで何が動くか」が主な論点です。
- どの種類でも、確認は4つの問いに分けられます。誰が出したか(来歴)、途中で変わっていないか(完全性)、実行したら何が起きるか(実行の危険)、あとで変わらないか(更新)。公式の道具が答えるのは、前の2つと、4つ目の一部です。
- OWASPは、第三者のモデルを選ぶ前に、レッドチームや評価をすることを勧めています。ベンチマークの成績は、調整で操作されうるからです。出所の確認と、中身の評価は、別の作業です。
前提:何が「入ってくる」のか
供給網(サプライチェーン)は、自分の作ったものに入ってくる、他人の作ったものの流れです。OWASPの文書によると、AIでは、従来のソフトの部品(ライブラリ)に加えて、第三者の学習済みモデルとデータも対象に入り、そこが改ざんされたり、毒を混ぜられたりしえます。リスクの分類には、LoRAアダプターや端末内のAIも挙がっています。
| 入れるもの | 入ったときに起きること(公式文書の記載) |
|---|---|
| モデルの重み | 形式しだいで、読み込み時にコードが走る。値の中の悪意は、中身を見ても分かりにくい |
| プラグイン | フック(シェルコマンド)、MCPサーバー、bin/の実行ファイルなどが、利用者の権限で動きうる |
| MCPサーバー | 手元で動くものは、利用者のマシンの上のプロセス。遠隔のものは、外部のサービス |
モデル:形式と署名で防げることと、防げないこと
pickle形式は、読み込むだけで危ない
Hugging Faceの公式文書によると、pickleはPythonのデータの保存形式で、PyTorchの重み(.bin、.pt)の既定です。読み込み(unpickle)の途中で、任意のコードを実行できる、と説明されています。仕組みは、保存データの中に「このモジュールを読み込め」「この関数をこの引数で呼べ」という命令を入れられるためです。
Hubは、置かれた全ファイルを検査しています。ウイルス対策ソフトのClamAVの検査と、pickleが読み込もうとするモジュールを、実行せずに一覧にして、怪しいものを印として表示する検査(Pickle Import scan)の2つです。ただし文書自身が、ClamAVはpickleの悪用を対象にしておらず、検査は完全ではなく、安全かの確認は利用者の責任で、安全・危険の一覧もベストエフォートだと書いています。署名つきのコミットは、ファイルの出所は保証しても、安全は保証しない、とも書かれています。
文書の推奨は、pickleを避けること、信頼できる利用者や組織から読み込むこと、指摘されたモジュールを確認することです。
safetensors形式は、コードを持てない
safetensorsは、その代わりの形式です。READMEによると、ファイルは、ヘッダの長さ、JSONのヘッダ(テンソルの名前、型、形、位置)、生のバイト列でできています。READMEの比較表は、任意のコードを実行しない形式として挙げています(形式の説明に実行コードの入れ場所が出てこない、というのは僕らの読みです)。ヘッダは100MBが上限で、バイト列の範囲は重ならないよう決められています。
一方、READMEは限界も書いています。テンソルの値は検証されず、NaNや無限大が入りうること、重複キーを禁じていても、すべての解析器が守るとは限らないことなどです。僕らの読みでは、これは「開くだけで他人のコードが走る」危険を避ける形式で、重みの値に仕込まれた振る舞い(バックドア)を見つける道具ではありません。OWASPは、バックドアが安全性の評価を通りうること、モデルは「バイナリのブラックボックス」で静的な検査の保証は限られることを書いています。
署名は「誰が」と「改ざんなし」を示す
Sigstoreのmodel-transparencyは、モデルの署名と検証の道具です(READMEの説明)。署名では、モデルのファイル群のハッシュ(中身から計算した指紋)の一覧を作り、それに署名します。検証では、署名が有効かを確かめ、ファイルのハッシュを計算し直して、署名時と一致するかを比べます。Sigstoreを使う場合は、署名者の身元が、短期の証明書と、追記専用のログで記録されます。
READMEが明記している制約は、次のとおりです。
- 署名したときの身元とプロバイダを、検証のときにも指定する必要がある。
- ハッシュはファイルとその分割単位で、テンソル単位ではない。
- 検証に既定の設定がなく、明示的な設定が必要。
- モデルカード情報の格納は未実装で、ログの監視は開発中。
READMEが保証として挙げているのは、署名が有効なこと、ファイルが署名時のハッシュと一致すること、ログに記録され身元に結びつくことです。モデルの中身が安全かどうかは、この保証の中に入っていません。これは僕らの読みで、READMEに「保証しないこと」の節はありません。
OWASPも、検証できる出所のモデルだけを使い、署名、ファイルのハッシュ、完全性の確認を行うことを、対策の1つに挙げています。別の対策に、署名つきの在庫(SBOM、AI BOM)の整備があります。SBOMは部品表で、OWASPはCycloneDXを出発点に挙げています。
プラグイン:コードが動く前提で、固定と許可リスト
Claude Codeの公式文書は、プラグインを入れることを、利用者の権限で任意のコードを動かしうることだと、最初に書いています。具体的には、次のものが動きます。
- フック。 シェルコマンドとして、サンドボックスの外で動く。
- MCP・LSPサーバー。 宣言されたサーバーに接続し、標準入出力のものはClaude Codeがプロセスとして起動する。
bin/ディレクトリ。 実行ファイルが、PATHに追加される。- スキル、コマンド、エージェント。 Claudeへの指示として文脈に入り、使えるツールの使い方に影響する。
- 自動更新。 有効だと、レビューしたファイルがあとから書き換わりうる。
権限のルールとサンドボックスが対象にするのは、Claudeのツール呼び出しで、プラグインが自分で動かすコードは対象外、とも書かれています。警告文は、Anthropicがプラグインの中身を管理せず、検証もできない、という趣旨です。
公式文書が挙げる、確かめる手段は次のとおりです。
- 供給元を見る。 追加したマーケットプレイスのソースを確認する。マーケットプレイスの名前は、発行元の層(公式・コミュニティ・第三者)を示すが、中のプラグインが何をするかは示さない。公式を装う名前は拒否され、公式名は、Anthropicのリポジトリ由来のものだけが使える。
- 入れる前に読む。 詳細画面の「Will install」で構成を見る。フックが何を実行するかは、
hooks/hooks.json、.mcp.json、bin/のファイルを自分で読む。 - 版を固定する。 GitHubなどのgit由来のソースには、ブランチやタグを指す
refと、40文字のコミットSHAのshaを指定できる。両方あるときはshaが使われる。claude-communityのカタログは、ほぼ全項目をコミットSHAに固定していて、別のコミットのインストールは拒否される、と書かれている。アーカイブ(archive)には、sha256を指定でき、一致しないと拒否される。 - npm由来のものは、インストール用のスクリプトが実行されない。 取得時に依存関係もインストールされない、と書かれている。
refとshaは公式の記載にある項目名です。ほかの項目名は、読んだ記録では確認できていないため、この記事で補った例です(値は架空で、動作確認はしていません)。
{
"name": "formatter",
"source": {
"source": "github",
"repo": "your-org/formatter",
"ref": "v2.0.0",
"sha": "(40文字の小文字のコミットSHA)"
}
}
組織としては、管理設定で、入れてよい供給元を絞れます。許可リスト(strictKnownMarketplaces)、禁止リスト(blockedMarketplaces)、--plugin-dirなどの直接読み込みを拒否するdisableSideloadFlagsがあります。許可リストは、取得の前と起動時の両方で適用され、空のリスト[]はすべての供給元を拒否します。許可リストが見るのは供給元で、その中の個別のプラグインではないため、個別に止めるときは、enabledPluginsでfalseにする、と書かれています。
MCPサーバー:レジストリは名前の持ち主を確かめるが、コードは確かめない
公式のMCPレジストリは、公開されているMCPサーバーのメタデータの中央リポジトリで、サーバーのコードは持ちません(現在はプレビューで、破壊的変更やデータの初期化がありうると表示されています)。コードは、npm、PyPI、Docker Hubなどのパッケージレジストリにあり、レジストリは、そこを指す情報を持ちます。
出所の確認として働くのは、名前空間の認証です。サーバーの名前は、io.github.user/server-nameやcom.example/serverのような、逆DNSの形で、GitHubアカウントやドメインの所有を確かめた人だけが、その名前で公開できます。
セキュリティの検査は、別の場所に委ねられています。公式のページによると、レジストリは、下のパッケージレジストリと、下流のマーケットプレイス(アグリゲーター)が検査や評価を行うことに任せ、自分の役割は名前空間の認証とメタデータの提供、と書いています。悪意のあるものは、管理者が手動で削除できます。また、利用側のアプリは、レジストリを直接ではなく、同じ仕様の下流のレジストリを使う想定です。
つまり、レジストリに載っていることは、「名前の持ち主が確認されている」ことを示すにとどまり、そのコードが安全だとは、公式のページは書いていません。
見立て:入れる前の確認表と台帳
ここからは僕らの見立てです。公式の文書を、入口の確認表にまとめます。
| 確認 | モデルの重み | プラグイン | MCPサーバー |
|---|---|---|---|
| 誰が出したか | 出し元の組織のアカウント。似せた名前に注意 | マーケットプレイスの供給元、リポジトリ | レジストリの名前空間、公式ドメイン |
| 変わっていないか | ファイルのハッシュ、署名があれば検証 | コミットSHA、sha256で固定 |
パッケージの版の固定 |
| 実行で何が起きるか | safetensorsを選ぶ。pickleは避ける | フック、.mcp.json、bin/を読む |
手元で動くか、遠隔か。渡す権限(別記事で扱っています) |
| あとで変わるか | 版を固定 | 自動更新を止めるか、固定 | 版の固定と、変更の通知 |
| 中身の評価 | 自分の評価データで試す。レッドチーム | 試用環境で | 試用環境で |
それと、台帳を1枚持つことを勧めます。入れたものごとに、名前、種類、出所、固定した版かハッシュ、承認した人、更新の方針を書きます。OWASPが勧める在庫(SBOM/AI BOM)の、社内版の最小形です。
OWASP LLM03:2025の対策10項目(要約)
OWASPの文書は、供給網の対策を次の10項目で挙げています。
- データの供給元とサービスの提供元を審査する(利用規約とプライバシーポリシーを含む)。
- 古い部品などの脆弱性を管理する。
- 第三者のモデルを選ぶ前に、AIのレッドチームと評価を行う。ベンチマークは、追加学習で操作されうるため。
- SBOM、AI BOM、ML SBOMで、最新の署名つき在庫を維持する(CycloneDXが出発点として挙げられている)。
- ライセンスを、ソフトウェア、ツール、データセットについて棚卸しする。
- 検証できる出所のモデルだけを使い、署名、ファイルのハッシュ、完全性の確認を使う。
- 共同開発の環境を監視、監査する。
- モデルとデータに、異常検知と頑健性のテストを行う。
- パッチの方針を持ち、支援されているAPIとモデルに依存する。
- 端末内のモデルは、暗号化と整合性の確認を行う。
リスクの分類は、第三者パッケージ、ライセンス、古いモデル、事前学習モデル、弱い来歴、LoRAアダプター、共同開発と変換サービス、端末内、利用規約の9つです。例には、PoisonGPT、偽のWizardLM、モデルの形式変換サービスを使ったマルウェア混入などがあります。これらはOWASPの文書の記述で、元の報告までは確認していません。
Claude Codeのプラグインのソースの種類と、固定の項目(公式の記載)
| ソースの種類 | 固定・検証に使える項目 | 補足 |
|---|---|---|
github |
ref、sha(40文字の小文字のコミットSHA) |
|
url |
ref、sha |
|
git-subdir |
ref、sha |
(補足は読んだ記録になし) |
npm |
version |
インストール用スクリプトは実行されない |
archive |
sha256(64桁の16進) |
httpsのみ。一致しないダウンロードは拒否 |
command |
(読んだ記録に項目の記載なし) | 利用者のマシンでコマンドを実行してディレクトリを作る。管理者はdisableCommandPluginSourcesで止められる |
refとshaの両方を指定すると、shaがチェックアウトされます。
気をつけること
- この記事は、実際に使って確かめた記録ではありません。内容は、公式文書の記載です。JSONの例は、公式の項目名に
refとshaを使い、ほかをこの記事で補ったもので、動作確認はしていません。 - 公式ページは、WebFetchという取得の仕組みを通して読みました。この仕組みはページを要約して返すため、細部の取りこぼしがありえます。
- プラグインの信頼モデルは、Claude Codeの公式文書だけを読みました。ほかの製品(ChatGPT、Cursorなど)のプラグインや拡張の仕組みは読んでいないので、同じとは言えません。
- MCPレジストリは、プレビューと表示されています。仕組みが変わりうる状態です。モデレーションの具体的な基準のページは読んでいません。
- safetensorsの安全性について、第三者の監査の結果などは、読んだREADMEに書かれていませんでした。「ない」とは断定できません。
- 確認表と台帳は、僕らの見立てです。公式が勧める手順そのものではありません。
- セキュリティや契約についての助言ではありません。実際に入れる前に、社内のセキュリティ担当や専門家と相談してください。
出典
- LLM03:2025 Supply Chain(OWASP GenAI Security Project、10月16日確認)
- Pickle Scanning(Hugging Face Hub docs、Hugging Face、10月16日確認)
- safetensors README(Hugging Face、GitHub、10月16日確認)
- model-transparency README(Sigstore、GitHub、10月16日確認)
- The MCP Registry(Model Context Protocol、10月16日確認)
- Plugin security and trust(Claude Code Docs、Anthropic、10月16日確認)
- Marketplace reference(Claude Code Docs、Anthropic、10月16日確認)
- Manage plugins for your organization(Claude Code Docs、Anthropic、10月16日確認)
更新履歴
- 2026年10月25日 書き方を直しました。
- 前:運営者が使っていないと読める書き方 → いま:「この記事は、実際に使って確かめた記録ではありません」。公式の資料を読んでまとめた記事で、使い心地は書いていない、という意味に直した
