要点
- パソコンのダウンロードフォルダに、AI への指示を書いたファイル
AGENTS.mdが仕込まれていた。セキュリティ企業 Forever Security が見つけたもので、AI コーディングエージェントにマルウェア入りの部品を入れさせようとしていた。 - Forever Security の検証では、OpenAI の Codex は9割を超える試行で仕込まれた部品を実行した(ほとんどの試行は電卓を開くだけの無害な代わりの部品を使った)。Claude Code は約半分の試行で設定ファイルを書き換えられ、そうなると次に起動したときにコードを実行される状態になった。
- ソフトの欠陥ではなく「起動した場所の指示ファイルを読む」という仕様が入口なので、エージェントをどこで起動するかに、利用者が気をつける必要がある。
何が起きたか
AI コーディングエージェントは、頼まれてプログラムを書いたり、コマンドを実行したりする AI のツールだ。Codex、Claude Code、Cursor などがある。
AGENTS.md は、こうしたエージェントに「このプロジェクトではこう作業して」と伝えるためのテキストファイルである。エージェントは作業の前にこのファイルを自動で読む。
Forever Security は2026年10月22日付のブログで、顧客のパソコンのダウンロードフォルダで悪意のある AGENTS.md を見つけたと公表した。中身は、エージェントに function-color という npm パッケージ(JavaScript のプログラム部品)を入れさせようとするものだった。
Web サイトからのダウンロードは、利用者が何も押さなくても始まることがあり、行き先はたいていダウンロードフォルダになる。そこで起動したエージェントは、置いた覚えのないファイルも作業の指示として扱ってしまう。Forever Security の計測では、顧客のおよそ半数がダウンロードフォルダの中でエージェントを動かしていた。ただし、計測した期間や対象の数は書かれていない。
Forever Security は、この手口が主なエージェントでどこまで通じるかも試した。Codex は、9割を超える試行で仕込まれた部品を実行した。ただし、試行のほとんどは電卓を開くだけの無害な代わりの部品を使ったもので、本物のマルウェアを動かしたのは、隔離した仮想マシンの中での1回だけだった。
Claude Code については、Forever Security が自分で用意した CLAUDE.md で試した。試行の約半分で、エージェントの通信先を Forever Security のサーバーに向け直す設定ファイルが書き込まれた。そうなると、次にそのフォルダで起動したときにコードを実行される状態になる。書き込んだその作業の中でコードまで動いたのは、約5分の1だった。通信先が変わると、ログイン情報も向け直した先に届く。
顧客のパソコンでは、コードが動く前に Forever Security が止めたと報告されている。Forever Security はこれを脆弱性(ソフトの欠陥)とは見ていない。エージェントは設計どおりに動いただけで、「OpenAI や Anthropic が直すものは無い」というのが Forever Security の立場だ。
日本の利用者への影響
AGENTS.md は特定の会社のものではない共通の書式なので、どのツールでも同じことが起こりうる。今回の報告に日本の組織や利用者が含まれるかは書かれていない。
入れさせようとしていた function-color は、npm で広がったマルウェアの一群 MALFEX の一部だ。Checkmarx の分析によると、function-color は別のパッケージを引き込み、それが外からプログラムを落としてくる。ただ、落としてくる先のサーバーが応答しておらず、最後に何が入るのかは分かっていない。
この経路は Windows にしかないフォルダの場所を使うので、Mac や Linux では処理が黙って失敗し、Windows だけが被害を受ける。
function-color はすでに npm から取り下げられている。気をつけたいのは、以前に入れたことのある Windows のパソコンと、古い版を指定したまま使い続けているプロジェクトである。
今すぐやること
Forever Security と Checkmarx の勧めをもとに、次をまとめた。
- ダウンロードフォルダとホームフォルダに、自分で作った覚えのない
AGENTS.mdやCLAUDE.mdが無いか見る。 見つけたら、エージェントに読ませる前に中身を確かめ、不要なら消す。 - エージェントは、作業するプロジェクトのフォルダに移ってから起動する。 ダウンロードフォルダやホームフォルダでは起動しない。今回いちばん効く対策だ。
- 開発の担当者に、エージェントの設定ファイルに覚えのない変更が無いか確かめてもらう。 知らない道具や接続先が足されていたら、ログイン情報を作り直す。
- 実行前に人へ確認を求める設定と、エージェントにできることを狭める設定を、切らずに使う。 「確認なしで何でも実行させる」設定は、この種の攻撃に対する最後の壁を外すことになる。
- MALFEX のパッケージが入っていないかも確かめてもらう。 Checkmarx は、影響のあるパッケージが Windows に入っていた場合、
node_modulesを消したあとでも、そのパソコンを乗っ取られたものとして扱うよう勧めている。調べ終わるまでネットにはつながず、パスワードの変更は別の端末から行う。
背景
エージェントは「起動した場所は利用者のもので、そこにあるファイルは信用できる」という前提で動く。ダウンロードフォルダには外から勝手にファイルが入ってくるので、この前提が崩れる。この件はプロンプトインジェクション(AI に読ませる文章に命令を紛れ込ませ、AI を勝手に動かす攻撃)として語られることが多い。だが、どこでエージェントを起動するかという、使い方と設定の問題として見たほうが対処しやすい。
運び込まれようとした MALFEX も、長く気づかれなかった。npm レジストリの記録では、function-color の最初の版は2025年7月に公開され、取り下げられて安全な版に差し替えられたのは2026年10月だった。npm には1年以上、およそ15か月残っていたことになる。function-color と function-flag には、OSV(公開ソフトの脆弱性やマルウェアをまとめるデータベース)の注意書きがまったく付いていなかった。
技術者向けの詳細
- 確認:
npm ls function-flag function-color cdn-img-fetch img-to-native native-runner tlxbnhd tldriver mxdriver --all。package-lock.json/pnpm-lock.yaml/yarn.lockもパッケージ名で検索する。社内プロキシや private registry のキャッシュも見る。 - npm 上の扱い:
function-color1.0.0(2025-07-18 公開)と 1.7.3(2025-08-04 公開)が取り下げられ、2026-10-07 20:59 UTC(日本時間 10-08 5:59)に0.0.1-securityへ。 - 動作(Checkmarx の分析による): 悪さをするのは依存先の
function-flag(postinstall で取得処理を行う)。保存先のパスにprocess.env.APPDATAを使うので、Windows 以外では何もせず終わる。取得するはずのnode.exeは配布元が応答しておらず、未回収。 - ほかの経路(Checkmarx の分析による): Overlord RAT(
tlxbnhdなど。Windows 専用)と、情報窃取ツールmovinlike(native-runner→img-to-native→cdn-img-fetchのつながりで入る)。同じ運営者とみられるが、movinlikeとfunction-flagをつなぐものは今のところ見つかっていない。 - 侵入された跡(Checkmarx):
%LOCALAPPDATA%\ScopeSmart Technologies Inc\、5分ごとのスケジュールタスク\Maiden、%APPDATA%\Microsoft\Windows\node_runtime_helper.exe、%APPDATA%\node.exe。node_modulesを消しても残る。 - 検証で書き換えられた設定(Forever Security の報告): Codex は
~/.codex/config.toml(MCP サーバーの追加)。Claude Code は.claude/settings.json(ANTHROPIC_BASE_URL)。どちらも監視対象に入れる。 - Claude Code:
AGENTS.mdの読み込みは v2.1.277 以降。permissions.blockReadsOutsideWorkingDirectories: true(v2.1.257 以降)にすると、ファイル用の道具(Read/Grep/Glob/LSP)が作業ディレクトリの外にあるファイルの読み込みを拒否する。シェルのコマンドは同じようには拒否されず、外のファイルを読むときは確認を求められる。読む指示ファイルは/configの Project instructions で選べ、claude-mdではAGENTS.mdを読まず、CLAUDE.mdは読む。 - 承認:
"bypassPermissions"と--dangerously-skip-permissionsは避ける。permissions.denyのBash(npm install:*)は文字列一致で、ドキュメントは「セキュリティ境界ではない」とする。確実に止めるならサンドボックスかPreToolUseフック。 - Codex:
approval_policy = "never"とsandbox_mode = "danger-full-access"は避ける。プロジェクトの.codex/config.tomlは信頼済みプロジェクトからしか読まれないので、覚えのないディレクトリを信頼済みにしない。