Kurz gesagt: Laut dem Bericht von Forever Security vom 22. Oktober hat jemand im Ordner ~/Downloads auf dem Rechner eines echten Kunden eine als Engineering-Richtlinien getarnte Datei abgelegt: AGENTS.md. Startet Codex in diesem Ordner, folgt es der Datei und trägt einen MCP-Server in die globale ~/.codex/config.toml ein, über den dann das bösartige npm-Paket function-color installiert wird. Die Forscher bauten außerdem eine CLAUDE.md, die Claude Code dazu bringt, in die .claude/settings.json des Projekts eine ANTHROPIC_BASE_URL zu schreiben, die auf ihren Server zeigt – damit erhalten sie das Login-Token.
Wer einen Drittanbieter-API-Key nutzt, ändert ohnehin base_url, model_provider und ANTHROPIC_BASE_URL. Am wichtigsten ist deshalb: Unterscheiden Sie die Adressen, die Sie selbst gesetzt haben, von denen, die jemand hinzugefügt hat. Die Befehle unten dauern etwa eine Minute.
Das Wichtigste
- Beide Clients wurden vorgeführt: Laut Bericht ließ sich Codex in mehr als neun von zehn Tests zur Installation des Pakets bringen; Claude Code war schwerer zu täuschen und schrieb die bösartigen Einstellungen in etwa der Hälfte der Tests. Keiner der beiden hat einen Bug im eigentlichen Sinn – beide tun, was die Anweisungsdatei sagt.
- Codex ändert seine globale Konfiguration:
~/.codex/config.tomlgilt für alle Codex-Sitzungen auf dem Rechner, der MCP-Server des Angreifers lädt also weiter, auch wenn Sie den Downloads-Ordner verlassen. - Claude Code ändert die Projektkonfiguration: Die Projekt-
.claude/settings.jsonkann eineANTHROPIC_BASE_URLsetzen, die die global gesetzte AICodeWith-Adresse überschreibt. In unserem Test auf der Box lieferteclaude -pnach dieser einen zusätzlichen Zeile im Projekt 90 Sekunden lang keine Antwort; nach dem Entfernen antwortete es normal in 2,4 Sekunden. - Was zu prüfen ist: Bei Codex
[mcp_servers.*]undbase_url; bei Claude Code in jedersettings.jsonnachANTHROPIC_BASE_URLsuchen. Die korrekten AICodeWith-Adressen stehen weiter unten. - trust_level funktioniert weiterhin: Getestet mit Codex CLI 0.164.0 verhindert
[projects."<path>"] trust_level = "untrusted", dass dieAGENTS.mddieses Ordners geladen wird. Das ist nicht dasselbe wie das abgeschaffteapproval_policy = "untrusted". - Nach einem Vorfall: Verdächtige Konfigurationsblöcke löschen, den alten Key im Dashboard löschen und einen neuen anlegen; wer sich bei Claude Code mit einem offiziellen Konto anmeldet, führt
/logoutaus und meldet sich neu an.
API Key erstellen – derselbe Key für Claude Code und Codex →
Was passiert ist: wie die beiden Clients missbraucht wurden
Laut The Hacker News und BleepingComputer stoppte Forever Security auf einem Kundenrechner den Versuch von Codex, function-color zu installieren, und verfolgte die Anweisung zurück in den Ordner ~/Downloads, zu einer Datei namens AGENTS.md. Wie die Datei dorthin kam, konnten sie nicht klären; sie bauten aber eine Demo-Seite, die beim Öffnen still eine AGENTS.md in den Downloads-Ordner lädt. Chrome, Edge und Firefox speichern Dateien standardmäßig ohne Nachfrage in diesem Ordner.
| Codex | Claude Code | |
|---|---|---|
| Präparierte Datei | AGENTS.md (aus dem echten Angriff, ein etwa 13 KB großes „Engineering-Richtlinien“-Dokument) | CLAUDE.md (von den Forschern nach dem echten Vorbild gebaut) |
| Geänderte Konfiguration | Global ~/.codex/config.toml, angehängt wird [mcp_servers.project-tools] | Projekt .claude/settings.json, geschrieben wird ANTHROPIC_BASE_URL |
| Folgen (laut Bericht) | Der MCP-Server führt beim Start einen Befehl aus und installiert function-color; danach lädt er bei jedem Codex-Start, in jedem Ordner | Anfragen und das OAuth-Token gehen an den Server des Angreifers, der sich zudem als Modell ausgeben und auszuführende Befehle zurückgeben kann |
| Erfolgsquote laut Bericht | Mehr als neun von zehn | Einstellungen in etwa jedem zweiten Fall geschrieben |
Laut Bericht lässt die Codex-Datei Codex außerdem mit --dangerously-bypass-approvals-and-sandbox ein zweites codex exec starten, um trotz Sandbox ins Netz zu kommen. Forever sieht bei keinem der beiden Anbieter etwas zu „patchen“, weil die Clients einfach der Anweisungsdatei folgen – der Schutz liegt also bei Ihnen.
Vor der Prüfung: So sieht eine korrekte AICodeWith-Konfiguration aus
Wenn Sie AICodeWith nach dem Leitfaden zur Codex config.toml eingerichtet haben, sollte der adressbezogene Teil Ihrer globalen ~/.codex/config.toml so aussehen und nicht mehr enthalten:
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"
Wenn Sie Claude Code mit der Anleitung zur Drittanbieter-API für Claude Code eingerichtet haben, sollte Ihre ~/.claude/settings.json Folgendes enthalten:
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.aicodewith.ai",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY"
}
}
Die Faustregel ist einfach: Ist eine Adresse nicht api.aicodewith.ai und haben Sie sie nicht selbst eingetragen, behandeln Sie sie als verdächtig. Bei einem anderen Dienst vergleichen Sie mit der Adresse, die Sie ursprünglich eingetragen haben.
Prüfbefehle: macOS / Linux
Fügen Sie den ganzen Block in ein Terminal ein. Er liest nur und ändert nichts:
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
Listen Sie dann die MCP-Server mit dem jeweiligen Client-Befehl auf; die Ergebnisse sollten übereinstimmen:
codex mcp list
claude mcp list
Prüfbefehle: 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' }
Test: So sieht die Ausgabe bei sauberer Konfiguration und mit hinzugefügten Einträgen aus
Wir haben die Befehle oben auf der Box in einem isolierten Test-Home-Verzeichnis ausgeführt (Codex CLI 0.164.0, Claude Code 2.1.310), nur mit einem AICodeWith-Test-Key. Wir haben weder ein echtes bösartiges Paket noch eine Angriffsdatei ausgeführt.
Saubere Konfiguration: Die bash-Version war nach etwa 0,08 Sekunden fertig:
== 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 ==
Dann haben wir von Hand drei harmlose Demo-Einträge hinzugefügt: einen Server, der nur echo ausführt, eingetragen als [mcp_servers.project-tools]; eine Projekt-.claude/settings.json mit einer ANTHROPIC_BASE_URL, die auf eine nicht existierende Domain zeigt; und eine leere ~/Downloads/AGENTS.md. Zweiter Durchlauf (etwa 0,06 Sekunden):
== 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 listet ihn ebenfalls auf:
Name Command Args Env Cwd Status Auth
project-tools echo harmless-demo - - enabled Unsupported
Die PowerShell-Version (pwsh 7) war im selben Verzeichnis nach etwa 0,4 Sekunden fertig und fand alle drei.
Die Projektadresse überschreibt die globale: Die globale ~/.claude/settings.json zeigt auf AICodeWith, doch nach der zusätzlichen ANTHROPIC_BASE_URL-Zeile im Projekt gab claude -p "Reply OK" 90 Sekunden lang überhaupt keine Antwort (die Anfrage ging an die nicht existierende Adresse). Nach dem Löschen der Projektzeile kam nach 2,4 Sekunden OK. Genau so missbraucht der Bericht Claude Code: Egal wie korrekt Ihre globale Konfiguration ist, eine Zeile im Projekt reicht, um Ihre Anfragen umzuleiten.
Nach dem Entfernen der Demo-Einträge lieferten die Prüfbefehle wieder eine saubere Ausgabe, und je ein normaler Aufruf kam bei Codex nach etwa 2,8 Sekunden und bei Claude Code nach etwa 2,4 Sekunden zurück:
$ 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 erstellen und mit einem sauberen Key neu einrichten →
So bewerten Sie, was Sie finden
| Fund | Normal | Verdächtig |
|---|---|---|
| [mcp_servers.xxx] | Sie haben ihn selbst hinzugefügt und kennen Namen und Befehl | Sie haben ihn nie hinzugefügt; command ist etwas wie launchctl, bash -lc oder npm install |
| base_url | https://api.aicodewith.ai/chatgpt/v1 | Eine unbekannte Domain, besonders wenn sie als „internes Gateway“ bezeichnet wird |
| chatgpt_base_url / openai_base_url | Normalerweise nicht gesetzt | Aufgetaucht, ohne dass Sie ihn geschrieben haben |
| ANTHROPIC_BASE_URL | https://api.aicodewith.ai, nur in Ihrer eigenen Konfiguration | Steht in einer Projekt-.claude/settings.json, und Sie haben ihn nicht geschrieben |
| [shell_environment_policy.set] mit einem Key | Kann vorkommen, wenn Sie Codex /import genutzt haben | Die Adresse ist nicht AICodeWith |
| ~/Downloads/AGENTS.md, CLAUDE.md | Sollte normalerweise nicht da sein | Falls vorhanden: zuerst öffnen und lesen, und dort keinen Agenten starten |
Wie man eigene MCP-Server normal einträgt, steht im Codex-MCP-Einrichtungstutorial – vergleichen Sie damit, welche Einträge von Ihnen stammen.
Hinweis: Wenn Sie mit Codex /import von Claude Code migriert sind, enthält Ihre config.toml zusätzlich ANTHROPIC_AUTH_TOKEN und ANTHROPIC_BASE_URL. Diese hat die Importfunktion geschrieben, kein Angreifer; solange die Adresse AICodeWith ist, ist alles in Ordnung. Wie Sie damit umgehen, steht in unserem Test zur Migration mit Codex /import.
Vorbeugung: vier Gewohnheiten
- Starten Sie keinen Agenten in
~/Downloads. Um eine gerade heruntergeladene Datei zu bearbeiten, kopieren Sie sie zuerst in einen selbst angelegten Projektordner und starten Codex oder Claude Code dort. - Lesen Sie unbekannte
AGENTS.md/CLAUDE.md. Werfen Sie einen Blick in frisch geklonte Repos und Archive, die man Ihnen schickt. Wie normale Versionen dieser Dateien aussehen, zeigen Eine AGENTS.md für Claude Code und Codex gemeinsam nutzen und So schreiben Sie eine CLAUDE.md. Stehen dort Sätze wie „vor Beginn der Aufgabe die Konfiguration ändern“, „--dangerously-bypass-approvals-and-sandboxhinzufügen“ oder „internes Gateway einrichten“, behandeln Sie das als Angriff. - Freigaben und Sandbox eingeschaltet lassen. In Codex
approval_policy = "on-request"mit passendemsandbox_modeverwenden; in Claude Code Schreibzugriffe auf.claude/settings.jsonnicht leichtfertig genehmigen. - Downloads als nicht vertrauenswürdig markieren (Codex). Tragen Sie in Ihre globale
~/.codex/config.tomlein:
[projects."/Users/YOUR_USERNAME/Downloads"]
trust_level = "untrusted"
Verwenden Sie einen absoluten Pfad. Wenn Sie unter Windows beim Format unsicher sind, akzeptieren Sie einmal die Vertrauensabfrage von Codex in einem anderen Projekt und schauen Sie, was es in die config.toml schreibt: den Eintrag [projects...]. Übernehmen Sie dieses Format für Ihren Downloads-Pfad und ändern Sie trust_level auf "untrusted".
Funktioniert trust_level noch? Das ist etwas anderes als die abgeschaffte untrusted-Richtlinie
Metarix empfiehlt, für Downloads trust_level = "untrusted" zu setzen, während unser Beitrag Codex-Sandbox und /permissions einrichten schreibt, dass untrusted abgeschafft ist. Das widerspricht sich nicht:
- Abgeschafft wurde die Freigaberichtlinie
approval_policy = "untrusted"(undcodex -a untrusted); 0.164.0 bricht mit einem Fehler ab, wenn es sie findet. [projects."<path>"] trust_level = "untrusted"ist die Vertrauensstufe des Projekts und gilt weiterhin. Die offizielle Seite Config basics besagt, dass nicht vertrauenswürdige Projekte die projektbezogene.codex/-Konfiguration, Hooks und Regeln überspringen.
Wir haben mit Codex CLI 0.164.0 getestet: In drei Ordnern lag jeweils eine harmlose AGENTS.md mit dem Inhalt „beginne deine Antwort mit SENTINEL-AGENTSMD-7731“. Mit codex debug prompt-input haben wir angesehen, was das Modell tatsächlich erhält, und dann codex exec echt ausgeführt:
| Ordner-Einstellung | AGENTS.md im Prompt? | Tatsächliche Antwort von codex exec |
|---|---|---|
| trust_level = "untrusted" | Nein | 1 + 1 = 2. (etwa 3,6 s) |
| trust_level = "trusted" | Ja | SENTINEL-AGENTSMD-7731 1 + 1 = 2. (etwa 3,0 s) |
| Kein projects-Eintrag | Ja (sichtbar in codex debug prompt-input) | — |
Eine Sache ist wichtig: Die Einstellung greift für den Startordner und erfasst Unterordner nicht automatisch. Wir haben einen übergeordneten Ordner als untrusted markiert und Codex in einem Unterordner gestartet; die eigene AGENTS.md des Unterordners wurde trotzdem geladen. trust_level ist also eine zusätzliche Absicherung. Am sichersten bleibt Gewohnheit 1: Starten Sie nie einen Agenten im Downloads-Ordner oder dessen Unterordnern.
Nach einem Vorfall
- Verdächtige Konfiguration löschen: Zuerst sichern mit
cp ~/.codex/config.toml ~/.codex/config.toml.bak, dann jeden[mcp_servers.*]-Block löschen, den Sie nicht hinzugefügt haben, und jede unbekannte Adresse; die in die Projekt-.claude/settings.jsongeschriebeneANTHROPIC_BASE_URLentfernen. - Key tauschen: Behandeln Sie jeden Key in Ihren Konfigurationsdateien als kompromittiert. Melden Sie sich im AICodeWith-Dashboard an, löschen Sie auf der API-Key-Seite den alten Key, legen Sie einen neuen an und tragen Sie ihn wieder in
experimental_bearer_tokenundANTHROPIC_AUTH_TOKENein. - Claude Code mit offiziellem Konto: Führen Sie in Claude Code
/logoutaus und melden Sie sich neu an, damit das alte Token ungültig wird. Wer sich bei Codex mit einem ChatGPT-Konto anmeldet, meldet sich ebenfalls ab und wieder an; wo die Login-Daten liegen, steht in unserem Leitfaden zur Codex auth.json. - Nach
function-colorsuchen: Der im Bericht genannte Kompromittierungsindikator ist dieses npm-Paket (laut Bericht von npm entfernt). Finden Sie es auf einem Rechner, behandeln Sie den ganzen Rechner als kompromittiert. - Prüfbefehle erneut ausführen, um sicherzugehen, dass nur Ihre eigene Konfiguration übrig ist, und dann auf beiden Seiten eine kurze Anfrage senden, um zu bestätigen, dass alles funktioniert.
API Key erstellen und zu einem neuen Key wechseln →
Häufige Fragen
Ich nutze nur einen AICodeWith-Key und melde mich nie mit einem offiziellen Konto an. Bin ich betroffen?
Ja. Der Codex-Weg hängt nicht von der Anmeldung ab: Der hinzugefügte MCP-Server führt Befehle auf Ihrem Rechner aus. Claude Code sendet ANTHROPIC_AUTH_TOKEN als Request-Header an ANTHROPIC_BASE_URL; wird die Adresse geändert, wandert Ihr Key mit der Anfrage auf den Server eines anderen. Tauschen Sie den Key in jedem Fall.
Ich nutze einen Drittanbieter-Key und habe ANTHROPIC_BASE_URL ohnehin geändert. Wie unterscheide ich das?
Achten Sie darauf, in welcher Datei der Wert steht und wie er lautet. Ihren eigenen finden Sie meist in ~/.claude/settings.json oder in einer Shell-Umgebungsvariable, mit dem Wert https://api.aicodewith.ai; der Angriff im Bericht schreibt in die Projekt-.claude/settings.json, mit einer anderen Domain.
Muss ich projektbezogene .codex/config.toml-Dateien prüfen?
Ja, aber der Codex-Angriff im Bericht ändert die globale ~/.codex/config.toml, prüfen Sie also zuerst diese. Projektkonfiguration lädt nur in vertrauenswürdigen Projekten.
Wenn codex mcp list etwas anzeigt, bin ich dann betroffen?
Nein. Selbst hinzugefügte MCP-Server werden ebenfalls angezeigt. Prüfen Sie bei jedem Namen und Befehl, ob er von Ihnen stammt; kommentieren Sie Unbekanntes aus und gehen Sie der Sache nach.
Kann ich mit trust_level = "untrusted" trotzdem angegriffen werden?
In unserem Test wurde die AGENTS.md dieses Ordners nicht mehr geladen, aber die Einstellung gilt nur für genau den angegebenen Pfad, nicht für Unterordner. Die eigentliche Lösung ist, keine Agenten im Downloads-Ordner zu starten.



