戻る

2026/10/29

悪意ある AGENTS.md と CLAUDE.md:Downloads フォルダーが AI コーディングエージェントを乗っ取る仕組み

Downloads に置かれた指示ファイルが AI コーディングエージェントに npm マルウェアを入れさせようとしました。経緯と研究結果、対策を解説します。

重要なポイント

  • ユーザーの ~/Downloads フォルダーに仕込まれた AGENTS.md ファイルが、既知の悪意ある npm パッケージをインストールするよう AI コーディングエージェントに指示しました。この試みは、コードが実行される前に阻止されました。
  • 検証環境でのテストでは、OpenAI Codex は 90% を超える試行で悪意ある指示ファイルに従いました。Claude Code が従ったのは約半数でした。
  • これはパッチで直せるバグではありません。エージェントは起動したフォルダーにある指示ファイルを信頼し、ブラウザーは Downloads にファイルを書き込めるからです。
  • 主な対策はシンプルです。エージェントを Downloads で起動しない、自分で書いていない指示ファイルは読んで確認する、エージェントの設定に身に覚えのないエンドポイントがないか確認する、承認とサンドボックスを有効のままにする、の 4 点です。

何が起きたのか

2026 年 10 月 22 日、セキュリティ企業 Forever Security は、Gal Weizman 氏と Omer Samet 氏による記事 「Markdown Is the New Executable」 を公開しました。この記事は、同社の顧客のマシンで実際に起きたインシデントを説明しています。AI コーディングエージェントがユーザーの ~/Downloads フォルダーで作業しており、そのフォルダーにあった AGENTS.md ファイルが、悪意ある npm パッケージ function-color をインストールするよう指示していました。Forever は、パッケージがインストールされる前、そして悪意あるコードが実行される前にエージェントを停止しました。

このファイルがどのように Downloads フォルダーに入ったのかは分かっていません。Forever は特定できなかったと述べており、BleepingComputer と The Hacker News の報道も同じ点を伝えています。その後 Forever は、Web ページがこうしたファイルをどのように仕込めるのか、またエージェントがそれをどう扱うのかを示す検証デモを作成しました。

パッケージ自体は新しいものではありません。Checkmarx と CloudSEK は、function-color を MALFEX という npm キャンペーンと結び付けています。このパッケージは function-flag を読み込むだけの薄いラッパーです。そして function-flag のインストールスクリプトが、リモートサーバーから別のペイロードをダウンロードして実行します。このキャンペーンは Windows を標的としており、Checkmarx によると運営者は 2023 年 8 月から活動しています。2026 年 10 月 29 日に npm レジストリを確認したところ、function-color、function-flag、cdn-img-fetch はいずれも npm の 0.0.1-security プレースホルダーに置き換えられていました。

なぜ Markdown ファイルでエージェントを操れるのか

Forever の主張は、単独ではごく普通の 2 つの動作が組み合わさると危険になる、という点に基づいています。

  1. エージェントは指示ファイルを自動的に読み込みます。 コーディングエージェントは起動時にプロジェクトの指示ファイルを読み、それをユーザーからのガイダンスとして扱います。Codex は、プロジェクトのルートから現在のフォルダーまでの AGENTS.md を読み込みます。プロジェクトのルートがない場合は、現在のフォルダーのものだけを読み込みます。Claude Code は、起動したフォルダーとその上位にあるすべてのフォルダーから CLAUDE.md を読み込みます。CLAUDE.md がない場合は、代わりに AGENTS.md を読み込みます。
  2. Web から Downloads に書き込めます。 BleepingComputer によると、Chrome、Edge、Firefox はデフォルトで、保存先を確認せずにファイルを Downloads に保存します。ファイル名と内容は Web ページ側で決められます。Markdown ファイルはプログラムではないため、ダウンロードした実行ファイルに対する OS のチェックでも危険とは見なされません。

この 2 つが合わさると、Web ページが置いたファイルを、エージェントが後で指示として読み込むことになります。エージェントは通常の意味で「だまされる」必要すらありません。設計どおりに動いているだけです。Forever はさらに、自分で Web を閲覧するエージェントもあると指摘しています。その場合、ダウンロードが起きたことに誰も気付かない可能性があります。

同じ考え方は Downloads 以外にも当てはまります。信頼できないコンテンツが届くフォルダーはすべて対象になり得ます。たとえば、クローンしたばかりのリポジトリ、展開したアーカイブ、共有フォルダーなどです。Claude Code の場合、Downloads のサブフォルダーに展開したプロジェクトでも、Downloads 直下にある CLAUDE.md が読み込まれます。上位フォルダーのファイルも読み込まれるためです。

研究で示されたこと

Forever は 2 つのエージェントをテストしました。ほとんどの試行では無害な代替ペイロード(電卓を開くもの)を使いました。実際の悪意あるパッケージは、隔離された仮想マシン内で一度だけ実行されました。

OpenAI Codex

研究者は、顧客のマシンにあった実際の AGENTS.md を再利用しました。このファイルは、マシン全体に適用される Codex の設定ファイル ~/.codex/config.toml に MCP サーバーのエントリーを追加するよう指示していました。そのエントリーは起動時にコマンドを実行し、npm パッケージをインストールするものでした。設定がグローバルであるため、この変更はファイルを読んだセッションだけでなく、そのマシンで以後に起動するすべての Codex セッションに残ります。Forever によると、攻撃にはいくつかの工夫が必要でした。長く退屈な文書スタイル、サンドボックスを回避するフラグ付きで起動した子セッション、そして Codex の起動タイムアウトを避ける起動方法です。それでも、Codex は 90% を超える試行でペイロードを実行しました。

Claude Code

Claude Code については、研究者は独自の CLAUDE.md を作成し、社内 API ゲートウェイのセットアップメモのように見せかけました。このファイルは、プロジェクトの .claude/settings.json に ANTHROPIC_BASE_URL の設定を書き込み、API 通信を研究者が管理するサーバーへ向けるよう Claude に求めるものでした。Forever によると、これによりセッションの OAuth トークンが漏えいします。さらに攻撃者のサーバーがモデルになりすまし、サンドボックスを無効にしたシェルコマンドを含むツール呼び出しを返すことも可能になります。Forever は、トークンの窃取(トークンを再利用して被害者になりすますこと)と、次回起動時のコード実行を実証しました。また、サブエージェントを起動することで同じセッション内で攻撃を発動させる経路も示しました。

こちらは成功率が低めでした。Claude Code は設定ファイルへの書き込み前に承認を求め、不審な変更を拒否することも多くありました。Forever によると成功率は約半分で、同一セッション内でサブエージェントを使う経路では約 5 回に 1 回でした。

示されなかったこと

  • 実際のファイルが顧客の Downloads フォルダーにどのように届いたのか、Forever は特定していません。Web ダウンロード経由という経路は、実証された可能性であり、確認された原因ではありません。
  • テストされたのは Codex と Claude Code のみです。Forever は、指示ファイルを読み込む他のエージェントも同じように影響を受けると主張していますが、テストはしていません。
  • 各記事は具体的なツールのバージョンを挙げておらず、ベンダーの声明も伝えていません。Forever の立場は「OpenAI や Anthropic がパッチを当てるべきものは何もない」、つまりエージェントは設計どおりに動いている、というものです。

なぜ重要なのか

指示ファイルはドキュメントのように見えるため、見落とされがちです。しかし実際には設定ファイルとして働き、シェルにアクセスできるエージェントを通じてコードのように働くこともあります。次の 3 点が、このリスクを現実的なものにしています。

  • エージェントは Downloads で起動されることが多いです。 ファイルの整理や、ダウンロードしたばかりのものの作業にエージェントが使われます。Forever は BleepingComputer に対し、数百社の顧客が Downloads からコーディングエージェントを実行しており、そこで起動された Claude Code セッションは 1,300 件を超えると述べています。
  • 影響はセッションが終わっても残ります。 変更されたグローバル設定、新しい MCP サーバー、リダイレクトされた API エンドポイントは、元のファイルを削除した後も機能し続けます。
  • 狙われるのは認証情報です。 盗まれたエージェントのセッショントークンは、そのまま使えるログイン情報です。攻撃者はマシン上でコードを実行しなくても、それを使えます。

実践的な対策

1. エージェントを起動する場所を選ぶ

  • コーディングエージェントを ~/Downloads や、ブラウザー、メール、チャットアプリが書き込むフォルダーで起動しないでください。先に作業内容を専用のワークスペースフォルダーへ移動するか、クローンしてください。
  • ホームディレクトリでの起動も避けてください。特定のプロジェクトフォルダーで起動しましょう。BleepingComputer によると、OpenAI と Anthropic も同じことを推奨しています。
  • ダウンロードのたびに保存先を確認するようブラウザーを設定することも検討してください。クリックが 1 回増えますが、気付かないうちにダウンロードされることを防げます。

2. 自分で書いていない指示ファイルを探す

信頼できないファイルが置かれやすい場所と、ホームフォルダーを検索します。Linux と macOS では次のとおりです。

find ~/Downloads ~/Desktop ~ -maxdepth 3 \( -name AGENTS.md -o -name AGENTS.override.md -o -name CLAUDE.md -o -name CLAUDE.local.md \) -print 2>/dev/null | sort -u

Windows では PowerShell で次のとおりです。

Get-ChildItem $HOME\Downloads, $HOME\Desktop -Recurse -Depth 3 -Force -ErrorAction SilentlyContinue -Include AGENTS.md, AGENTS.override.md, CLAUDE.md, CLAUDE.local.md | Select-Object FullName, LastWriteTime

見つかったファイルは、エージェントに触れさせる前にすべて読んでください。パッケージのインストール、サーバーの追加、API エンドポイントの変更、承認の無効化を指示する内容には十分注意してください。また、すべてのセッションに適用される個人用の指示ファイル ~/.codex/AGENTS.md と ~/.claude/CLAUDE.md も確認してください。

正当なプロジェクトの指示ファイルは、そのプロジェクトのビルド方法やテスト方法を説明するものです。エージェントのグローバル設定、API エンドポイント、セキュリティ設定を変更する理由はありません。そうした変更を求めるファイルは、悪意あるものとして扱ってください。

3. 身に覚えのない変更がないかエージェントの設定を確認する

Forever の助言に従い、想定外の MCP サーバーのブロック、変更された chatgpt_base_url、自分で設定していない ANTHROPIC_BASE_URL やその他の API エンドポイントがないか確認します。

grep -nE '^\[mcp_servers|base_url' ~/.codex/config.toml
grep -nE 'BASE_URL|mcpServers' ~/.claude/settings.json .claude/settings.json .claude/settings.local.json .mcp.json 2>/dev/null

Claude Code を使うチームは、マネージド設定によって設定を一元的に強制できます。また、ConfigChange フックを使って、セッション中の設定変更を監査したりブロックしたりすることもできます。

4. ガードレールを有効のままにする

  • 承認プロンプトとサンドボックスは有効のままにしてください。Codex の --dangerously-bypass-approvals-and-sandbox や Claude Code の --dangerously-skip-permissions のような、これらを回避するフラグは、使い捨ての環境以外では使わないでください。
  • 設定ファイルに関する承認プロンプトは注意して読んでください。Claude Code のテストでは、約半数のケースで攻撃を止めたのはこの承認ステップでした。
  • 新しいフォルダーで Claude Code のワークスペース信頼ダイアログを承認する前に、内容を読んでください。
  • 信頼できないリポジトリやダウンロードしたファイルは、メインのワークステーションではなく、仮想マシンや開発コンテナー内で扱ってください。
  • npm では、既知の MALFEX パッケージをブロックし、内容を確認していないインストールには ignore-scripts の利用を検討してください。

5. 仕込まれたファイルを見つけた場合

  1. そのフォルダーでエージェントを起動しないでください。調査用にファイルのコピーを保存してから、フォルダーから削除してください。
  2. 上記のエージェント設定ファイルを確認し、自分で追加していないものを削除してください。
  3. エージェントのセッショントークンが漏えいした可能性があると考えてください。サインアウトして再度サインインし、エージェントがアクセスできた API キーをすべてローテーションしてください。
  4. ロックファイルと node_modules フォルダーで function-color と function-flag を検索してください。どちらかがインストールされていた場合は、マシンが侵害されたものとして扱い、インシデント対応プロセスに従ってください。

全体像

Forever の記事タイトルは「Markdown Is the New Executable(Markdown は新しい実行ファイル)」です。これは、エージェントが指示として読み込むあらゆるファイルを考えるうえで役立つ見方です。指示ファイルは、シェルにアクセスできるエージェントが次に何をするかを決めます。そのため、スクリプトと同じように扱う必要があります。出どころを把握し、変更をレビューし、インターネット上の誰もが書き込めるフォルダーには置かないことです。ここで紹介した対策は、パッチではなく主に習慣であり、導入のコストもわずかです。

参考資料