Joifup Blog

Downloads に置かれた AGENTS.md の件、自分の環境を確かめる手順

2026-10-27

この記事は zenn.dev(新しいタブで開きます) にも掲載しています。

10月26日の朝、X で「~/Downloads で Claude Code や Codex を起動するな」という投稿が流れてきました。65万回以上表示されていた投稿です。私は Downloads でエージェントを起動することはありませんが、読んでいて1つ知らなかったことがありました。Chrome の初期設定では、Web ページを開くだけで、確認なしに ~/Downloads にファイルが保存されることです。

元の報告を読み、自分の環境も確かめたので、その手順をまとめます。手順だけ見たい人は「自分の環境を確かめる」へ飛んでください。内容は 2026年10月27日時点のものです。

何が起きたのか

セキュリティ会社の Forever Security が、10月22日に報告を出しました。同社の顧客のパソコンで、コーディングエージェントが既知の不正な npm パッケージ(function-color)を入れようとしたのを、コードが動く前に止めた。たどると、その人はエージェントを ~/Downloads で起動していて、エージェントはそこに置かれていた AGENTS.md の指示に従っていた、という内容です。ファイルがどうやって置かれたかは分かっていません。

報告が指摘しているのは、それぞれ単独では問題にならない2つのことの組み合わせです。

  • エージェントは、起動したフォルダにある AGENTS.md や CLAUDE.md を、プロジェクトの指示として読んで従う
  • Web ページは、クリックも許可の確認もなしに ~/Downloads にファイルを保存できる。名前も中身もページの側が決められる

この2つがそろうと、Web ページがエージェントへの指示を Downloads に置けて、そこでエージェントを起動した人の手元でその指示が実行されます。Forever は、ページを開くだけで AGENTS.md が Downloads に保存される試作のページを作っていて、報じた BleepingComputer も、害のない中身のファイルが保存されることを確かめています。Chrome・Edge・Firefox は初期設定で保存先を聞かずに保存します(ダウンロードの知らせは出ます)。人が起動しなくても、エージェントが自分でブラウザを開いて作業している間に、誰も見ていないところでファイルが置かれることもありえる、と Forever は指摘しています。

Forever は2つのエージェントで再現を試しています。

  • Codex: 見つかったファイルは、Codex の全体の設定 ~/.codex/config.toml に MCP サーバーを書き足させ、サンドボックスと承認を外すフラグを付けた別の Codex を起動させて、パッケージを入れさせるものでした。人の承認は一度も要りませんでした。Codex がフォルダの AGENTS.md に従うのは、信頼したフォルダだけですが、一度 Downloads で作業していれば、そこも当てはまります。電卓を出すだけの害のない中身で試した試験では、9割超で最後まで進みました。本物のファイルとマルウェアも、隔離した仮想マシンで1回動かしています。全体の設定に書かれるので、そのあとはどのフォルダで Codex を起動してもそのサーバーが読み込まれます
  • Claude Code: Forever が作った CLAUDE.md で、プロジェクトの設定に ANTHROPIC_BASE_URL を書かせ、API の通信を自分たちのサーバーに向けさせました。この書き込みには人の承認が要り、Claude Code 自身が断ることも多かったものの、書き込みまで進んだのは試験の約半数でした。書き込まれると、通信のたびにログインのトークンがそのサーバーに渡ります。次にそのフォルダで起動したときには、サーバーがモデルのふりをして、サンドボックスを外したコマンドを返せます。約5分の1は、サブエージェントを経由して、同じセッションのうちにコードの実行まで進みました

Forever によると、同社の顧客の企業の約半数で、Downloads でエージェントが動いていました。BleepingComputer の取材では、数百の顧客が Downloads からエージェントを動かしていて、Claude Code だけでも Downloads からの起動が1,300回を超えていたそうです。私が調べた範囲では、この件についての Anthropic・OpenAI の声明や、国内の公的機関の注意喚起はまだ見当たりませんでした。両社はふだんから、作業するプロジェクトのフォルダでエージェントを起動するよう勧めています。

広まっている投稿との違い

X で広まった投稿は、Claude Code の流れや、実際の攻撃が見つかったこと、自分で守るしかないという結論など、大筋は元の報告のとおりです。違うのは次の3つでした。

投稿元の報告
過去30年、Chrome はページがポップアップなしで Downloads にファイルを置くのを許してきた報告の「30年」は、30年続いた安全の決まりが崩れたという言葉。Downloads への書き込みは「何十年も前から」で、Chrome に限らない Web 全体の話
開発者の50%近くが Downloads でエージェントを起動しているForever の顧客の企業の約半数。開発者の割合ではない
公式の結論として CVE は無く、OpenAI と Anthropic は修正しないCVE には報告も報道も触れていない。「両社が直すものは無い」は Forever の見方で、両社の声明ではない

Forever はエージェントを見張る製品を売っている会社です。報告の書き方が強めなのは、その立場もあると思います。ただ、報告は「何も買わなくても今日から対策できる」として、製品なしでできる手順を挙げています。Web ページが確認なしに Downloads にファイルを置けることと、エージェントがフォルダの指示書に従うことは、どちらも事実です。Downloads でエージェントを起動しないほうがいいという結論は変わりません。

自分の環境を確かめる

macOS で私の手元で動かして確かめたコマンドです。BSD と GNU の find・grep の両方で動くことも確かめているので、Linux でも使えます(Windows は対象外です)。どれも読むだけで、何も書き換えません。Claude Code の中ではなく、ふつうのターミナルで動かしてください。

macOS では、ターミナルが書類やデスクトップなどを読む許可を求めるダイアログが出ることがあります。許可しなかったフォルダは調べられません。エラーの行が出たら、その場所は調べられていません。

1. Downloads に覚えのない指示書や設定が無いか

find ~/Downloads/ -maxdepth 2 \( -iname 'AGENTS.md' -o -iname 'AGENTS.override.md' -o -iname 'CLAUDE.md' -o -iname 'CLAUDE.local.md' -o -name '.claude' -o -name '.codex' -o -name '.mcp.json' \)

Downloads とその1つ下のフォルダ(展開した zip の中など)から、エージェントの指示書と設定のフォルダを探します。macOS は大文字と小文字を区別しないので、agents.md のような名前も拾うようにしています。何も出なければ、このコマンドが探す名前のファイルはありません。出てきたら、エージェントに読ませずに、エディタで中身を見てください。clone したばかりのリポジトリも、同じように見ておくと安心です。

2. Claude Code の設定に、覚えのない接続先が無いか

grep -lE 'BASE_URL|_PROXY|apiKeyHelper' ~/.claude/settings*.json
find ~ -maxdepth 7 -path "$HOME/Library" -prune -o -path '*/.claude/settings*.json' -exec grep -lE 'BASE_URL|_PROXY|apiKeyHelper' {} + 2>/dev/null

1行目は全体の設定、2行目はホームの下の各プロジェクトの設定(.claude/settings.json・.claude/settings.local.json)を見ます。ANTHROPIC_BASE_URL のような接続先、プロキシ、API キーを返すスクリプトの設定を書いているファイルの名前だけを出して、中身は表示しません。

  • 1行目を分けているのは、~/.claude をシンボリックリンクにしていると、2行目の find が中に入らないためです。全体の設定ファイルが無いと「no matches found」などと出ますが、設定が無いだけなので問題ありません
  • 2行目は ~/src/github.com/ユーザー名/リポジトリ くらいの深さまで見ます。もっと深く置いている人は -maxdepth の数を増やしてください。~/Library は飛ばしています。読めないフォルダは、エラーを出さずに黙って飛ばします

会社のゲートウェイなどで自分で設定している人は、そのファイルが出てきます。出てきたファイルが、自分で設定したものかを確かめてください。

3. Codex の設定に、覚えのないサーバーや接続先が無いか

grep -noE '^[[:space:]]*(\[[^]]*(mcp_servers|model_providers)[^]]*\]|"?(mcp_servers|model_providers)[^=]*)|^[[:space:]]*[a-z_]*base_url[[:space:]]*=.*' ~/.codex/config.toml

Codex の全体の設定から、MCP サーバーとモデルの接続先の名前と、base_url で終わる設定の行だけを出します。サーバーの設定の中の API キーなどの値は出しません。私の手元では、自分で入れた MCP サーバーが1つ出ただけでした。

4. シェルの環境変数

env | grep -oE '^(ANTHROPIC|OPENAI|CODEX|CLAUDE)[A-Za-z0-9_]*|^[A-Za-z_]*_(PROXY|proxy)'

エージェントとプロキシに関わる環境変数の名前だけを出します。値は出しません。覚えのない名前が無いかを見てください。Claude Code の中で動かすと、Claude Code 自身の CLAUDE_CODE_* が十数個出て紛らわしいので、ふつうのターミナルで動かしてください。

この4つで見ていない場所もあります。Claude Code の ~/.claude.json(MCP サーバーの登録)、CLAUDE_CONFIG_DIR や CODEX_HOME で設定の場所を変えている場合、シェルの起動ファイル(~/.zshrc など)です。気になる人は、そこも見てください。

見つかったときにすること

覚えのない AGENTS.md や CLAUDE.md が Downloads にあっても、Downloads やその中のフォルダで起動したことも、ホームなど上のフォルダから Downloads の中を扱わせたこともなければ、中の指示が読まれた可能性は低いです。中身を確かめてから消してください。

起動したかを覚えていなければ、Claude Code は次のコマンドで確かめられます。Claude Code はセッションの記録をフォルダごとに ~/.claude/projects/ の下に -Users-名前-Downloads のような名前で残すので、何か出れば Downloads(かその中)で起動したことがあります。ただし記録は既定で30日たつと消える(設定の cleanupPeriodDays)ので、何も出なくても起動していないとは言い切れません。

ls -d ~/.claude/projects/*Downloads*

起動したことがあるなら、設定がきれいに見えても、次の順で進めます。同じセッションのうちにトークンが送られる経路もあるので、設定だけでは判断できません。

  1. function-color の痕跡が無いかを見る。 Forever が、実際の攻撃が入れようとしたパッケージとして挙げていて、入っていたらそのパソコンは乗っ取られたものとして扱うよう勧めています。報告に載っている攻撃の中身からは、launchctl list | grep -i ptools(macOS)と ls -d /tmp/ptools で痕跡を見られます。この2つは再起動で消えるので、npm のキャッシュの記録 grep -rl function-color ~/.npm/_cacache/index-v5 2>/dev/null も見てください。何も出なくても、安全の証拠にはなりません。痕跡があれば、その端末はネットから切り、会社の端末なら情報システムの担当に連絡してください。マルウェアはあなたの権限で動いたことになるので、エージェントのトークンだけでなく、SSH の鍵やクラウドの資格情報、ブラウザのログインも作り直す対象です。作り直しは別の端末からしてください
  2. 設定から覚えのないものを消す。 Claude Code の設定の接続先、Codex の config.toml の覚えのない [mcp_servers.*] などです。Claude Code や Codex を起動して直させず、エディタで消してください。起動した時点で、通信やサーバーが攻撃者の側につながります。先に消さないと、作り直したトークンもまた同じ先に送られます
  3. トークンを無効にして、ログインし直す。 Forever は、見つけたらトークンが漏れたものとして作り直すよう勧めています。トークンは、エージェントがアカウントにログインした状態を保つための鍵のようなものです。漏れていれば、無効にするまで、他人があなたのアカウントとして使えます

Claude Code のトークンを無効にする手順は、Anthropic のヘルプセンターに書かれています。

  • claude.ai の「設定」→「アカウント」のセッションの一覧に Claude Code があれば、そこからログアウトできる。一覧に無ければ「設定」→「Claude Code」で、トークンをゴミ箱のアイコンで削除する
  • 「設定」→「アカウント」でログアウトすると、すべての端末のセッションからログアウトし、Claude Code のトークン(CI 用に setup-token で作ったものを含む)も無効になる
  • ログアウトは API キーには効かない。API キーで使っている場合は、キーも無効にする必要がある

Codex も Forever は作り直すよう勧めていますが、公式の手順を確かめられなかったので、ここには書いていません。

これからの使い方としては、Forever の勧めのとおり、承認とサンドボックスは外さずにおくのが効きます。Claude Code が .claude/settings.json への書き込みや接続先の変更を求めてきたら断り、サンドボックスや承認を外すよう促す指示は疑ってください。

ブラウザの側でできること

Chrome では、設定の「ダウンロード」にある「ダウンロード前に各ファイルの保存場所を確認する」をオンにすると、ダウンロードのたびに保存先を聞かれるようになります(設定のページは chrome://settings/downloads)。Web ページが黙ってファイルを置くことはできなくなりますが、聞かれた画面でそのまま Enter を押すと Downloads に保存されます。毎回聞かれる手間も増えるので、オンにするかは好みだと思います。

まとめ

Web ページは、初期設定の Chrome では確認なしに ~/Downloads にファイルを置けて、エージェントは起動したフォルダの指示書に従います。いちばん効くのは、Downloads でエージェントを起動しないことです。起動したことがある人は、上のコマンドで見られる範囲を確かめて、痕跡を見てから設定を消し、トークンを作り直してください。

参考

表紙のアイコンは、Google の Material Symbols(Apache License 2.0)と、Dustin Curtis の Markdown Mark(パブリックドメイン)を使っています。

おすすめ記事