ModsCode日本語ブログ Claude から Mod のコード例を探す

ModsCode / 日本語ブログ / 他人の Claude Code Mod を入れる前の安全チェック

他人の Claude Code Mod を入れる前の安全チェック

Claude Code の Mod はあなたの権限で動き、サンドボックスもありません。入れる前に claude plugin validate の hooks と calls を読み、危険な組み合わせを見抜くチェックリストを日本語で解説します。

Claude Code の Mod は、あなたの権限で動くコードです。ファイルを読み書きし、プログラムを起動し、通信できます。しかも、Mod にはサンドボックスがありません。便利な Mod ほど画面とツール呼び出しの深いところに入り込むので、他人が作ったものは、入れる前に中身を確かめる習慣をつけてください。この記事では、実行せずにできる確認の手順を、チェックリストにまとめます。内容は Anthropic の公式ドキュメントと照合してあり、validate の出力は Claude Code 2.1.289 で確かめました。

先に結論

  • 入れる前に、リポジトリを clone して claude plugin validate ./フォルダ を実行します。Mod が受け取るイベント(hooks:)と、呼び出す機能(calls:)が、実行せずに分かります。
  • 危険度は、単独の機能より組み合わせで決まります。「秘密を読める」と「通信できる」が揃うと、外に持ち出せます。
  • validate が教えるのは「何を呼ぶか」までで、「どこへ・何を」は教えません。通信先やコマンドの中身は、コードを読んで確かめます。
  • 入れるときは、自分が読んだコミットを入れます。作者が更新するたびに中身が変わる入れ方は避けてください。
  • ModsCode は、どの Mod の安全性も保証しません。最終判断はあなたです。

Mod が届く範囲

公式ドキュメントは、読み込まれた Mod にできることを次のように整理しています。

  • あなたとしてマシン上で動く:あなたのユーザーが読み書きできるファイルをどこでも読み書きし、プログラムを起動し、通信できます。
  • 秘密を読む:環境変数と設定ファイルを読めます。そこにある API キーも含みます。
  • セッションを見る:送ったプロンプトと、Claude のすべてのツール呼び出しが見えます。
  • セッションを変える:プロンプトやツール呼び出しを書き換えられ、あなたが入力したかのようにプロンプトを送れます。別のセッションにメッセージも送れます。
  • 確認なしで動く:ツール呼び出しを、あなたが聞かれる前に許可できます。
  • 使用量を使う:あなたのプランや API キーで、モデルを呼べます。

サンドボックスを有効にしていても、守られるのは Claude が実行する Bash コマンドだけです。Mod が起動したプロセスは、その外で動きます。一方で、Mod にも変えられないものがあります。それは権限確認のプロンプトの表示内容です。

チェック 1:出どころ

  • 作者とリポジトリは、誰が、いつから、どう更新しているか。
  • マーケットプレイスは、信頼できる場所か。自分のものか、組織のものか、知らない人のものか。
  • 入れる版は固定できるか。マーケットプレイスの追加時に、#v1.2.0 のようにタグを固定できます。作者の最新コミットを追う設定だと、作者が push するたびに、中身が変わります。

チェック 2:validate で、受け取るイベントと呼ぶ機能を一覧にする

リポジトリを clone してから、次を実行します。Mod のコードは実行されません。

claude plugin validate ./some-mod

出力の最後の方に、次のような行が出ます(公式ドキュメントの例です)。

validate の出力の例
  ❯ ./register.js hooks: session.start, tool.call, ui.render{component=Pane}
  ❯ ./register.js calls: $.fs.read, $.http.fetch, $.store.set, $.ui.open

hooks: は Mod が受け取るイベントで、calls: は呼び出す Mods API です。Claude Code は、validate が読み取れない形で Mods API を使う Mod の読み込みを拒否します。そのため、一覧に出ない呼び出しを隠し持った Mod は、そもそも読み込まれません。

チェック 3:calls: の行を読む

見つけたら意味次に確かめること
$.fs.read、$.fs.writeあなたが読み書きできる場所を、どこでも読み書きするどのパスを読み書きするか。設定ファイルや鍵のフォルダを読んでいないか
$.process.run、$.process.spawnあなたとしてプログラムを起動する起動するコマンドと引数は何か。シェル経由(sh -c)で、文字列を組み立てていないか
$.http.fetch通信する宛先はどこか。何を送るか
$.env.get、$.settings.read環境変数や設定を読む。API キーが入っていることがあるどの変数を読むか(env reads: の行に名前が出る)
$.env.setClaude Code と、その後に起動するすべてのコマンドや MCP サーバーの環境変数を変えるどの変数か(env writes: の行)。プログラムの動作が変わらないか
$.mcp.callつながっている MCP サーバーのツールを呼ぶどのサーバーのどのツールか
$.model.completeあなたのプランや API キーで、モデルを呼ぶどれくらいの頻度で、何を送るか
$.prompt.submitプロンプトを送る。あなたの言葉として送ることもできる本人の言葉として送っていないか(asUser)
$.session.send別のセッション、サブエージェント、チームメイトに、メッセージを送る何を送るか

私たちが作った検証用の Mod でも、$.process.run (via showBranch) のように、関数を経由した呼び出しの名前は出ますが、実行するコマンドの中身は出ませんでした。validate が示すのは機能の名前までです。引数は、コードを読んで確かめてください。

チェック 4:hooks: の行を読む

見つけたら意味
tool.callすべてのツール呼び出しを見られ、変えたり、止めたり、代わりに答えたりできる
prompt.submitあなたが送るすべてのプロンプトを見られ、書き換えられる
session.append会話に残るすべての行を、保存される前に書き換えられる
tool.check権限の確認が出る前に、ツール呼び出しを許可または拒否できる
ui.render{component=AskUserQuestion}Claude がユーザーに質問するときのダイアログを、描き換えられる

tool.check を持つ Mod は、特に注意が必要です。ask ルールで確認が出るはずの呼び出しや、設定ファイルのフックが止めたはずの呼び出しを、許可してしまえます。deny ルールで拒否される呼び出しは、ガードが読み込まれている環境では許可できません(次の節)。

危険な組み合わせの例

次は、私たちの判断による目安です。公式が危険と断定したものではありません。

  • $.env.get + $.http.fetch:環境変数を読んで、外に送れる形です。API キーの持ち出しが可能な組み合わせなので、何を読んで、どこへ送るのかを必ず確認します。
  • $.fs.read + $.http.fetch:ファイルを読んで、外に送れます。読むパスと宛先を確認します。
  • $.session.messages(会話の読み取り)+ $.http.fetch:会話の内容が外に出る形です。
  • $.process.run + sh -c:文字列を組み立ててシェルに渡すと、意図しないコマンドが動く余地が増えます。
  • tool.check + 無条件の許可:確認を出さずに通す動きがないか確認します。
  • $.prompt.submit(asUser: true):あなた自身の言葉として Claude に指示を出せます。

反対に、ui.render だけで描くだけの Mod や、$.store に自分の設定を保存するだけの Mod は、触れる範囲が小さくなります。

チェック 5:コードを読む

多くの Mod は、数百行までの 1〜2 ファイルです。Mod が外に出る呼び出しは、すべて $ を通ります。ファイルを開いて、$.http、$.process、$.fs、$.env を検索し、なぜそこにあるのかを確かめてください。この手順は、ModsCode の英語版の ルールのページ にも、3 段階(読む・Claude Code に一覧を出させる・読んだコミットを入れる)でまとめています。Claude に「この Mod のコードを読んで、通信先と読み取るファイルを一覧にして」と頼むのも有効ですが、結論を鵜呑みにせず、自分でも該当の行を開いてください。

組織のガードで守られること・守られないこと

Claude Code には、sec-default という内蔵のガードがあり、/plugin では cc-plugin-sec-default と表示されます。管理設定のあるマシン、または Team / Enterprise プランでサインインしているユーザーでは、ユーザーの Mod より先に読み込まれます。守られるのは、組織が管理する次の範囲です。

  • 管理設定のフックが受け取るもの・決めること
  • システムプロンプト、組織の管理する CLAUDE.md などの指示
  • 管理 MCP サーバーのツールと説明

また、ガードが読み込まれている環境では、ユーザーの Mod は、deny ルールで拒否される呼び出しを許可できません。ただし、ここにも穴があります。deny ルールは、Claude のツール呼び出しに適用されますが、Mod 自身の $.fs や $.process の呼び出しには適用されません。Read(.env) を拒否していても、Mod は $.fs.read でそのファイルを読めます。この守りは、あなた個人の環境では当てにしないでください。

入れた後にできること

  • /plugin の mods active で、読み込まれた Mod の名前を確認する。
  • おかしな挙動があれば、claude --safe-mode で起動し、Mod のせいかを切り分ける。
  • 使わない Mod は削除する。
  • 更新するときは、更新前に、もう一度 validate を実行する。hooks: と calls: が増えていたら、何が増えたかを確かめる。

まとめ

入れる前の確認は、①出どころ、②validate で hooks: と calls: を見る、③危険な組み合わせを探す、④コードを読む、⑤読んだコミットを入れる、の 5 つです。探す段階から条件を絞りたいなら、ModsCode の MCP の search_mods で、通信やプログラム起動をする Mod を除外して探せます(使い方)。入れ方は Mod のインストール方法 に書きました。組織の管理者の方は 組織で Mods を管理する をご覧ください。原文は 公式のドキュメント です。