Downloads内のAGENTS.md攻撃:CodexとClaude Codeの設定を点検
コーディングエージェントを起動する前に、ダウンロードされた指示ファイルを確認します。Codexのユーザー設定、Claude Codeの設定の優先順位、function-colorのインストール痕跡を点検します。実際の事例と再現実験を区別し、漏えいした認証情報を失効させます。ユーザー設定だけで接続先を固定できると思い込まず、正規のゲートウェイへの経路を確認します。
目次

CodexやClaude Codeを、~/Downloadsなどの未確認のファイルが集まるフォルダーで起動しないでください。AGENTS.mdによるDownloads攻撃の影響を調べるには、ツールを再起動する前に指示ファイルとエージェントの設定を確認します。無断で設定されたAPI接続先や悪意あるパッケージのインストール痕跡が見つかった場合は、該当するセッションを止め、認証情報を失効させてください。
この手順は、ローカルで使うCodexとClaude Codeを対象とします。設定に関する情報は2026-10-28時点で確認したものです。点検後は、詳しく調べるべきファイルの一覧と設定の点検結果を整理できます。その結果を基に、認証情報の失効や端末の隔離など、インシデント対応が必要かを判断します。
Downloads攻撃で実証されたこと
この攻撃は、信頼できない指示を使ってエージェント自身の設定を書き換えます。Markdown自体が実行されるわけではなく、エージェントがツールを使って処理します。
Forever Securityの10月22日の報告は、顧客の~/Downloads/AGENTS.mdをきっかけに起きたインストールの試行を説明しています。この試行は阻止されました。ファイルがその端末に届いた経路は、今も不明です。
- Codexでの再現実験: 指示によって、
~/.codex/config.tomlにModel Context Protocol(MCP)のツールサーバーが登録されました。launchctlとnpmを使ってfunction-colorをインストールする構成でした。子プロセスのcodex execは--dangerously-bypass-approvals-and-sandboxを使いました。 - Claude Codeでの再現実験:
CLAUDE.mdが、.claude/settings.json内のANTHROPIC_BASE_URLを変更させました。研究者はログイン中のアカウントを認証するOAuthトークンを取得し、偽のBash呼び出しを応答として返しました。サブエージェントが同じセッション内で変更後の接続先につなぐケースもありました。報告によると、この設定の書き込みには人による承認が必要でした。
報告された成功率は、Codexでは90%を超え、Claudeの設定変更では約50%でした。Claudeで同じセッション内にコードを実行できた割合は約5分の1です。大半の試行では本物のパッケージの代わりに電卓を使い、本物のパッケージは隔離したVMで一度だけ実行しました。これらは研究者の実験結果であり、個々の利用者が被害に遭う確率ではありません。
ブラウザーの動作も設定によって変わります。Chromeのドキュメントでは、ダウンロード先の変更、保存場所を毎回尋ねる任意の設定、ダウンロード通知を説明しています。ブラウザーによるダウンロードと、エージェントへの侵害の成功は別の出来事です。
現在の保護機能も確認してください。Codex 0.165.0は、明示的に信頼しないと指定されたプロジェクトの指示を読み込みません。OpenAIは、既定のworkspace-writeポリシーで保護される.codexパスも説明しています。これらの保護を有効にしておきます。以前確認したフォルダーにも、新しい未確認のファイルが入る可能性があります。
まず約5分で初期点検を行う
エージェントを停止したまま、通常のターミナルとテキストエディターでファイルを調べてください。約5分は、使い慣れたワークスペース1つを初期点検する場合の目安です。見つかった問題の調査や端末の復旧には、さらに時間がかかります。
1. エージェントを開く前に指示ファイルを探す
実際の作業ディレクトリと、ブラウザーのダウンロード先から確認します。macOSまたはLinuxのBashで、ripgrep(rg)がインストール済みなら、次のコマンドを使います。表示するのはファイルのパスだけです。
pwd -P
rg --files --hidden --no-ignore \
-g 'AGENTS.md' -g 'AGENTS.override.md' \
-g 'CLAUDE.md' -g 'CLAUDE.local.md' \
-g '**/.claude/settings*.json' \
-g '**/.codex/config.toml' -g '.mcp.json' \
-g '!**/.git/**' -g '!**/node_modules/**' \
"$HOME/Downloads"
ブラウザーの保存先が別の場所なら、最後のパスを置き換えてください。ダウンロードまたはクローンしたプロジェクトのディレクトリでも同じ検索を行います。rgがなければ、隠しファイルを表示したファイルマネージャーで、これらの名前を探してください。
このコマンドは、エージェントを起動せず、設定値も表示せずにパスを一覧にします。結果が空でも、まずディレクトリが存在しないエラーや権限エラーを解決してください。アーカイブの中身は調べず、ディレクトリ内のシンボリックリンクもたどりません。端末が侵害されていないことを証明するコマンドでもありません。
見つかったファイルはプレーンテキストで開きます。エージェントの設定を書き換える、プロバイダーを変更する、不審なツールをインストールする、承認を無効にするといった指示を探してください。インポートやリンクで参照される指示ファイルは別に確認します。
Codexの設定ディレクトリ内のグローバル指示と、~/.claude/CLAUDE.mdも点検します。Codexはプロジェクトの指示を探索する際、検出したプロジェクトルートから作業ディレクトリまでを調べます。プロジェクトルートが見つからなければ、現在のディレクトリだけを確認します。AGENTS.override.mdと、代替名として設定したファイルも対象に含めてください。
Claude Codeは上位ディレクトリの指示ファイルも読み込みます。そのため、Downloadsのサブフォルダーへ移動しても、問題の指示を読み込まなくなるとは限りません。確認済みのワークスペースは、ダウンロード用フォルダーの外に置きます。そのサブフォルダーも避けてください。
2. 複数のプロジェクトに影響するCodexの設定を点検する
Codexを起動する前に~/.codex/config.tomlを開いてください。これはユーザー単位の設定なので、変更は同じユーザーの別のプロジェクトにも影響します。CODEX_HOMEを設定している場合は、そちらのconfig.tomlを調べます。
普段使うランチャーがどのプロファイルを選ぶか確認し、そのプロファイルの設定ファイルを開きます。セッションに適用されるプロジェクト側の.codex/config.tomlも点検してください。OpenAIの設定ガイドは、どの設定階層が読み込まれるかを説明しています。高度な設定のガイドでは、設定ディレクトリとプロファイルを説明しています。
| 設定 | 確認する内容 |
|---|---|
[mcp_servers.<name>] | 意図したサーバーか確認し、command、args、cwd、env、またはリモートのurlを省略せず点検します。 |
chatgpt_base_url | ChatGPTサービスのアドレス変更が、意図したものか確認します。 |
openai_base_url、model_provider、model_providers.<id>.base_url | APIの経路が、承認したプロバイダーに対応しているか確認します。 |
projects.<path>.trust_level | 保存済みの信頼設定を見直します。特にDownloadsなど、用途が広いフォルダーを確認します。 |
MCPはエージェントとツールを接続する仕組みです。ローカルMCPサーバーの設定は、プロセスを起動できます。表示名だけで判断せず、引数と接続先を確認してください。
見覚えのないサーバーは調査が必要です。ただし、一般的な名前が付いていることや、npm、npx、launchctlが含まれることだけでは、マルウェアとは断定できません。
2026-10-28時点のCodex設定リファレンスによると、プロジェクト内の設定はchatgpt_base_urlやプロバイダーの経路設定キーを上書きできません。この制限があっても、ユーザー設定に加えられた不正な変更が元に戻るわけではありません。
3. Claude Codeの設定と優先順位を点検する
API接続先の指定には、複数の設定元が関係します。どの設定元から接続先が指定されるかを確認し、対象のファイルをすべて点検してください。プロジェクトルートを作業ディレクトリとして開始したセッションでは、次のファイルを確認します。
| ファイル | 適用範囲 |
|---|---|
~/.claude/settings.json | 複数のプロジェクトで使うユーザー設定です。 |
.claude/settings.json | このプロジェクトで共有する設定です。 |
.claude/settings.local.json | このプロジェクトで自分だけが使うローカル設定です。 |
CLAUDE_CONFIG_DIRを使う場合は、その設定ディレクトリでユーザー設定ファイルを探します。会社の端末では、管理者が配布する設定についても管理者に確認してください。
env.ANTHROPIC_BASE_URL、HTTP_PROXY、HTTPS_PROXYを点検します。どの認証用変数が設定されているかを確認し、秘密の値はチャットやログにコピーしないでください。想定外のhooksや権限ルールの変更も調べます。
Anthropicは、ANTHROPIC_BASE_URLをAPI接続先を上書きする変数として説明しています。承認済みのゲートウェイを使う場合、この変数が存在するのは正常です。見覚えのないホスト名、説明のつかない変更、ダウンロードした指示が指定する接続先は調査してください。
Claude Codeの設定の優先順位では、プロジェクトのローカル設定が共有設定より優先されます。どちらもユーザー設定より優先されます。多くのセッションでは、設定ファイルのenvの値が、シェルから引き継いだ同じ変数も置き換えます。ユーザー設定やシェルのエクスポートだけでは、API接続先を変更されないよう固定できません。
想定外のMCP連携があれば、.mcp.jsonも確認します。AnthropicのMCPに関するセキュリティガイドでは、別の適用範囲の設定やプラグインが、このファイル以外からサーバーを追加できると説明しています。
4. インストールの痕跡を探す
疑わしいディレクトリでエージェントを動かした場合は、パッケージのメタデータとログを検索します。そのディレクトリから、次のBashコマンドを実行してください。一致したファイルの名前だけを表示します。
rg -l --hidden --no-ignore -F 'function-color' \
-g 'package.json' -g '*lock*' \
-g 'npm-shrinkwrap.json' -g '*.log' \
-g '!**/.git/**' \
.
一致したファイルはローカルで確認します。/tmp/ptoolsや関連するnpmインストールログが存在する場合は、それらも調べてください。プロジェクト内だけの検索では、別の場所にあるインストール痕跡を見落とす可能性があります。
Checkmarxのパッケージ分析は、function-colorの1.0.0と1.7.3を、function-flagを包む悪意あるラッパーと特定しています。そこで調べられたダウンローダーはWindowsを対象とします。macOSの設定にパッケージ名があるだけで、特定の攻撃コードが実行されたと判断してはいけません。
検索で名前が見つかった場合は、そのファイルの用途と記載内容を確認してください。記事の説明に名前が出ているだけなのか、インストール済みの依存パッケージの記録なのか、インストールログなのかを区別します。ロックファイルだけでも、インストールスクリプトが実行された証明にはなりません。インストール痕跡が見つかった場合は、調査が済むまで端末が侵害された可能性を前提に対応します。試すためにパッケージをインストールしたり、コードからインポートしたりしないでください。検索結果が空でも、名前を変えた攻撃コードや削除された痕跡は否定できません。
再ログインする前に、見つかった事実に応じて対処する
影響を受けた設定を再利用する前に、信頼できる端末から漏えいした認証情報を失効させてください。確認できた証拠に応じて、次の対応を選びます。
- 見覚えのない指示はあるが、使われた証拠がない場合: 調査用にファイルを保全し、エージェントの探索対象から外します。認証情報が漏えいしたか判断する前に、設定を点検してください。
- 不正なAPI接続先へ、認証情報付きのリクエストが送られた可能性がある場合: 該当する認証情報が漏えいした可能性を前提に扱います。失効させたうえで、アカウントの利用状況を確認してください。
- 悪意あるパッケージのコードが実行された証拠がある場合: 端末を隔離し、セキュリティ担当者に対応を依頼します。削除や復旧の前に、関連ファイルとログを保全してください。Markdownファイルだけを消しても、インストールされたコードは消えず、盗まれた認証情報も無効になりません。
Claudeのサブスクリプション認証には、Claudeのアカウントセッション管理を使います。Settings → Accountで該当セッションを失効させるか、アカウント全体のログアウトを実行してください。Claude CodeのトークンがSettings → Claude Codeに表示される場合は、そこで該当する認可を削除します。Anthropicは、アカウント全体のログアウトにはClaude Codeとsetup-tokenのトークンも含まれると説明しています。
APIキーには別の操作が必要です。Anthropicの漏えいしたAPIキーへの対処手順に従い、影響を受けたキーを削除して新しいキーを作成します。アカウントからログアウトしても、APIキーは失効しません。
OpenAIへのアクセスには、アカウント侵害への対処手順に従ってください。アカウントのセッションを終了し、漏えいしたAPIキーを削除し、利用状況を確認してサポートに連絡します。ローカルの認証情報ファイルを削除すれば、盗まれたリモートセッションも無効になるとは考えないでください。
その端末で再び認証する前に、確認済みの設定を復元し、不正な起動時の連携を取り除きます。何が実行されたか確認できない場合は、調査が済むまで通常の開発作業にその端末を使わないでください。
正規のゲートウェイの設定を自分で管理する
ゲートウェイのアドレスは自分で選び、その設定がどこから読み込まれるか確認してください。個人利用では、承認したAPI接続先をユーザー設定か、自分で管理するシェル環境に置きます。組織が管理するチームでは、承認された配布方法を使います。
プロジェクトから指定されるAPI接続先は、確認が必要な設定変更として扱ってください。正当なチーム設定の場合もあります。ただし、内部ゲートウェイと名乗っているだけで承認してはいけません。
たとえば、BetterTokenのClaude Code向け手順では、/v1を付けないhttps://bettertoken.aiと、自分のBetterToken APIキーを使います。このAPIアクセスは、Claudeのサブスクリプションとは別です。ゲートウェイ自身が発行した認証情報を使い、サブスクリプションのOAuthトークンを渡さないでください。
意図してCodexを連携させる場合は、プロバイダーの設定ブロックをCodexのカスタムプロバイダー設定ガイドと照合します。chatgpt_base_urlを、一般的なモデルAPIの設定として流用しないでください。
設定の点検または復旧が完了した後は、プロジェクトの設定やカスタマイズを除外してClaude Codeの接続を確認できます。すでに確認したプロジェクトディレクトリから、次を実行してください。
claude --safe-mode --setting-sources user --permission-mode default
これらのフラグはCLIリファレンスに記載されています。セーフモードは、指示ファイル、プラグイン、MCPサーバーなどのカスタマイズを読み飛ばします。認証と権限制御は引き続き動作します。ユーザー設定と組織の管理ポリシーも、信頼できる内容である必要があります。defaultの権限モードにはManualというラベルが付いています。
クライアントがフラグを受け付けない場合は、続行する前にclaude --helpと公式の更新手順を確認してください。
/statusで、読み込まれた設定元を確認します。次に、Reply with OK. Do not use tools.のような短いプロンプトを送ります。ターミナルに応答が返ることを確認してください。プロバイダーの記録を確認できる場合は、リクエスト時刻を照合して、そのリクエストの経路を確かめます。これは通常のモデル利用として計上されます。
モデルが自分の名前を答えても、API接続先の確認にはなりません。経路が不明な場合は、Claude Codeで実際に使われているプロバイダーの確認手順に従ってください。設定が予期せず変わったら作業を止めます。この接続確認は、端末が侵害されていないことの証明ではありません。
ダウンロードと日常のエージェント作業を分ける
ブラウザーのダウンロード先とは別の場所に、確認済みのプロジェクトディレクトリを用意してください。ダウンロードしたCSVを使うなら、確認したうえで必要な入力ファイルだけを作業場所にコピーします。未確認のフォルダーを丸ごと移すと、指示ファイルも一緒に移ります。
ChromeでSettings → Downloadsを開き、Ask where to save each file before downloadingを有効にします。ファイルごとに保存先を確認する設定です。保存前に判断する機会を増やせますが、保存済みファイルの点検に代わるものではありません。
サンドボックスの制限と承認制御を有効にしておきます。Codexのセキュリティドキュメントは、コマンドのサンドボックスと、MCP接続やクライアントの認証通信を区別しています。コマンド用のサンドボックスが読み取り専用でも、未確認の設定を安全に初期化できるとは限りません。
新しくクローンしたとき、アーカイブを展開したとき、エージェントの設定を変更したときにも、同じ点検を行ってください。信頼できないコードを実行する必要がある場合は、普段の開発用認証情報を入れない隔離環境を使います。