悪意あるAGENTS.mdによるコーディングエージェントの乗っ取りを防ぐ方法

ダウンロードフォルダーにある悪意のあるAGENTS.mdによって、CodexやClaude Codeが乗っ取られる危険性があります。チームで実践すべき5つの対策:安全な起動フォルダーの指定、ファイルの事前レビュー、拒否ルールの設定、サンドボックスの活用、設定チェック。

Aiden Flux

Aiden Flux

12 11月 2026

要約: 悪意のある AGENTS.md は、このファイル本来の仕組みを悪用してコーディングエージェントを乗っ取ります。エージェントは起動時にこのファイルを読み込み、その指示に従ってしまうためです。Forever Security は2026年10月、実際の顧客の ~/Downloads フォルダでこれを発見しました。被害を防ぐには、管理下にないフォルダでエージェントを起動しないこと、指示ファイルをコード同様にレビューすること、設定やネットワークの書き換えを拒否すること、サンドボックスと承認プロンプトを有効にしておくこと、そしてエージェント自身の設定ファイルの変更を監視することが重要です。

悪意のある AGENTS.md による攻撃とは

悪意のある AGENTS.md とは、コーディングエージェントを有害な動作へと誘導するために作成されたプロジェクト指示ファイルです。Claude Code や Codex などのエージェントは、起動したフォルダからこれらのファイルを自動的に読み込みます。この攻撃にエクスプロイト(脆弱性攻撃)は必要ありません。エージェントが起動時にファイルを読み込み、その内容をプロジェクト固有のルールとしてそのまま受け入れてしまうためです。

ファイル自体は、パッケージをインストールする「事前準備(preflight)」ステップや、API トラフィックの送信先を変更する「プロキシ」メモなど、ごく普通の開発メモのように記述されています。しかしエージェントにとっては、「npm ではなく pnpm を使うこと」といった通常の指示と何ら変わりありません。

開発チームが複数のコーディングエージェントを運用している場合、Sharkly を使えば、タスクの割り当てやレビューを一元化できます。これがエージェントの起動場所をどのように変えるかについては、後ほど詳しく解説します。

コーディングエージェントが指示ファイルに従ってしまう理由

指示ファイルの内容はエージェントのコンテキスト内でプロンプトのすぐ隣に配置され、プロジェクトのルールとユーザーの要求との間に明確な境界線はありません。

Claude Code のメモリに関するドキュメントには、CLAUDE.md や AGENTS.md の内容は「強制力のある設定ではなく、コンテキストとして」扱われると記載されています。CLAUDE.md が存在しない場合、作業ディレクトリおよびその上位ディレクトリにあるすべての AGENTS.md が読み込まれます。Codex の AGENTS.md ガイドによると、プロジェクトルートからカレントディレクトリまで辿りながら見つかった内容を連結し、デフォルトで最大 32 KiB まで読み込みます。エージェントを起動した場所に近いファイルほど後から読み込まれるため優先されます。つまり、エージェントを起動するフォルダによって何が読み込まれるかが決まり、その親フォルダも影響を与えるのです。

悪意のある AGENTS.md が Codex や Claude Code を乗っ取る仕組み

2026年10月22日、Forever Security は顧客のノート PC で発見した事例を公開しました。コーディングエージェントが悪意のある既知の npm パッケージ function-color をインストールしようとしたのですが、その指示は ~/Downloads にあった AGENTS.md によるものでした。そのフォルダはエージェントの作業ディレクトリでもありました。Forever はコードが実行される前にインストールをブロックしたものの、ファイルがどのようにして配置されたのかまでは特定できませんでした。

Diagram of the attack chain: a web page silently saves AGENTS.md to the Downloads folder, a developer starts a coding agent there, the agent reads the file and rewrites its own config, and the result is a malicious npm package running or an OAuth token sent to an attacker server

ダウンロードフォルダが標的になる理由は、Web ページがユーザーのクリックなしで書き込める唯一のフォルダだからです。Forever はその後、検証環境でこの攻撃チェーンを再現しました。

  1. 攻撃者の管理下にあるページが、~/Downloads に AGENTS.md という名前のファイルを保存します。
  2. 開発者がそのフォルダで Codex を起動し、何らかの指示を出します。
  3. タスクを開始する前に、Codex は ~/.codex/config.toml に「project tools」サーバーを追加し、npm からパッケージをインストールします。
  4. この設定はマシン全体に適用されるため、以降に起動されるすべての Codex セッションが、どのフォルダからであっても攻撃者のサーバーを読み込むようになります。

Forever の報告によると、Codex は 90% 以上の確率でペイロードを実行しました。大半のテストでは電卓アプリを起動する無害なダミーが使用され、実際の不正パッケージは隔離された仮想マシン(VM)内で一度だけ実行されました。

Claude Code を欺くのはより困難でした。仕込まれた CLAUDE.md によって自身の API トラフィックを Forever の管理下にあるサーバーに向けさせられ、OAuth ログイントークンが漏洩し、サーバーがモデルになりすまして応答できるようになりました。Forever によると、この攻撃の成功率は約 50% でした。ただし、この2つの数値は異なる攻撃手法によるものなので、単純に成功率として比較すべきではありません。

Forever が指摘しているのは、「パッチを当てるべきバグは存在しない」ということです。問題の本質は、Web から書き込み可能なフォルダを、あたかも自分自身が作成したかのように信頼してしまう点にあります。これと同様の教訓は、Pillar Security による Rules File Backdoor の調査でも示されていました。この調査では、diff ではレビュアーに見えない不可視の Unicode 文字を使って、ルールファイル内に指示を潜ませていました。

悪意のある AGENTS.md を阻止する5つの対策

最初の2つのステップはファイルの読み込み自体を阻止し、残りの3つのステップは万が一ファイルが読み込まれてしまった場合の被害を最小限に抑えます。

Five defense layers between an untrusted instruction file and a developer laptop: never start agents in Downloads or home, review AGENTS.md and CLAUDE.md like code, deny config and network rewrites, keep sandbox and approval prompts on, watch config files and rotate

1. コーディングエージェントを決して起動してはならない場所

~/Downloads、ホームフォルダ、または自分で作成していないフォルダでは絶対に起動しないでください。Forever によると、顧客の約半数が Downloads フォルダ内でコーディングエージェントを実行していました。ダウンロードしたファイルをエージェントに整理させたい場合は、ファイルを新しい空のフォルダにコピーし、そこでエージェントを起動してください。

つい忘れがちな人には、シェルガードを設定してルールを徹底させるのが効果的です。

# ~/.zshrc: refuse to start an agent in folders the web can write to
agent_guard() {
  case "$PWD" in
    "$HOME"|"$HOME/Downloads"*|"/tmp"*)
      echo "Refusing to start an agent in $PWD. Use a project folder." >&2
      return 1 ;;
  esac
}
claude() { agent_guard && command claude "$@"; }
codex()  { agent_guard && command codex "$@"; }

2. AGENTS.md をコードと同様にレビューする方法

5分前にクローンしたばかりのリポジトリであっても、すべての指示ファイルを実行可能ファイル(実行コード)と同等に扱ってください。その上で、レビューを自動化します。指示ファイルを CODEOWNERS の管理下に置き、それらを変更するプルリクエストには指定レビュアーの承認を必須にします。

AGENTS.md            @your-org/platform
**/AGENTS.md         @your-org/platform
CLAUDE.md            @your-org/platform
/.claude/            @your-org/platform
/.cursor/rules/      @your-org/platform

これらの攻撃で悪用されるパターン(不可視 Unicode、ベース URL の変更、指示ファイル内でのインストールコマンド)を検出し、失敗させる CI チェックを追加します。

#!/usr/bin/env bash
# ci/check-agent-instructions.sh
files=$(git ls-files '*AGENTS.md' '*CLAUDE.md' '.cursor/rules/*')
[ -z "$files" ] && exit 0
fail=0
# zero-width, bidi override and Unicode tag characters
if grep -nP '[\x{200B}-\x{200F}\x{202A}-\x{202E}\x{2066}-\x{2069}\x{E0000}-\x{E007F}]' $files; then
  echo "Hidden Unicode in an agent instruction file"; fail=1
fi
if grep -niE 'BASE_URL|chatgpt_base_url|mcp_servers|npx --yes|curl .*\| *(ba)?sh' $files; then
  echo "Config, network or install instruction in an agent file: needs review"; fail=1
fi
exit $fail

2つ目の grep は正当な記述も検出する場合がありますが、いずれにせよ目視による確認が必要です。

3. エージェント自身による設定の書き換え権限を拒否する

再現実験では、いずれもエージェントが自身の設定を書き換えることで攻撃が成立していました。その手段を排除しましょう。Claude Code では、エージェントの設定フォルダへの編集を拒否し、プロジェクトの .claude/settings.json でシークレット情報を読み取り不可に設定します。

{
  "permissions": {
    "deny": [
      "Edit(./.claude/**)",
      "Edit(~/.claude/**)",
      "Edit(~/.codex/**)",
      "Read(./.env)",
      "Read(./.env.*)"
    ]
  }
}

チーム運用の場合は、プロジェクト固有のファイルによって設定が緩和されないよう、管理設定(managed settings)でこれらを定義してください。Claude Code のメモリドキュメントでは、強制すべき項目として管理対象の permissions.deny、sandbox.enabled、env が挙げられており、モデルの判断に関わらずアクションを阻止する手段として PreToolUse フックが推奨されています。管理対象の env で API ルーティングを固定することは、ベース URL 攻撃への直接的な対策になります。展開する前に、インストールされているバージョンに対応するルール構文を確認してください。

4. サンドボックスと承認プロンプトを有効にしておく

Forever は、承認ゲートとサンドボックスを有効にしたままにし、それらをバイパスするようエージェントに指示する文言を決して信用しないようアドバイスしています。

パッケージのインストール、エージェント設定の変更、新しいホストへのネットワーク呼び出しなど、人間の確認のために必ず一時停止すべきアクションを定めておきましょう。どこで停止を挟むべきかについてはコーディングエージェントの承認ゲートに関する記事で、その背後にある権限モデルについてはコーディングエージェントに許可すべきこと・すべきでないことで解説しています。

5. エージェントの設定を監視し、異常検知時は認証情報をローテーションする

Forever は確認すべき箇所を明確に挙げています。~/.codex/config.toml の予期しない [mcp_servers.*] ブロックや変更された chatgpt_base_url。プロジェクトの .claude/settings.json にある身に覚えのない ANTHROPIC_BASE_URL、プロキシ、あるいはエンドポイントの設定などです。

grep -nE '^\[mcp_servers\.|chatgpt_base_url' ~/.codex/config.toml
grep -rnE 'ANTHROPIC_BASE_URL|_PROXY|base_url' ~/.claude/settings.json .claude/settings*.json 2>/dev/null
npm ls -g --depth=0 2>/dev/null | grep -i function-color

もし何か見つかった場合は、トークンが漏洩したものとみなし、直ちにローテーションしてください。盗まれた OAuth トークンは単一のリクエスト傍受ではなく、アクティブなセッションそのものです。もし function-color が見つかった場合は、そのコンピュータが侵害されたと判断すべきです。広範なクリーンアップ対応については、各ローテーション手順の担当者を定めたコーディングエージェントのシークレット漏洩対策チェックリストを参照してください。

Sharkly が果たす役割

Sharkly は指示ファイルをスキャンしたり、エージェント自身の権限管理を代替したりするものではありません。前述の5つの対策は引き続き必要です。Sharkly が変えるのは、エージェントが「どこで起動するか」、そして「それを誰が決めるか」です。

Sharkly では、接続した Computer 上で Agent が動作し、各 Agent の設定には Default working directory(デフォルト作業ディレクトリ)が用意されています。「Use temporary directory(一時ディレクトリを使用)」を選択すると、Task の実行ごとに個別のディレクトリと、バインドされたリポジトリのクリーンな git worktree が割り当てられます。「Specified directory(指定ディレクトリ)」を選択すると、あらかじめ設定したローカルパスで実行されます。両モードの詳細については、作業ディレクトリに関するドキュメントで解説されています。

Sharkly Agent settings: the Default working directory field, where you choose a temporary directory with a fresh git worktree per run or a specified directory

これにより、起動フォルダの決定権が個々の開発者のターミナルから、レビューされた設定へと移行します。Temporary モードでは、Agent は誰かがたまたま開いていたフォルダではなく、バインドされたリポジトリのクリーンなチェックアウト環境で起動します。リポジトリの管理は、Space または Organization の管理者権限を持つユーザーに制限されます。また、実行ごとに挿入される Agent instructions は、「エージェントの設定ファイルを編集してはならない」といったルールを改めて徹底させるのに適した場所です。

結果は Task に戻され、チームでレビューされます。詳細については、タスクレベルのエビデンスを活用した AI 生成コードのレビュー方法で解説されています。

まとめ

悪意のある AGENTS.md が機能してしまうのは、エージェントが指示ファイルに従うように設計されており、Web から信頼されたフォルダへとファイルが仕込まれる可能性があるためです。これに対する防御はパッチによるものではなく、多層防御によって実現する必要があります。

まずは今日、すべての開発者のノート PC でステップ5を実施することから始めましょう。すでに問題が発生しているかどうかを把握できるためです。その上で、チームが複数のコーディングエージェントを運用している場合は、Sharkly を導入し、Temporary モードの Computer と Agent を1つ設定して、すべての実行がクリーンな worktree から開始されるようにしましょう。

よくある質問(FAQ)

悪意のある AGENTS.md は Claude Code を乗っ取ることができますか?

はい、可能です。Claude Code は、作業ディレクトリまたはその上位ディレクトリに CLAUDE.md が存在しない場合、AGENTS.md を読み込みます。Forever による Claude Code の再現実験では、仕込まれた CLAUDE.md によって API トラフィックが迂回され、テストの約半数で OAuth トークンが漏洩しました。

これは OpenAI や Anthropic がパッチで修正する脆弱性ですか?

Forever は、エージェントは設計通りに動作しているため、パッチを当てるべき脆弱性はないと主張しています。フォルダの衛生管理、レビュー、そして適切な権限制御によって対策を行う必要があります。

AGENTS.md 内の隠蔽された指示を見つけ出すにはどうすればよいですか?

レンダリングされた表示ではなく raw(プレーンテキスト)ファイルを直接確認し、ゼロ幅文字、双方向テキスト(BiDi)制御文字、Unicode タグ文字が含まれていないかスキャンしてください。上記の CI スクリプトは、これら3つのパターンすべてを検出してエラーにします。

サンドボックスで悪意のある AGENTS.md を阻止できますか?

被害を抑えることはできますが、読み込み自体を防ぐことはできません。サンドボックスと承認プロンプトを併用することで、ファイルが要求するインストール処理や設定の書き換えを阻止できます。エージェントの設定フォルダに対する拒否(deny)ルールと組み合わせて運用してください。

仕込まれた AGENTS.md を見つけた場合はどうすればよいですか?

その付近でエージェントを起動しないでください。エージェントの設定ファイルに見覚えのない MCP サーバーやベース URL が追加されていないか確認し、function-color の存在をチェックした上で、エージェントのトークンや読み取り可能だったすべての API キーをローテーションしてください。

関連記事

Gemini 4 CarbonとHydrogen:プランナーエージェントと高速ワーカーを組み合わせる

Gemini 4 CarbonとHydrogen:プランナーエージェントと高速ワーカーを組み合わせる

エージェントチーム全体でGemini 4 CarbonとHydrogenを連携させましょう。Carbonプランナーがサブタスクを作成し、Hydrogenワーカーと検証役がビルドとテストを行い、ブロックされた作業はプランナーへと差し戻されます。

13 11月 2026

コーディングエージェント向けGemini 4 Hydrogen:チームのエージェントが一日中稼働できる高速モデル

コーディングエージェント向けGemini 4 Hydrogen:チームのエージェントが一日中稼働できる高速モデル

コーディングエージェント向けGemini 4 Hydrogen:100万トークンあたり1.50ドル/7.50ドル、無料枠、4段階の思考レベル。任せるべきタスクと、Carbonへエスカレーションすべきタイミング。

13 11月 2026

Gemini Decisions APIでAIエージェントのタスクをルーティングする方法

Gemini Decisions APIでAIエージェントのタスクをルーティングする方法

Gemini Decisions API による AI エージェントのタスクルーティング:1 回の呼び出しで担当エージェント、タスクの難易度、人間の判断が必要かを判定し、信頼度のしきい値に基づいて自動割り当てか人による確認かを振り分けます。

12 11月 2026