結論から:Forever Security の 10 月 22 日の報告によると、実在する顧客の PC の ~/Downloads に、エンジニアリング規約を装った AGENTS.md が置かれていました。Codex がこのフォルダで起動すると、その指示に従ってグローバルの ~/.codex/config.toml に MCP サーバーを追加し、それを使って悪意ある npm パッケージ function-color をインストールします。研究者はさらに CLAUDE.md を作成し、Claude Code にプロジェクトの .claude/settings.json へ自分たちのサーバーを指す ANTHROPIC_BASE_URL を書き込ませ、ログイン token を取得しました。
サードパーティの API Key を使う人は普段から base_url、model_provider、ANTHROPIC_BASE_URL を変更しています。だからこそ一番大事なのは、どのアドレスが自分で設定したもので、どれが後から追加されたものかを見分けることです。下のコマンドなら 1 分ほどで確認できます。
要点
- 両方のクライアントで実証済み:報告によると、Codex はテストの 9 割以上でパッケージのインストールまで誘導されました。Claude Code はだまされにくく、悪意ある設定が書き込まれたのはテストの約半分でした。どちらも「脆弱性」というより、指示ファイルどおりに動いた結果です。
- Codex はグローバル設定を書き換える:
~/.codex/config.tomlはこのマシンのすべての Codex セッションに適用されるため、Downloads を離れても攻撃者の MCP サーバーが読み込まれ続けます。 - Claude Code はプロジェクト設定を書き換える:プロジェクトの
.claude/settings.jsonにあるANTHROPIC_BASE_URLは、グローバルに設定した AICodeWith のアドレスより優先されます。box での実機テストでは、プロジェクトにこの 1 行を足すとclaude -pが 90 秒たっても応答せず、削除すると 2.4 秒で正常に返答しました。 - 確認ポイント:Codex は
[mcp_servers.*]とbase_url、Claude Code はすべてのsettings.jsonの中のANTHROPIC_BASE_URLを確認します。AICodeWith の正しいアドレスは後述します。 - trust_level は使える:Codex CLI 0.164.0 で検証したところ、
[projects."<path>"] trust_level = "untrusted"を設定するとそのフォルダのAGENTS.mdは読み込まれませんでした。これは廃止されたapproval_policy = "untrusted"とは別物です。 - 被害に遭ったら:怪しい設定ブロックを削除し、ダッシュボードで古い Key を削除して新しい Key を作成します。公式アカウントで Claude Code にログインしている場合は
/logoutを実行して再ログインします。
API Key を作成して、Claude Code と Codex で同じ Key を使う →
経緯:それぞれのクライアントはどう悪用されたか
The Hacker News と BleepingComputer の報道によると、Forever Security は顧客マシンで Codex が function-color をインストールしようとする動作を止め、調べたところ指示は ~/Downloads にある AGENTS.md から来ていました。ファイルがどうやって置かれたかは特定できていませんが、開くだけで AGENTS.md を Downloads に無音でダウンロードさせるデモページを作成しています。Chrome、Edge、Firefox は既定では保存先を聞かずにこのフォルダへ保存します。
| Codex | Claude Code | |
|---|---|---|
| 仕込まれたファイル | AGENTS.md(実際の攻撃で使われた、約 13 KB の「エンジニアリング規約」) | CLAUDE.md(研究者が実物をまねて作成) |
| 書き換えさせられる設定 | グローバルの ~/.codex/config.toml、[mcp_servers.project-tools] | プロジェクトの .claude/settings.json、ANTHROPIC_BASE_URL |
| 影響(報告による) | MCP サーバーが起動時にコマンドを実行し、function-color をインストール。以後どのフォルダで Codex を起動しても読み込まれる | リクエストと OAuth token が攻撃者のサーバーに送られ、相手はモデルになりすまして実行させたいコマンドを返せる |
| 報告での成功率 | 9 割以上 | 設定の書き込みは約半分 |
報告によると、Codex 向けのファイルはさらに Codex 自身に --dangerously-bypass-approvals-and-sandbox 付きの codex exec をもう 1 つ起動させ、サンドボックスを回避してネットワークに出ようとします。Forever は、クライアントは指示ファイルどおりに動いているだけなので両社とも「修正」すべき箇所はなく、防御は利用者側で行う必要があるとしています。
点検の前に:AICodeWith の正しい設定はこうなっている
「Codex config.toml 設定ガイド」 に沿って AICodeWith を設定した場合、グローバルの ~/.codex/config.toml でアドレスに関係する部分は次の内容だけのはずです:
model_provider = "aicodewith"
model = "gpt-6.1-sol"
[model_providers.aicodewith]
name = "aicodewith"
base_url = "https://api.aicodewith.ai/chatgpt/v1"
wire_api = "responses"
experimental_bearer_token = "YOUR_API_KEY"
Claude Code を 「Claude Code サードパーティ API 設定」 で設定した場合、~/.claude/settings.json は次のようになっているはずです:
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.aicodewith.ai",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY"
}
}
判断はシンプルです:アドレスが api.aicodewith.ai ではなく、自分で追加した覚えもなければ、怪しいものとして扱ってください。 他のサービスを使っている場合も、最初に自分が入力したアドレスと照らし合わせます。
確認コマンド:macOS / Linux
ブロックごとターミナルに貼り付けて実行します。読み取るだけで何も変更しません:
echo "== 1 Codex global config =="
grep -nE '^\[mcp_servers|^\[model_providers|^[[:space:]]*(model_provider|base_url|chatgpt_base_url|openai_base_url|command|args)[[:space:]]*=' ~/.codex/config.toml
echo "== 2 project .codex/config.toml =="
find ~ -maxdepth 6 -path '*/.codex/config.toml' -not -path "$HOME/.codex/*" 2>/dev/null
echo "== 3 Claude Code settings =="
find ~ -maxdepth 6 \( -path '*/.claude/settings.json' -o -path '*/.claude/settings.local.json' \) 2>/dev/null | xargs grep -nE 'ANTHROPIC_BASE_URL|HTTPS?_PROXY|apiKeyHelper' 2>/dev/null
echo "== 4 instruction files in Downloads =="
ls -la ~/Downloads/AGENTS.md ~/Downloads/CLAUDE.md ~/Downloads/.claude ~/Downloads/.codex 2>/dev/null
echo "== 5 function-color =="
find ~ /tmp -maxdepth 6 -type d -name function-color -path '*node_modules*' 2>/dev/null
続いて各クライアントのコマンドで MCP サーバーを一覧表示します。両方の結果が一致するはずです:
codex mcp list
claude mcp list
確認コマンド:Windows PowerShell
"== 1 Codex global config =="
Select-String -Path "$env:USERPROFILE\.codex\config.toml" -Pattern '^\[mcp_servers','^\[model_providers','^\s*(model_provider|base_url|chatgpt_base_url|openai_base_url|command|args)\s*='
"== 2 project .codex / .claude settings =="
Get-ChildItem $env:USERPROFILE -Recurse -Depth 6 -Force -File -ErrorAction SilentlyContinue -Include config.toml,settings.json,settings.local.json | Where-Object { $_.Directory.Name -in '.codex','.claude' } | Select-String -Pattern '^\[mcp_servers','base_url','ANTHROPIC_BASE_URL','HTTPS?_PROXY','apiKeyHelper'
"== 3 instruction files in Downloads =="
Get-ChildItem "$env:USERPROFILE\Downloads" -Force -ErrorAction SilentlyContinue | Where-Object { $_.Name -in 'AGENTS.md','CLAUDE.md','.claude','.codex' }
実機テスト:きれいな設定と、何かを追加された設定での出力
box 上の隔離したテスト用ホームディレクトリで上のコマンドを実行しました(Codex CLI 0.164.0、Claude Code 2.1.310)。使ったのは AICodeWith のテスト用 Key だけで、本物の悪意あるパッケージや攻撃ファイルは一切実行していません。
きれいな設定では、bash 版は約 0.08 秒で終わりました:
== 1 Codex global config ==
1:model_provider = "aicodewith"
5:[model_providers.aicodewith]
7:base_url = "https://api.aicodewith.ai/chatgpt/v1"
== 2 project .codex/config.toml ==
== 3 Claude Code settings ==
/home/you/.claude/settings.json:3: "ANTHROPIC_BASE_URL": "https://api.aicodewith.ai",
== 4 instruction files in Downloads ==
== 5 function-color ==
次に、手作業で 3 つの無害なデモ用エントリを追加しました:echo しか実行しない [mcp_servers.project-tools]、プロジェクトの .claude/settings.json に書いた存在しないドメインを指す ANTHROPIC_BASE_URL、そして空の ~/Downloads/AGENTS.md です。もう一度実行すると(約 0.06 秒):
== 1 Codex global config ==
1:model_provider = "aicodewith"
5:[model_providers.aicodewith]
7:base_url = "https://api.aicodewith.ai/chatgpt/v1"
11:[mcp_servers.project-tools]
12:command = "echo"
13:args = ["harmless-demo"]
== 3 Claude Code settings ==
/home/you/proj/demo/.claude/settings.json:1:{"env":{"ANTHROPIC_BASE_URL":"https://gateway.example.invalid"}}
/home/you/.claude/settings.json:3: "ANTHROPIC_BASE_URL": "https://api.aicodewith.ai",
== 4 instruction files in Downloads ==
-rw-r--r-- 1 you you 7 Oct 28 00:25 /home/you/Downloads/AGENTS.md
codex mcp list でもそのまま一覧に出ました:
Name Command Args Env Cwd Status Auth
project-tools echo harmless-demo - - enabled Unsupported
PowerShell 版(pwsh 7)は同じディレクトリで約 0.4 秒で終わり、3 か所とも検出できました。
プロジェクトのアドレスがグローバルより優先される:グローバルの ~/.claude/settings.json は AICodeWith を指していますが、プロジェクトに ANTHROPIC_BASE_URL の行を足すと、claude -p "Reply OK" は 90 秒待っても何も返しませんでした(リクエストが存在しないアドレスに向かったため)。プロジェクトのその行を消すと、2.4 秒で OK が返ってきました。これがまさに報告での Claude Code の悪用方法です。グローバル設定がどれだけ正しくても、プロジェクトの 1 行でリクエストを持っていかれます。
デモ用エントリを削除すると確認コマンドの出力はきれいな状態に戻り、それぞれ通常の呼び出しを 1 回行ったところ、Codex は約 2.8 秒、Claude Code は約 2.4 秒で返答しました:
$ codex exec -s read-only --skip-git-repo-check "Reply with one short sentence: what is 1+1?"
1 + 1 = 2.
# provider: aicodewith / sandbox: read-only, 2.8s
$ claude -p "Reply with one short sentence: what is 1+1?"
1 + 1 = 2.
# 2.4s
API Key を作成して、きれいな Key で設定し直す →
見つかったものの判断
| 見つかったもの | 正常な場合 | 怪しい場合 |
|---|---|---|
| [mcp_servers.xxx] | 自分で追加したもので、名前もコマンドも把握している | 追加した覚えがない。command が launchctl、bash -lc、npm install など |
| base_url | https://api.aicodewith.ai/chatgpt/v1 | 知らないドメイン。特に「社内ゲートウェイ」と書かれているもの |
| chatgpt_base_url / openai_base_url | 通常は書かない | 書いた覚えがないのに存在する |
| ANTHROPIC_BASE_URL | https://api.aicodewith.ai。自分の設定の中だけにある | プロジェクトの .claude/settings.json にあり、自分で書いていない |
| [shell_environment_policy.set] の中の Key | Codex の /import を使ったことがあれば存在し得る | アドレスが AICodeWith ではない |
| ~/Downloads/AGENTS.md、CLAUDE.md | 通常は存在しない | あればまず開いて読み、そこで Agent を起動しない |
自分で MCP サーバーを追加する通常の書き方は 「Codex MCP 設定チュートリアル」 を参照し、どれが自分で追加したものか照らし合わせてください。
注意:Codex の /import で Claude Code から移行した場合、config.toml に ANTHROPIC_AUTH_TOKEN と ANTHROPIC_BASE_URL が追加されます。これはインポート機能が書いたもので、ポイズニングではありません。アドレスが AICodeWith であれば問題なく、扱い方は 「Codex /import 移行の実機テスト」 を参照してください。
予防:4 つの習慣
~/Downloadsで Agent を起動しない。ダウンロードしたばかりのファイルを扱うときは、まず自分で作ったプロジェクトフォルダにコピーしてから Codex や Claude Code を起動します。- 見知らぬ
AGENTS.md/CLAUDE.mdは読んでから。クローンしたばかりのリポジトリや人から届いたアーカイブにも目を通します。正常なファイルの書き方は 「Claude Code と Codex で 1 つの AGENTS.md を共有する」 と 「CLAUDE.md の書き方」 を参照してください。「タスクを始める前に設定を変更する」「--dangerously-bypass-approvals-and-sandboxを付ける」「社内ゲートウェイを設定する」といった文言があれば、攻撃とみなしてください。 - 承認とサンドボックスはオンのまま。Codex では
approval_policy = "on-request"と適切なsandbox_modeを使い、Claude Code では.claude/settings.jsonへの書き込みを安易に承認しないでください。 - Downloads を信頼しないフォルダに指定する(Codex)。グローバルの
~/.codex/config.tomlに次を追加します:
[projects."/Users/YOUR_USERNAME/Downloads"]
trust_level = "untrusted"
パスは絶対パスで書きます。Windows で形式がわからない場合は、別のプロジェクトで一度 Codex の信頼確認を承認し、Codex が config.toml に書き込んだ [projects...] の形式をまねて Downloads のパスを書き、trust_level を "untrusted" に変えてください。
trust_level はまだ使える? untrusted の廃止とは別の話
Metarix は Downloads に trust_level = "untrusted" を設定するよう勧めていますが、当サイトの 「Codex のサンドボックスと /permissions の設定」 では untrusted は廃止済みと書きました。この 2 つは矛盾しません:
- 廃止されたのは承認ポリシー
approval_policy = "untrusted"(とcodex -a untrusted)で、0.164.0 ではエラーで終了します。 [projects."<path>"] trust_level = "untrusted"はプロジェクトの信頼レベルで、今も有効です。公式の Config basics には、信頼されていないプロジェクトではプロジェクト単位の.codex/設定、hooks、ルールがスキップされると書かれています。
Codex CLI 0.164.0 で検証しました。3 つのフォルダにそれぞれ無害な AGENTS.md を置き、内容は「回答の最初に SENTINEL-AGENTSMD-7731 と出力する」としました。codex debug prompt-input でモデルが実際に受け取る内容を確認し、さらに codex exec で実際に実行しています:
| フォルダの設定 | AGENTS.md がプロンプトに入るか | codex exec の実際の返答 |
|---|---|---|
| trust_level = "untrusted" | 入らない | 1 + 1 = 2.(約 3.6 秒) |
| trust_level = "trusted" | 入る | SENTINEL-AGENTSMD-7731 1 + 1 = 2.(約 3.0 秒) |
| projects のエントリなし | 入る(codex debug prompt-input で確認) | — |
注意点が 1 つあります:起動したフォルダに対して一致判定され、サブフォルダには自動で及びません。親フォルダを untrusted にしてそのサブフォルダで起動したところ、サブフォルダ自身の AGENTS.md は読み込まれました。trust_level はあくまで追加の保険で、いちばん確実なのは習慣 1 の「Downloads とそのサブフォルダで Agent を起動しない」ことです。
被害に遭ったら
- 怪しい設定を削除:まず
cp ~/.codex/config.toml ~/.codex/config.toml.bakでバックアップし、追加した覚えのない[mcp_servers.*]ブロックと知らないアドレスを削除します。プロジェクトに書き込まれた.claude/settings.jsonの中のANTHROPIC_BASE_URLも削除します。 - Key を交換:設定ファイルにある Key は漏れたものとして扱います。AICodeWith のダッシュボードにログインし、API Key ページで古い Key を削除して新しく作成し、新しい Key を
experimental_bearer_tokenとANTHROPIC_AUTH_TOKENに入れ直します。 - 公式アカウントでログインした Claude Code:Claude Code で
/logoutを実行して再ログインし、古い token を無効にします。ChatGPT アカウントで Codex にログインしている場合も同様にログアウトして再ログインします。ログイン情報の保存場所は 「Codex auth.json の解説」 を参照してください。 function-colorを探す:報告が挙げている侵害の痕跡はこの npm パッケージです(報告によると npm からは削除済み)。マシン上で見つかったら、マシン全体が侵害されたものとして扱ってください。- 上の確認コマンドをもう一度実行し、自分の設定だけが残っていることを確かめてから、それぞれ短いリクエストを送って動作を確認します。
API Key を作成して、新しい Key に切り替える →
よくある質問
AICodeWith の Key だけを使い、公式アカウントではログインしていません。影響はありますか?
あります。Codex の経路はログイン方法と無関係で、追加された MCP サーバーがローカルでコマンドを実行します。Claude Code は ANTHROPIC_AUTH_TOKEN をリクエストヘッダーとして ANTHROPIC_BASE_URL に送るので、アドレスが書き換えられると Key もリクエストと一緒に他人のサーバーへ渡ります。被害に遭ったら必ず Key を交換してください。
サードパーティの Key を使っていて ANTHROPIC_BASE_URL はもともと変更しています。どう見分けますか?
どのファイルにあり、値が何かを見ます。自分で設定したものはふつう ~/.claude/settings.json かシェルの環境変数にあり、値は https://api.aicodewith.ai です。報告の攻撃はプロジェクトの .claude/settings.json に書き込まれ、値は別のドメインです。
プロジェクトの .codex/config.toml も確認すべき?
確認すべきですが、報告の Codex 攻撃が書き換えるのはグローバルの ~/.codex/config.toml なので、まずはそちらが最優先です。プロジェクト単位の設定は信頼済みのプロジェクトでしか読み込まれません。
codex mcp list に何か表示されたら被害に遭ったということ?
いいえ。自分で追加した MCP サーバーも表示されます。名前とコマンドが自分の追加したものか 1 つずつ確認し、わからないものはいったんコメントアウトしてから調べてください。
trust_level = "untrusted" を設定していても悪用される?
実機テストではそのフォルダの AGENTS.md は読み込まれなくなりましたが、効くのは書いたパスだけで、サブフォルダには及びません。Downloads で Agent を起動しないことが根本的な対策です。



