ダウンロードフォルダの指示書で Claude Code が乗っ取られる ― 自分の Mac で確かめた
AIで読む ChatGPT・Claude などで、この記事に質問できます expand_more
Claude Code(Anthropic)や Codex(OpenAI)のような AI エージェントには、ダウンロードフォルダの中で起動すると、Web ページが勝手に置いた1枚のメモ(CLAUDE.md・AGENTS.md)を本人の指示だと思い込んで従ってしまう問題がある。セキュリティ企業 Forever Security の検証では、Claude Code は約半分の回数でこのメモに従って通信先の設定を書き換え、ログインの合鍵を外へ渡した(Codex は9割を超えた)。
問題は、AI が「だれが書いたメモか」を見分けずに、置かれていたメモを本人の指示として実行してしまうこと。 起きることを順に書くと、次のとおりです。
- Web ページを開くだけで、ダウンロードフォルダにファイルが置かれる。 Chrome は初期設定のまま、保存先を聞かずにダウンロードフォルダへ保存します。ファイルの名前も中身も、Web ページの側が決められます
- AI は、起動したフォルダのメモを「このフォルダのルール」として読む。
CLAUDE.md・AGENTS.mdは、本来は持ち主が AI に作業の決まりを伝えるためのファイルです。AI は、それを本人が書いたのか、Web が置いたのかを見分けません - AI が、自分に与えられた権限で設定を書き換える。 通信先が別のサーバーに向けられ、ログインの合鍵(トークン)が相手に渡ります。ソフトの不具合ではなく、AI が作られたとおりに動いた結果なので、提供元の修正では防げません
「ダウンロードフォルダを整理して」「ダウンロードした PDF を要約して」と頼むとき、AI をそのフォルダで起動するのは自然な流れです。私も Claude Code にダウンロードフォルダの整理を頼んでいたので、ショート動画でこの話を見てすぐ、自分の Mac を確かめました。分かったことと、変えることは次の3つです。
- 自分の Mac に仕掛けがないかは、ターミナルのコマンド2つで分かる。見るのは、ダウンロードフォルダの隠しファイルと、Claude Code の通信先の設定。動画を見てから「問題なし」と分かるまで、会話の時刻で15分(13:04 → 13:19)でした。コマンドを打って結果を見るだけなら数分です。Codex の設定も、あとからコマンド1つで確かめ、問題はありませんでした(13:49)
- ダウンロードフォルダのメモを、Claude Code に読ませない設定がある。設定ファイルに1行足すだけで、ダウンロードフォルダの中の
CLAUDE.md・AGENTS.mdを読まなくなります(DevelopersIO が実際に試して確かめています) - 整理を頼むのはやめなくていい。起動する場所を作業用のフォルダに変え、ダウンロードフォルダは「作業の対象」として渡せば、置かれたメモは読まれません
| やったこと | なぜ | 結果 |
|---|---|---|
ショート動画の話を、元の報告と報道までたどって確かめた | 煽りの動画かもしれなかった | 2026年10月22日の Forever Security の報告で、実際の被害(未遂)から見つかった手口だった |
Finder でダウンロードフォルダの48項目を見た | 見覚えのないファイルがないか | すべて自分で保存したもの。 CLAUDE.md・AGENTS.md はなかった |
ls -la で隠しファイルまで見た | Finder は . で始まるファイルを出さない | あったのは .DS_Store と .localized だけ(どちらも macOS が作るもの) |
grep で通信先の設定を探した | 乗っ取りの手口は、通信先( BASE_URL)の書き換えだった | 何も出なかった |
Codex の設定に足された外部の道具を見た | Codex の手口は、全体の設定に外部の道具を足すものだった | 2つあったが、どちらも ChatGPT のアプリ自身が入れたもの |
| 防ぐ設定を調べた | 確かめて終わりにせず、置かれても読まれないようにする | Claude Code の設定1行・Chrome の設定1つ・起動する場所の3つ |
下の図で、Web ページがファイルを置いてから乗っ取りまでの流れと、どの守りがどこで流れを止めるかを切り替えて見られます。
作業ログ ― ショート動画を見てから、自分の Mac を確かめるまで
ここから下は作業の記録です。効果の数字は、測れたものと、元の報告の数字だけを書いています。
きっかけ:「ダウンロードフォルダ整理して」と頼むと乗っ取られる、というショート動画
13:04 に、AI の使い方を紹介するショート動画のスクリーンショットを Claude に送りました。動画の主張は「Claude Code や Codex にダウンロードフォルダの整理を頼んだことがあれば、AI が乗っ取られる可能性がある」というものです。私はちょうどダウンロードフォルダの整理を Claude Code に頼んでいたので、本当かどうかを確かめてもらいました。
これについて確認してください(ダウンロードフォルダ整理させてます)
Claude が検索すると、話は本当でした。元は、AI エージェント(指示を受けて、ファイルの読み書きやコマンドの実行まで自分で進める AI)の危険を見張るサービスを作っている Forever Security の報告です。
Forever Security の報告:顧客の Mac のダウンロードフォルダに AGENTS.md があった
報告の題は「Markdown Is the New Executable」(Markdown は新しい実行ファイルだ)。研究者は Gal Weizman さんと Omer Samet さんで、2026年10月22日に出ました(https://forever.security/blog/hijacking-ai-agents-via-downloads-folder )。10月25日に BleepingComputer が報じ(https://www.bleepingcomputer.com/news/security/ai-coding-agents-hijacked-using-agentsmd-file-in-downloads-folder/ )、国内でも広がりました。
見つかった経緯は次のとおりです。
- 顧客の PC で、AI エージェントが、悪意のあるソフトとして知られる npm(JavaScript の部品を配る仕組み)のパッケージ
function-colorを入れようとした。Forever Security の製品が、実行される前に止めた - 指示の出どころをたどると、顧客のダウンロードフォルダにあった
AGENTS.mdだった。エンジニアのメモのように見せかけた、ただの文章のファイル - そのダウンロードフォルダが、エージェントの作業フォルダ(起動した場所)になっていた
- ファイルがどうやってそこに置かれたかは、分かっていない。研究者は、Web ページを開くだけで同じ名前のファイルを保存させられることを、別に試して示した
CLAUDE.md と AGENTS.md は、AI エージェントへの「このフォルダのルール」
CLAUDE.md と AGENTS.md は、AI エージェントに「このプロジェクトではこう作業してほしい」と伝えるための、ふつうの文章のファイルです。テストの走らせ方、使ってよい道具、コードの書き方の決まりなどを書いておくと、エージェントが作業を始めるときに読みます。Claude Code の説明は https://docs.claude.com/ja/docs/claude-code/memory 、AGENTS.md の説明は https://agents.md/ にあります。
| 言葉 | この記事での意味 |
|---|---|
CLAUDE.md | Claude Code が読む、そのフォルダのルールを書いたファイル。起動したフォルダと、その上のフォルダにあるものを読む |
AGENTS.md | Codex など多くのエージェントが読む、同じ役目のファイル。Claude Code も、 CLAUDE.md がないときに読むようになった(DevelopersIO の記事による) |
| プロンプトインジェクション | AI が読む文章の中に指示を紛れ込ませ、本人の指示のように従わせる手口 |
| 作業フォルダ | エージェントを起動した場所。ここのルールのファイルを読み、ここを中心に作業する |
便利な仕組みですが、そのファイルを置いたのが本人かどうかを、エージェントが確かめる手段はありません。これが今回の弱点でした。
研究者が試した結果:Codex は9割超、Claude Code は約半分
Forever Security は、管理された環境で Codex と Claude Code の両方を試しています(Cyber Security News の整理 https://cybersecuritynews.com/codex-and-claude-code-hijack/ と、Dark Reading の記事 https://www.darkreading.com/application-security/in-the-wild-attack-ai-agents-trust-markdown による)。
| Codex | Claude Code | |
|---|---|---|
| 使ったファイル | 顧客の PC で見つかった、実際の AGENTS.md | 研究者が自分で書いた CLAUDE.md(社内のゲートウェイの設定のように見せたもの) |
| 書き換えさせた所 | PC 全体の設定ファイル ~/.codex/config.toml に、外部の道具(MCP サーバー)を足し、承認とサンドボックスを切った別の作業を始めさせた | そのフォルダの .claude/settings.json に ANTHROPIC_BASE_URL(Claude Code の通信先)を書き込み、研究者のサーバーへ向けた |
| 従った割合 | 9割を超えた | 約半分 |
| 起きたこと | 書き換えは全体の設定なので、別のフォルダで起動してもその道具が動く | 通信に乗っているログインの合鍵(OAuth トークン)が漏れ、研究者はそれで本人として Anthropic に接続できた。偽のサーバーからコマンドを返して実行させられた回もあった |
| 条件 | Codex がそのフォルダを「信頼する」としていること。一度でもそこで作業していれば当てはまる | フォルダに、ほかに怪しく見えるメモがないこと |
MCP サーバーは、AI エージェントに外の道具(検索・データベース・別のサービスなど)をつなぐ仕組みです。サンドボックスは、エージェントが触れるファイルや通信を囲いの中に限る仕組みで、承認はコマンドを実行する前に人に確認を取る仕組みです。
Claude Code のほうには、救いのある結果も出ています。フォルダの中にセキュリティについてのメモがあると、Claude が作業の途中で立ち上げた別のエージェント(サブエージェント)がそのファイルを攻撃だと見抜き、成功したのは何も怪しいものがないフォルダのときだけでした。Claude Code のサンドボックスを破ったわけでもありません。
それでも、使われ方の数字は他人事ではありませんでした。Forever Security の顧客の記録では、約半分が一度はダウンロードフォルダの中でエージェントを動かしていて、Claude Code だけでその場所から1,300回以上起動されていたそうです。ダウンロードした資料の要約や、ダウンロードフォルダの整理を頼むとき、そこで起動するのは自然な流れです。
Forever Security は、エージェントは作業フォルダのルールに従うように作られていて、その動きは不具合ではないので、OpenAI も Anthropic も直すものがない、という立場です。
確かめ1:Finder でダウンロードフォルダの48項目を見た
まず Finder でダウンロードフォルダを開き、上から下までスクロールして3枚の画面写真を Claude に送りました。全部で48項目です(Finder の下の帯の表示)。
並んでいたのは、記事のサムネイルの画像(thumb_*.png)、調査の図(survey_cycle_*.svg・survey_report_*.png)、iPhone の動画(IMG_4225.MOV〜IMG_4229.MOV と、それを小さくした -compressed.mp4)、画面収録、Gemini で作った画像、記録の PDF、進み具合の表(xlsx)などで、どれも自分で保存した覚えのあるものでした。CLAUDE.md も AGENTS.md もありません。画面写真は、サイドバーに仕事のフォルダの名前が写っているので、この記事には載せていません。
ただ、Finder のふつうの表示は、名前が . で始まるファイルとフォルダを出しません。乗っ取りに使われる .claude フォルダ(Claude Code がそのフォルダの設定を置く所)も、ここに入ります。
確かめ2:ls -la で隠しファイルまで見た
ターミナルで、隠しファイルを含めて一覧を出しました。Claude が出したコマンドは、名前が . で始まる行だけを拾う形です。
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % ls -la ~/Downloads | grep '^\S* .* \.'
drwx------@ 52 shimazueiichi staff 1664 11月 2 09:14 .
drwxr-x---+ 83 shimazueiichi staff 2656 11月 2 12:59 ..
-rw-r--r--@ 1 shimazueiichi staff 6148 11月 1 11:54 .DS_Store
-rw-r--r-- 1 shimazueiichi staff 0 3月 17 2022 .localized
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts %
. と .. は、そのフォルダ自身と1つ上のフォルダを指す印です。残りの .DS_Store(Finder が表示の形を覚えるファイル)と .localized(フォルダ名を日本語で出すための空のファイル)は、どちらも macOS が自分で作ります。.claude フォルダはありませんでした。
フォルダの中身の数は 52 で、これは .・.. を含めた数です。.・..・.DS_Store・.localized の4つを引くと48で、Finder の48項目と合います。見えていないファイルは、ほかにありません。
確かめ3:Claude Code の通信先が書き換えられていないかを grep で探した
Claude Code での乗っ取りは、通信先(ANTHROPIC_BASE_URL)を書き換える手口でした。PC 全体の Claude Code の設定 ~/.claude/settings.json と、ターミナルを開くたびに読まれる ~/.zshrc に、base_url という文字があるかを探しました。
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % grep -ri "base_url" ~/.claude/settings.json ~/.zshrc 2>/dev/null
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts %
何も出ませんでした。研究者の手口では、書き込む先は起動したフォルダの .claude/settings.json(ここでは ~/Downloads/.claude/settings.json)ですが、確かめ2でダウンロードフォルダに .claude フォルダがないことは分かっています。13:19 に、乗っ取りの跡はないと分かりました。
確かめ4:Codex の設定に足された外部の道具を見た
この Mac には Codex の設定のフォルダ ~/.codex もあります。Codex での手口は、PC 全体の設定 ~/.codex/config.toml に外部の道具(MCP サーバー)を足すものでした。記事を公開したあとで、自分で足した覚えのない [mcp_servers や base_url の行がないかを探しました(DEV Community の確認手順 https://dev.to/thereleasedesk/who-left-this-note-for-your-ai-agent-a-2-minute-check-for-codex-and-claude-code-users-458f による)。
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % grep -nE '^\[mcp_servers|base_url' ~/.codex/config.toml
80:[mcp_servers.node_repl]
86:[mcp_servers.node_repl.env]
103:[mcp_servers.computer-use]
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts %
base_url の行はなく、通信先は書き換えられていません。外部の道具は node_repl と computer-use の2つありました。名前だけでは、本物かどうかは分かりません。攻撃で足される道具も、本物らしい名前を付けることがあるからです。そこで、それぞれが何を動かしているかを、80行目の前後から出して見ました。
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % sed -n '78,112p' ~/.codex/config.toml
js_repl = false
[mcp_servers.node_repl]
args = []
command = "/Applications/ChatGPT.app/Contents/Resources/cua_node/bin/node_repl"
env_vars = ["BROWSER_USE_ACCESS_EXECUTOR_ID", "BROWSER_USE_ACCESS_PIPE_PATH", "BROWSER_USE_ACCESS_VERIFYING_IDENTITY"]
startup_timeout_sec = 120
[mcp_servers.node_repl.env]
NODE_REPL_NATIVE_PIPE_CONNECT_TIMEOUT_MS = "1000"
NODE_REPL_NODE_MODULE_DIRS = "/Applications/ChatGPT.app/Contents/Resources/cua_node/lib/node_modules"
NODE_REPL_NODE_PATH = "/Applications/ChatGPT.app/Contents/Resources/cua_node/bin/node"
NODE_REPL_TRUSTED_CODE_PATHS = "/Users/shimazueiichi/.codex:/Applications/ChatGPT.app/Contents/Resources/cua_node/lib/node_modules"
CODEX_HOME = "/Users/shimazueiichi/.codex"
BROWSER_USE_AVAILABLE_BACKENDS = "chrome,iab,mcpapps"
BROWSER_USE_TINYSKY_ENABLED = "1"
NODE_REPL_INSTRUCTIONS_USE_CASE_BROWSER = ""
NODE_REPL_INSTRUCTIONS_USE_CASE_CHROME = ""
NODE_REPL_INSTRUCTIONS_USE_CASE_COMPUTER_USE = ""
BROWSER_USE_CODEX_APP_BUILD_FLAVOR = "prod"
BROWSER_USE_CODEX_APP_VERSION = "26.1021.31345"
NODE_REPL_TRUSTED_SERVICES = '{"browser":"/Users/shimazueiichi/.codex/plugins/cache/openai-bundled/browser/26.1021.31345/scripts/browser-service.mjs","sky":"@oai/sky/service"}'
SKY_CUA_SERVICE_PATH = "/Users/shimazueiichi/.codex/computer-use/Codex Computer Use.app"
CODEX_CLI_PATH = "/Applications/ChatGPT.app/Contents/Resources/codex-cli/CodexCLI.app/Contents/MacOS/codex"
[mcp_servers.computer-use]
command = "./Codex Computer Use.app/Contents/SharedSupport/SkyComputerUseClient.app/Contents/MacOS/SkyComputerUseClient"
args = ["mcp"]
cwd = "."
enabled = false
[shell_environment_policy.set]
NODE_REPL_TRUSTED_BROWSER_CLIENT_SHA256S = "87e84e5b4db45250b323ac54ab2f33585d867d0d13abc198e73a4e28420b657b"
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts %
見たのは、command(動かすもの)と、その道具に渡す設定の行です。
| 道具 | 動かしているもの | 判断 |
|---|---|---|
node_repl | /Applications/ChatGPT.app の中のファイル。ほかの設定も、ChatGPT のアプリの中か ~/.codex の中だけを指す。アプリの版の番号(26.1021.31345)は、openai-bundled(OpenAI が同梱したプラグイン)のフォルダ名とそろっている | ChatGPT のアプリ自身が入れたもの |
computer-use | Codex Computer Use.app の中のファイル。enabled = false(使わない設定) | ChatGPT のアプリ自身が入れたもの。いまは動かない |
研究者の手口で足されるのは、知らない npm のパッケージ(npx 〇〇 の形)や外の Web の住所、ダウンロードフォルダの中のファイルを動かす道具です。そのどれも、この設定にはありませんでした。これで、Claude Code と Codex の両方とも、乗っ取りの跡がないことを確かめられました。
自分の Mac を確かめる手順(Claude Code・Codex を使っている人向け)
確かめ1〜3を、ほかの人が同じように使える形にまとめます。Mac のターミナルで順に打ちます。
# 1. ダウンロードフォルダに、エージェントの指示書や設定のフォルダがないか
ls -la ~/Downloads | grep -iE 'claude|agents|gemini'
# 2. Claude Code の通信先が書き換えられていないか(全体の設定・ダウンロードフォルダの設定・シェルの設定)
grep -rsi "base_url" ~/.claude/settings.json ~/Downloads/.claude/ ~/.zshrc
# 3. Codex の設定に、足した覚えのない外部の道具や通信先がないか
grep -nE '^\[mcp_servers|base_url' ~/.codex/config.toml
どれも何も出なければ、この手口の跡はありません。何か出たときは、そのフォルダでエージェントを起動しないまま中身を読み、見覚えがなければ、Claude Code からいったんログアウトしてログインし直し、API キーを使っているなら無効にして作り直します。報道では、合鍵の無効化は、別の安全な端末から行うようにすすめています。
防ぐ設定:起動する場所・読ませない設定・Chrome の保存先の確認
確かめて何もなかったとしても、仕組みが残っている限り、次にファイルが置かれれば同じことが起きます。防ぐ手は4つあります。
- ダウンロードフォルダの中で起動しない。 作業用のフォルダで
claudeを起動し、ダウンロードフォルダはclaude --add-dir ~/Downloadsで作業の対象として足す。--add-dirで足したフォルダのCLAUDE.mdは、既定では読み込まれません(読ませるには環境変数CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1を付ける必要がある。https://www.claudelog.com/faqs/—add-dir/ )。Anthropic も OpenAI も、作業するプロジェクトのフォルダで起動するようにすすめています - ダウンロードフォルダの指示書を読ませない。 PC 全体の Claude Code の設定
~/.claude/settings.jsonに、次の1行を足します。claudeMdExcludesは、読み込まないCLAUDE.mdを場所で指定する設定で、**/Downloads/**は、場所のどこかにダウンロードフォルダを含むファイルすべてを指します
"claudeMdExcludes": ["**/Downloads/**"]
- Chrome で保存先を毎回聞かせる。 設定 → ダウンロード(
chrome://settings/downloads)の「ダウンロード前に各ファイルの保存場所を確認する」をオンにすると、Web ページが仕掛けたダウンロードでも保存の画面が出て止まります。ただし、保存の画面で Enter を押せば置かれるので、2と組み合わせる前提です - 承認とサンドボックスを切らない。 研究者の Codex の手口は、承認とサンドボックスを切った作業を始めさせるものでした。コマンドを実行する前に人へ確認が来る状態が残っていれば、それ自体が止める機会になります
2の設定と、ダウンロードフォルダで起動したら最初の入力で止める仕組み(フック)を、Claude Code v2.1.280 で実際に試して、置かれた CLAUDE.md・AGENTS.md が読まれなくなることを確かめた記録が、クラスメソッドの DevelopersIO にあります(https://dev.classmethod.jp/articles/claude-code-downloads-agents-md-guard/ )。フックのスクリプトと、チームの全員に同じ設定を配る方法もそこにまとまっています。
- ねらい:ダウンロードフォルダに指示書が置かれても、Claude Code がそれを読まない状態にする
- 変わったこと:起動する場所を作業用のフォルダにし、ダウンロードフォルダは対象として渡す。読ませない設定を1行入れる
- 見込める効果:整理を頼む使い方を続けたまま、今回の手口の入口(作業フォルダのルールとして読ませること)がふさがる。効いているかは、DevelopersIO の手順と同じく、目印の言葉だけを書いた
CLAUDE.mdをダウンロードフォルダに置き、Claude Code がその言葉を答えられないかで確かめる
ロボットを動かす AI で同じことが起きたら
このプロジェクトでは、Claude Code に実機のロボットアームを動かすコードを書かせ、AI のモデルにロボットを動かさせる学習も回しています。画面の中のエージェントなら、書き換えられるのは設定ファイルで、漏れるのは合鍵です。同じ「置かれていたメモに従う」動きが、アームの関節を動かす権限を持ったエージェントで起きれば、起きることは物の動きになります。
実機を動かすコードは、r2r2r-scripts という決まったフォルダにまとめています。作業する場所を決めておくことは、整理のためだけでなく、どのフォルダのルールをエージェントに信じさせるかを決めることでもありました。ダウンロードフォルダの整理は、その決まりの外で頼んでいた作業でした。
使った情報源
| 情報源 | 日付 | この記事で使ったこと |
|---|---|---|
Forever Security「Markdown Is the New Executable」 https://forever.security/blog/hijacking-ai-agents-via-downloads-folder | 2026-10-22 | 元の報告。見つかった経緯 |
| 2026-10-25 | 試し用のページで無害な AGENTS.md が保存されたこと・Claude Code の1,300回以上の起動 | |
Cyber Security News https://cybersecuritynews.com/codex-and-claude-code-hijack/ | 2026-10-26 | Codex と Claude Code の手口と割合・ function-color の正体 |
| 2026-10 下旬 | 顧客の約半分がダウンロードフォルダで動かしていたこと | |
DevelopersIO(クラスメソッド)https://dev.classmethod.jp/articles/claude-code-downloads-agents-md-guard/ | 2026-10-28 | claudeMdExcludes・フック・Chrome の設定を実際に試した結果 |
Claude Code のセキュリティの説明 https://docs.claude.com/ja/docs/claude-code/security | ― | 書き込みは起動したフォルダの中に限られること・承認の仕組み |
次は、読ませない設定を入れて、目印のファイルで効いているかを確かめる
~/.claude/settings.json に claudeMdExcludes を足し、Chrome の保存先の確認をオンにします。そのあと、目印の言葉だけを書いた CLAUDE.md をダウンロードフォルダに置いて、Claude Code がその言葉を答えないかを見ます。