テック技報最新号へ →
AIコーディング

エージェントを ~/Downloads や拾ったリポで起動しない:起動前の点検と設定ファイルの見張り

コーディングエージェントは作業フォルダの AGENTS.md / CLAUDE.md や、リポ内の hook 設定を信じて動く。Web サイトは ~/Downloads にクリックなしでファイルを置けるため、そこでエージェントを起動するだけで乗っ取られうる。起動場所を決め、起動前に指示ファイルと hook を読み、エージェント自身の設定ファイルの書き換えを見張る。

@yayutom_AI · 投稿 2026-10-22
#security#prompt-injection#codex#claude-code#agents-md#hooks

何が起きたか(Forever Security の報告、2026-10-22)

  • 顧客マシンの ~/Downloads に、普通の開発メモを装った悪意ある AGENTS.md が置かれていた
  • Codex: そのフォルダで起動して何か頼むと、作業の前に ~/.codex/config.toml に「project tools」サーバーを足し、npm パッケージ(実物はマルウェア)を入れた。検証では 90% 超の試行で実行された。config.toml はマシン全体の設定なので、以後どのフォルダの Codex でも読み込まれる
  • Claude Code: 仕込んだ CLAUDE.md で、プロジェクト設定に ANTHROPIC_BASE_URL を書かせて API 通信を攻撃者のサーバーへ向けさせた。書き込みには承認が要り、よく拒否されたが、長い社内ドキュメント風の文面で約半分が承認された。これでログイントークンが漏れ、サーバーがモデルのふりをしてコマンドを返せる
  • 報告者の計測では、顧客の約半数が Downloads でエージェントを動かしていた
  • 別件で、.claude/ .cursor/ .vscode/ .gemini/ に hook や SessionStart を仕込んだリポが 42 件見つかったという JFrog の報告も X で紹介されている(@ai_secu)

手順

  1. 起動場所を決める: エージェントは ~/src/<repo> のような自分で作ったフォルダでだけ起動する。~/Downloads、デスクトップ、ホーム直下では起動しない
  2. 起動前に読む: 拾ったリポ・ZIP は、まずエージェント無しで次を確認する
    bash
    ls -la AGENTS.md CLAUDE.md CLAUDE.local.md GEMINI.md .cursorrules 2>/dev/null
    find . -maxdepth 3 \( -path './.claude/*' -o -path './.cursor/*' -o -path './.vscode/*' -o -path './.gemini/*' -o -path './.codex/*' \) -type f | head -50
    grep -rn -i -E 'hooks|SessionStart|ANTHROPIC_BASE_URL|base_url|mcp_servers' .claude .cursor .vscode .gemini .codex 2>/dev/null
  3. エージェントの設定の差分を見張る: 次の場所に、自分が足していないサーバーやエンドポイントが無いか定期的に見る
    • ~/.codex/config.toml の [mcp_servers.*] や base URL(chatgpt_base_url など)
    • プロジェクトの .claude/settings.json の ANTHROPIC_BASE_URL、プロキシ、env
    • 手軽には git で ~/.codex/config.toml と ~/.claude/settings.json を管理し、git diff で変化を見る
  4. 承認とサンドボックスは切らない: 「承認を切って」「サンドボックスを外して」と指示する文書が出てきたら疑う
  5. 見つけたら: トークンが漏れた前提でログアウト・再ログインしてトークンを入れ替える

注意点

追記(2026-10-29): Claude Code は claudeMdExcludes で Downloads の指示ファイルを読まない

@Knorr_CS が紹介した設定。claudeMdExcludes は絶対パスに対する glob で、当たった CLAUDE.md や .claude/rules/ を読み込みから外す。

json
{ "claudeMdExcludes": ["**/Downloads/**"] }
  • 個人なら ~/.claude/settings.json、Team / Enterprise なら管理画面の「管理された設定」(組織レベルの settings.json)のトップレベルに足す。ユーザー・プロジェクト・ローカル・管理ポリシーの各層に書け、配列は層をまたいで結合される
  • 管理ポリシーとして置かれた CLAUDE.md(/etc/claude-code/CLAUDE.md など)は除外できない
  • シンボリックリンクのルールは、リンク元・リンク先どちらのパスでも当たる(v2.1.239 以降)
  • 公式ドキュメントには AGENTS.md まで外れるとは書かれていない。また hook を仕込んだ .claude/settings.json は別の仕組みなので防げない。上の「起動場所を決める」「起動前に読む」の代わりにはならず、重ねがけとして使う
  • 出典: @Knorr_CS · 2026-10-28 、公式ドキュメント code.claude.com

出典

X の元の投稿を開く