エージェントを ~/Downloads や拾ったリポで起動しない:起動前の点検と設定ファイルの見張り
コーディングエージェントは作業フォルダの AGENTS.md / CLAUDE.md や、リポ内の hook 設定を信じて動く。Web サイトは ~/Downloads にクリックなしでファイルを置けるため、そこでエージェントを起動するだけで乗っ取られうる。起動場所を決め、起動前に指示ファイルと hook を読み、エージェント自身の設定ファイルの書き換えを見張る。
何が起きたか(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)
手順
- 起動場所を決める: エージェントは
~/src/<repo>のような自分で作ったフォルダでだけ起動する。~/Downloads、デスクトップ、ホーム直下では起動しない - 起動前に読む: 拾ったリポ・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 - エージェントの設定の差分を見張る: 次の場所に、自分が足していないサーバーやエンドポイントが無いか定期的に見る
~/.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で変化を見る
- 承認とサンドボックスは切らない: 「承認を切って」「サンドボックスを外して」と指示する文書が出てきたら疑う
- 見つけたら: トークンが漏れた前提でログアウト・再ログインしてトークンを入れ替える
注意点
- Forever は「ベンダーが直せる不具合ではなく、エージェントが指示ファイルに従う性質の問題」としている。自分の運用で守るしかない
- CI で信頼していないリポに対して動かす場合は Claude Code: CI やスクリプトの claude -p には --bare を付ける(信頼していないリポジトリの hook・MCP を動かさない)、隔離して動かす選択肢は エージェントを隔離して動かす選択肢(nono / Docker Sandboxes / agentos / VPS)
- Claude Code が AGENTS.md を読むのは CLAUDE.md 系が無いときだけ(v2.1.277 以降、@YamanekoInfo)。それでも Codex など他のエージェントは読むので、ファイルの有無で油断しない
追記(2026-10-29): Claude Code は claudeMdExcludes で Downloads の指示ファイルを読まない
claudeMdExcludes で@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
出典
- Forever Security「Markdown Is the New Executable」(2026-10-22): forever.security
- X: @yayutom_AI · 2026-10-27 、@ai_secu · 2026-10-27 、@masahirochaen · 2026-10-27 、@YamanekoInfo · 2026-10-27