⏱ 読了目安: 約8分
- 事実と背景:Claude Code 2.1.287で「mod」が公式発表されたが、実測では前版の2.1.286から既に機能していたことが判明。
- 技術的変革:従来の外部スクリプト呼び出し(hook)と異なり、本体プロセスのJS関数がイベントループ深部に直接割り込む構造へ進化。
- 現場への影響:サンドボックス化されずローカル権限で動くため、導入前に「claude plugin validate」での静的監査が絶対必須となる。
公式発表より先に始まっていた拡張性の変革
開発現場で毎日CLIと格闘する我々エンジニアにとって、日常的に利用する開発ツールのアップデートは単なる機能追加以上の大きな実務的インパクトを持つ。2026年10月1日、Claude Code 2.1.287のリリースノートにおいて「Claude Mods」の導入が正式にアナウンスされた。しかし、実際に手元でバージョンを切り替えながら測定・検証を行ったところ、公式の主張とは異なる衝撃的な事実が浮き彫りになった。公式ドキュメントでは2.1.287以降対応と明確に明記されているこの新機能が、実際には1つ前のバージョンである「Claude Code 2.1.286」において、すでに何ら制約なく完全に動作していたのだ。
単なるリリースノートの表記ミスや1バージョンのズレと片付けるのはあまりに早計である。この検証結果が意味するのは、開発元であるAnthropic側がユーザーやデベロッパーへの事前告知なしに、内部アーキテクチャの重大な拡張メカニズムを静かに先行実装していたという事実だ。我々エンジニアが日々依存しているAI駆動開発基盤が、我々のあずかり知らぬスピードで進化と内部構造の刷新を進めている証左と言える。
従来のClaude Codeにおける拡張手段といえば、設定ファイル(hooks.json)に外部スクリプトを指定し、それを子プロセスとして起動させる方式が一般的であった。しかし、外部プロセスによる実行は、メインプロセスの内部コンテキストやメモリ空間にアクセスできず、介入できる範囲やパフォーマンスに明確な限界が存在していた。それに対し、今回登場した「mod」は根本的に設計思想が異なる。これはClaude Code本体のJavaScript(Node.js)実行プロセス内部にダイレクトにロードされ、イベントループの深部に割り込むミドルウェア型のJavaScript関数そのものである。
この「プロセス内割り込み(In-process Interception)」の仕組みにより、ツール呼び出し(tool.call)、プロンプト送信(prompt.submit)、UIのリアルタイム描画(ui.render)、プロンプトターンの完了(turn.complete)といったCLIの核心的な動作を、わずか数行のJavaScriptで補足し、イベントデータを乗っ取り、あるいは挙動を完全に差し替えることが可能になった。日頃ExpressやFastifyなどのWebフレームワークでミドルウェアを挟み込み、HTTPリクエスト/レスポンスを自在に操作しているエンジニアであれば、この手触りの恐ろしさと圧倒的な柔軟性が直感的に理解できるはずだ。AI CLIツールは、単なる命令実行端末から「内部からプログラマブルに制御可能な高度なプラットフォーム」へと先祖返りならぬ劇的な変革を遂げたのである。
サンドボックス無き「mod」の実装と検証データ
実測検証で提示されたコード構造を紐解くと、「mod」を動作させるために必要な構成は驚くほどシンプルである。必要なのは plugin.json(メタデータ)、hooks.json(エントリーポイント指定)、そして実際の処理を記述する本体のJavaScriptファイルのわずか3ファイルのみだ。ツール呼び出しとプロンプト送信の回数をカウントし、ターンの終了時にファイルへログを書き出すモジュール構造がごくわずかなコード量で記述できる。
コード内で引数として渡される $ オブジェクトが mods API の実体であり、イベントハンドラー内で next(e) を呼び出せばイベントをそのまま後続の標準処理へ流し、逆に next(e) を返さなければイベントそのものを遮断・乗っ取ることができる。さらに、UIコンポーネントである Spinner の描画フック(ui.render)に割り込むことで、CLI画面上のスピナー表示にリアルタイムでツールの呼び出し回数を追記するといったUIのカスタム拡張までが1行で実現できるのだ。
しかし、シニアエンジニアとして私が最も強い技術的懸念を抱かざるを得ないのは、この無制限のカスタマイズ性と引き換えに失われた「サンドボックス構造の不在」である。公式ドキュメントにも「mod はあなたの権限で動作するコードであり、ファイルの読み書き、プロセスの起動、ネットワークリクエストの実行が可能である」と無味乾燥に記されているが、これはセキュリティ上極めて重大な意味を持つ。
我々がこれまでNode.jsのnpmエコシステムで長年苦しめられてきたサプライチェーン攻撃の脅威が、そのままAI CLIツールのプラグイン世界に持ち込まれたことを意味するからだ。悪意ある第三者が作成した便利そうな「mod」を安易に導入した場合、裏側で $.process.run や $.http.fetch が呼び出され、ローカル環境のSSH秘密鍵や .env ファイル内のAPIキー、ソースコード全体がサイレントに外部サーバーへ送信される危険性と背中合わせになる。以下は、バージョン別の動作検証および –safe-mode の有効性を測定した実測データである。
| Claude Code バージョン | mod の有無 | –safe-mode | 動作判定(実測) | 備考 |
|---|---|---|---|---|
| 2.1.287 | あり | なし | 3/3 動いた | 公式リリースアナウンス版 |
| 2.1.287 | なし(対照区) | なし | 0/3 動かず | 証拠ファイル生成なしを確認 |
| 2.1.286 | あり | なし | 3/3 動いた | 公式発表より1つ前で動作実証 |
| 2.1.285 | あり | なし | 0/3 動かず | このバージョン以前は未対応 |
| 2.1.283 / 2.1.282 | あり | なし | 0/3 動かず | 旧バージョンでは動作せず |
| 2.1.287 | あり | あり | 0/3 止まった | –safe-mode による無効化を確認 |
測定結果が明確に示す通り、–safe-mode オプションを付与することで mod の実行を3/3の確率で確実に阻止できることが判明した。安全性の切り分けや不審な挙動の抑止において、このフラグが極めて有効な防壁となることは技術的な事実である。
現場が取るべき防御策とAI CLI拡張への課題
AI駆動開発のスピードが加速度的に増し、ツール側の機能拡張がセキュリティ設計を置き去りにして突き進む現在、我々現場のエンジニアやテクニカルリーダーはどのような立ち振る舞いを選択すべきだろうか。ここで明日からの開発実務にすぐ適用できる「実践的な処方箋」を提示したい。
まず第一に、GitHubやサードパーティのマーケットプレイス等で公開されている「mod」を自分の開発環境へインストールする際は、事前監査を絶対の義務とすることだ。幸いにもClaude Codeには、実行前にプラグインの静的解析を行う検証コマンド claude plugin validate が標準で用意されている。このコマンドを実行すると、該当するmodがどのイベントフック(hooks)を捕獲し、どの内部API($.fs.write、$.process.run、$.http.fetch など)を実行しようとしているのかをコードを直接実行することなく一覧表示してくれる。
- チーム内での運用ルールとして、未知のプラグインを導入する前に必ず claude plugin validate の出力をレビューするプロセスをCIやローカルに組み込む。
- 不審な $.process.run(任意コマンド実行)や $.http.fetch(外部通信)が含まれる mod の使用を固く禁止する。
- 検証中や信頼性が確保されていない環境においては、CLI実行時に必ず –safe-mode オプションを付与するか、組織レベルの設定でフック機能を無効化(disableAllHooks)する。
しかし、技術的インフラストラクチャの観点から問題の根底を掘り下げるならば、我々はより根本的な「技術的・社会的問い」を直視しなければならない。「拡張性と開発体験(DX)の向上を追求するあまり、プロセスのサンドボックス化を放棄した設計は、果たして持続可能なAIエコシステムの正解なのだろうか?」
WebAssembly(Wasm)やV8 Isolated Contextのような安全な分離環境を用意せず、ローカルOSのフル権限をそのままJavaScript関数に与えるアプローチは、過去にブラウザやNode.jsが辿ってきたセキュリティ上の失敗をCLIの世界で再生産しているようにも見受けられる。AIが自律的にシェルを叩きコードを書き換えるレイヤーの上に、さらにその挙動を乗っ取るサードパーティの「mod」が重なるという多層の抽象化の中で、万が一スパゲッティコードのような複雑な競合やデッドロック、あるいはサイレントな情報漏洩が発生した際、我々は原因の特定とデバッグを完遂できるだろうか。
開発の効率化とトレードオフで我々が差し出しているのは、自分たちのローカル開発環境における「統制権」そのものかもしれない。この強力すぎる拡張機能という諸刃の剣をどう手なずけ、セキュリティと開発速度を両立させるか。その重い問いに対する解を出すのは、ツール提供企業だけでなく、日々の端末でコードを叩く我々エンジニア一人ひとりの洞察と選択にかかっている。


コメント