Claude Code / MCP を安全に使うための実践ガイド — settings.json の多層防御と deny の落とし穴
セキュリティ研究者のyousukezan氏(バグバウンティプログラムでランク1位受賞歴あり)が紹介した Zenn 記事「Claude Code / MCP を安全に使うための実践ガイド」が注目を集めています。165いいね、161ブックマークという反響は、Claude Code のセキュリティ設定に対する実務者の強い関心を示しています。
本記事では元記事の内容を掘り下げつつ、公式ドキュメントや GitHub Issues の情報を加えて、実務で本当に機能するセキュリティ設定を整理します。
背景 — 8桁後半の被害事例
この記事が書かれた背景には、AI コーディングツール経由で Google Ads の MCC が乗っ取られ、8桁後半の被害が発生した事例があります。報告された4つの攻撃ベクターは全て Claude Code / MCP の利用シーンで再現可能です。
| 攻撃ベクター | Claude Code での該当リスク |
|---|---|
| 間接プロンプトインジェクション | Webページに埋め込まれた隠し指示をAIが実行 |
| プロンプトサプライチェーン攻撃 | 外部から取得した CLAUDE.md / settings.json / .mcp.json の改ざん |
| MCP権限悪用(Tool Poisoning) | 許可済みMCPツールの悪意ある利用 |
| クレデンシャルリーク | トークンやAPIキーのログ・git履歴への残存 |
最も重要な3つの設定
元記事が推奨する最小限の設定は3つです。
1. bypassPermissions モードの無効化
| |
--dangerously-skip-permissions フラグは全ての承認プロンプトをスキップします。公式ドキュメントによると、このモードではClaude がファイルの削除、破壊的なコマンドの実行、不可逆な変更を承認なしで行えます。disableBypassPermissionsMode: "disable" で組織全体でこのモードを禁止できます。
エンタープライズ環境では managed-settings.json に設定することで、ユーザーが上書きできないポリシーレベルの強制が可能です。
2. プロジェクトMCPサーバーの自動承認を無効化
| |
この設定が true の場合、プロジェクト内の .mcp.json で定義された全てのMCPサーバーが自動的に有効になります。悪意あるリポジトリを clone しただけでMCPサーバーが起動するリスクがあり、これは過去の CVE-2025-59536(CVSS 8.7)で実際に悪用されました。
3. HTTP通信可能なランタイムの制限
| |
Bash(python3 *) や Bash(node *) を allow リストに入れると、これらのランタイムを経由してHTTP通信が可能になります。つまりネットワークアクセス制御のバイパスが成立します。allow リストには必要最小限のコマンドのみを個別に指定すべきです。
deny 設定の重大な落とし穴
ここからが元記事では十分に触れられていない、しかし実務上最も重要な問題です。
deny ルールが機能しないバグ
GitHub Issue #6699 で報告されているように、settings.json の deny ルールは複数のバージョンで正しく機能していません。
| Issue | 内容 | 状態 |
|---|---|---|
| #6699 | deny permissions が全く強制されない | 報告済み |
| #6631 | Read/Write ツールで deny が無視される | 報告済み |
| #12918 | v2.0.56 で Edit/Write の deny が無効 | 報告済み |
| #24846 | .env ファイルの Read deny が強制されない | 報告済み |
| #13785 | deny 設定があっても CLAUDE.md が上書きされる | 報告済み |
| #11226 | Hooks 自体が Edit/Write で改変可能 | 報告済み |
つまり、settings.json に以下のように書いても:
| |
Claude Code は .env ファイルを読み取れてしまう可能性があります。
唯一の信頼できる防御: PreToolUse Hooks
deny ルールの代替として、PreToolUse Hooks が推奨されています。Hooks はツール呼び出しの前に実行され、非ゼロの終了コードでツール実行を拒否できます。
| |
Hook スクリプトの例:
| |
ただし、Issue #11226 で指摘されているように、Hook 自体が Edit/Write ツールで改変される可能性があります。Hook ファイルは読み取り専用パーミッション(chmod 444)に設定し、プロジェクトディレクトリ外に配置することが推奨されます。
MCP Tool Poisoning — 見えない脅威
MCP のセキュリティで最も深刻な問題は Tool Poisoning です。Invariant Labs の報告によると、悪意ある指示がツールのメタデータ(description フィールド等)に埋め込まれ、人間には見えないがAIモデルには読み取れる状態で攻撃が成立します。
Tool Poisoning の仕組み
1. 悪意あるMCPサーバーがツールを登録
2. ツールの description に隠し指示を埋め込む
(ユーザーには表示されない部分)
3. AIモデルがツールを呼び出す際に隠し指示を読み取る
4. 機密データの窃取や不正操作が実行される
Palo Alto Networks Unit 42 は、MCP Sampling を経由した新しいプロンプトインジェクション攻撃ベクターも報告しています。
Rug Pull 攻撃
さらに危険なのは Rug Pull です。ツールの description や動作がユーザーの承認後に無断で変更される攻撃です。最初は正常に動作するツールとして信頼を獲得し、後から悪意ある動作に切り替わります。MCP Manager の分析によると、バージョン固定(version pinning)がこの攻撃に対する主要な防御策です。
MCP セキュリティ対策
| 対策 | 説明 |
|---|---|
| バージョン固定 | MCPサーバーのバージョンをピン留めし、無断更新を防止 |
| ツール説明の可視化 | AIに見える部分と人間に見える部分を区別して表示 |
| 最小権限 | 各ツールに必要最小限の権限のみを付与 |
| 入力バリデーション | ツールメタデータを含む全入力に対するサニタイズ |
| MCPゲートウェイ | ランタイムでの傍受・サニタイズが唯一の信頼できる防御 |
実践的な多層防御の構成
settings.json の deny だけに頼れない現状を踏まえ、実務で推奨される多層防御を整理します。
レイヤー1: settings.json(基本設定)
| |
deny は現在バグがあるため期待通りに動作しない可能性があることを認識した上で、防御の1層目として設定します。
レイヤー2: PreToolUse Hooks(実効的な防御)
deny の代替として、Hooks で機密ファイルへのアクセスをブロックします。Hook ファイルは chmod 444 に設定し、プロジェクトディレクトリ外(例: ~/.claude/hooks/)に配置します。
レイヤー3: CLAUDE.md(運用ルール)
| |
ただし CLAUDE.md はプロンプトインジェクション対策としては脆弱です。AIへの「お願い」であり、技術的な強制力はありません。
レイヤー4: サンドボックス(高リスク作業時)
/sandbox
依存パッケージの更新やuntrustedリポジトリの調査時に有効化します。公式ドキュメントによると、サンドボックスはOS レベルのメカニズム(Linux: bubblewrap、macOS: seatbelt)でBash実行をプロジェクトディレクトリに制限し、ネットワークアクセスを承認済みドメインに限定します。
レイヤー5: 環境分離(根本対策)
最も確実な防御は、機密情報をClaude Code の到達範囲外に置くことです。
- APIキーは環境変数ではなく
aws-vaultや macOS Keychain で管理する .envファイルは Claude Code を起動するディレクトリに置かない- 広告アカウントやクラウドコンソールの認証情報は別マシン・別ブラウザプロファイルで管理する
まとめ
- 3つの必須設定:
disableBypassPermissionsMode: "disable"、enableAllProjectMcpServers: false、allow リストの最小化が最低限の防御 - deny ルールは信頼できない: GitHub Issues で複数バージョンにわたり deny が機能しないバグが報告されている。deny だけに頼ってはいけない
- PreToolUse Hooks が実効的な防御: deny の代替として Hooks でツール呼び出しを検査・拒否する。ただし Hook 自体の改変リスクにも注意
- MCP Tool Poisoning は深刻な脅威: ツールの description に隠し指示を埋め込む攻撃。バージョン固定とMCPゲートウェイが防御の鍵
- 多層防御が必須: settings.json + Hooks + CLAUDE.md + サンドボックス + 環境分離の5層で守る。単一の対策に依存しない
- 最も確実な対策は環境分離: 機密情報を Claude Code の到達範囲外に置くことが根本的な解決策
参考
- yousukezan氏 — Zenn記事紹介ポスト
- ytksato — Claude Code / MCP を安全に使うための実践ガイド(Zenn)
- tukiyubi — Claude Codeを実務で安全に使うための設定と運用の整理(Zenn)
- Claude Code Security Docs(公式)
- Claude Code Permissions(公式)
- GitHub Issue #6699 — deny permissions が強制されない
- GitHub Issue #11226 — Hooks が Edit/Write で改変可能
- Invariant Labs — MCP Tool Poisoning Attacks
- Palo Alto Networks Unit 42 — MCP Attack Vectors
- Microsoft — Protecting against indirect injection attacks in MCP
- Elastic Security Labs — MCP Tools: Attack Vectors and Defense
- managed-settings.json Ultimate Guide
- AIコーディングツール MCC乗っ取り × Antigravity脆弱性とシャドーAI対策(関連記事)