Drei Agenten, ein Ziel zum Stehlen
Auf der Black Hat USA 2026 hat Novee die Standardkonfiguration von Claude Code, Gemini CLI und Codex auf drei verschiedene Weisen gebrochen — jede beginnend mit einem GitHub-Issue, das ein anonymer Fremder anlegen konnte. Die Umgehungen hatten nichts miteinander zu tun — ein Quoting-Mismatch, eine nicht durchgesetzte Shell-Allowlist, eine als vertrauenswürdig geladene AGENTS.md — doch alle drei Ketten endeten mit demselben Schritt: ein echtes Credential aus dem Prozess des Agenten lesen. Bromure Agentic Coding härtet diesen letzten Schritt nicht. Es leert den Prozess: Die Exfiltration läuft durch und liefert einen Köder.
Drei Anbieter, drei voneinander unabhängige Harness-Bugs, ein gemeinsamer
letzter Zug: den API-Schlüssel oder das Token aus dem Prozess des Agenten
lesen und nach draußen schicken. In einem Bromure-Profil ist dieser Wert
ein brm_…-Platzhalter. Die Exfiltration gelingt, und der Angreifer
erhält eine Zeichenkette, die außerhalb Ihres Macs nichts bedeutet.
Auf der Black Hat USA 2026 hat Novee diese Woche „Trusted Enough to Run: Breaking AI Agents in Official Workflows“ vorgestellt. Der Forscher Elad Meged testete die Standard-Konfiguration dreier Coding-Agenten gegen die öffentlichen Repositories der jeweiligen Anbieter — und brach alle drei. Die Berichte erschienen am 6. August.
Der Einstiegspunkt war in jedem Fall derselbe, und es ist der billigste, den es gibt: ein GitHub-Issue oder Pull Request, angelegt von einem anonymen Fremden ohne jegliche Rechte. Der Agent liest den nicht vertrauenswürdigen Text im Zuge seiner Arbeit, und das Harness — der Code um das Modell herum, der entscheidet, was es ausführen darf — schafft es nicht, diesen Text auf der richtigen Seite der Linie zu halten. Novee fand dieselben verwundbaren Defaults auf über hundert öffentlichen Repositories jenseits der drei getesteten Anbieter.
Die drei Angriffswege haben nichts miteinander zu tun. Sie enden am selben Ort, und dieses gemeinsame Ende ist der Teil, den man mitnehmen sollte.
Drei verschiedene Türen, eine Rückwand
Claude Code
Die als CVE-2026-54316 geführte Kette nutzte zwei Nähte. Die erste war eine
Diskrepanz zwischen der Art, wie Claude Code einen Befehl validierte, und
der Art, wie die Shell ihn tatsächlich interpretierte: Eine Zeichenkette in
Anführungszeichen, die für den Validator harmlos aussah, wurde von bash
anders geparst, und ein git push --receive-pack-Flag ritt durch
dreiundzwanzig Sicherheitsprüfungen,
die alle, jede für sich, ihre Arbeit taten. Die zweite Naht war die
Exfiltration. Ein rein lesendes tac — der Befehl, der eine Datei rückwärts
ausgibt — genügte, um ein Geheimnis zu lesen und es rückwärts über die
GitHub-Actions-Logs hinauszuschieben, und eine Variante ließ den
API-Schlüssel Zeichen für Zeichen entweichen, indem sie den öffentlichen
Download-Zähler eines HuggingFace-Modells anstieß und wieder auslas.
Anthropic lieferte Fixes.
Gemini CLI
Bewertet mit CVSS 10.0. Im Headless-Modus vertraute Gemini CLI dem
Arbeitsordner automatisch und lud jede Agenten-Konfiguration, die es dort
fand — ohne Sandbox, ohne Freigabe — sodass ein Pull Request, der eine
Konfigurationsdatei platzierte, lief, bevor die Sandbox überhaupt
initialisiert war. Zwei Annahmen des Harness gaben nach: Die „eingeschränkte“
Shell-Allowlist wurde zur Laufzeit nie durchgesetzt, und die
Umgebungsbereinigung, die Geheimnisse aus dem Kindprozess entfernte, ließ
sie im Eltern-Prozess liegen, lesbar über /proc. Google lieferte eine
Breaking Change am Headless-Vertrauensmodell in 0.39.1 und
0.40.0-preview.3.
Codex
Codex fährt zwei Agenten-Durchläufe über einen gemeinsamen Workspace. .git
und .codex waren gegen Schreibzugriffe geschützt; AGENTS.md nicht, und
sie wurde bei jedem Lauf als vertrauenswürdige Anweisungen neu geladen. Der
erste Durchlauf, der nicht vertrauenswürdige Eingaben verarbeitete, schrieb
eine vergiftete AGENTS.md; der zweite, „sichere“, lud sie als Autorität
und trug die bösartigen Anweisungen mit erhöhten Rechten weiter. OpenAI
trennte die Durchläufe innerhalb von drei Tagen in isolierte Jobs.
Der Teil, der gleich ist
Novees eigenes Fazit lautet, dass „keine davon simple Fehlkonfigurationen waren — es waren korrekte Sicherheitsentscheidungen, die an den Übergabepunkten zerbrachen“. Das ist die richtige Lesart für das Harness. Aber sehen Sie sich an, wo jede Kette endet.
Claudes tac liest ein Credential, und der HuggingFace-Zähler leakt den
API-Schlüssel. Geminis /proc-Lücke legt die Geheimnisse im
Elternprozess offen. Codex' erhöhter zweiter Durchlauf trägt die Tokens
der Umgebung in eine vom Angreifer kontrollierte Anweisung. Drei
zusammenhanglose Nähte öffnen sich auf drei verschiedene Weisen, und jede
endet damit, nach demselben Objekt zu greifen: einem echten Geheimnis, das
im Prozess oder in der Umgebung des Agenten lag und darauf wartete, gelesen
zu werden.
Das ist die Annahme, die all diese Exploits teilen — dass das Credential
gleich dort liegt, wenn man erst einmal Code als der Agent ausführt. Und das
tut es fast immer. Der ANTHROPIC_API_KEY, das GITHUB_TOKEN, die
AWS-Schlüssel: Die gewöhnliche Art, einen Coding-Agenten zu betreiben, legt
sie alle in die Umgebung des Prozesses, weil die Tools sie genau dort
erwarten.
Bromure Agentic Coding versucht nicht, das Wettrüsten ums Harness zu gewinnen. Es entfernt das, was das Harness schützt.
Wo die Kette reißt
Bromure führt den Agenten jedes Profils in einer wegwerfbaren Linux-VM auf Apple Silicon aus und leitet jedes Byte seines Netzwerkverkehrs durch einen Proxy auf dem Host, außerhalb der Box, in der der Agent läuft. Sie können denselben autonomen Issue-Triage-Agenten betreiben, den Novee angegriffen hat — selbst gehostet, statt ihm einen Workflow-Runner zu überlassen. Gehen Sie die drei Ketten gegen diese Anordnung durch: Jede zerfällt, und der Credential-Schritt zerfällt bei allen dreien auf dieselbe Weise.
Das Credential ist nie im Prozess
Das ist die Garantie, die den gemeinsamen letzten Schritt neutralisiert.
Die echten Schlüssel von Anthropic, OpenAI und xAI werden als
brm_…-Platzhalter in die VM injiziert und erst am Host-Proxy gegen die
echten Werte getauscht — auf der Leitung, für den einen Zielhost, zu dem
jeder gehört. Der Schlüssel ist nie im Speicher der VM, nie in /proc,
nie in einer Umgebungsvariablen, die ein Kind- oder Elternprozess lesen
könnte, nie in einem Log. tac liest einen Köder. Der
HuggingFace-Zähler leakt einen Köder, Zeichen für Zeichen. Der
/proc-Scrape liefert einen Köder. Jede Exfiltration aus dem Vortrag
läuft bis zum Ende durch und verschickt eine Zeichenkette, die sich auf
genau einem Mac auflöst — und der ist nicht die Maschine, auf der sie
lief.
Die RCE landet in einer Box, die Sie löschen können
„Codeausführung auf dem Host, der den Agenten betreibt“ — so steht es im Gemini-Advisory, und dieser Host ist die Vertrauensgrenze, die Bromure verschiebt. Geminis Ausführung vor der Sandbox-Initialisierung und Claudes Shell-Bypass bekommen beide eine wegwerfbare Linux-VM, einen Hypervisor von macOS entfernt, hinter NAT, von der aus nichts in Ihrem Netzwerk erreichbar ist. Erase home verwirft, was der Lauf geschrieben hat, und setzt das Home-Verzeichnis auf den Zustand nach dem Clone zurück. Der Exploit, der den Agenten übernimmt, übernimmt eine VM, die Sie ohnehin wegwerfen wollten.
Der Schreibzugriff auf main wird am Proxy verweigert
Beide Eskalationen zielen auf denselben Preis: Claudes Kette pusht mit
git push --receive-pack, Geminis pusht bösartigen Code in den
Main-Branch. Das ist die Supply-Chain-Hälfte — ein kompromittierter
Checkout wird stromabwärts zum vergifteten Paket. Stellen Sie die
GitHub-Leitplanke auf Nur-Lesen oder Destruktives-Blockieren, und
git-receive-pack wird am Host-Proxy verweigert, wo eine in der VM
umgangene Wache keine Stimme hat. Fetches gehen weiterhin durch; der
Push, der den Branch vergiften würde, nicht.
Die Anweisungsdatei wird bewertet, bevor ihr gehorcht wird
Der Einstieg ist nicht vertrauenswürdiger Issue- und PR-Text, den das
Harness nicht einhegen konnte, und Codex' gesamte Kette lebt in einer
geschriebenen AGENTS.md. Bromure bewertet die Tool-Ergebnisse, die der
Agent liest — Webseiten, Issue-Texte, Dateiinhalte — mit einem lokalen
Prompt-Injection-Modell und bewertet die Autoritätsdateien selbst
(CLAUDE.md, AGENTS.md und ihre Varianten) mit einem dedizierten
Klassifikator plus einem Scanner für unsichtbare Unicode-Payloads. Die
vergiftete AGENTS.md zwischen Codex' beiden Durchläufen ist genau das,
wofür dieser zweite Detektor gebaut ist, und er läuft auf dem Host,
bevor das Modell auf die Datei reagiert.
Zwei dieser Einstellungen sind standardmäßig aktiv, und der Credential-Broker ist gar keine Einstellung — er ist schlicht die Art, wie ein Bromure-Profil ein Geheimnis überhaupt hält. Die verdeckten Kanäle runden es ab: Das GitHub-Actions-Log, der HuggingFace-Zähler, der unerwartete ausgehende Host — alle passieren den Host-Proxy, und das Security Log und der Trace Inspector protokollieren Host, Status und Tauschbericht jeder Anfrage. Der Seitenkanal, der einen Köder geleakt hat, ist damit auch eine Zeile auf einer Liste, die Sie lesen können.
Das Harness wird weiter brechen
Die drei Fixes, die Novee angestoßen hat, sind alle gut — und alle schmal. Anthropic korrigierte den Quoting-Mismatch; Google änderte das Headless-Vertrauensmodell; OpenAI trennte die Durchläufe. Jeder schließt die eine Naht, die gefunden wurde. Keiner ändert das, was die drei Exploits gemeinsam hatten: ein funktionierendes Credential, das im Prozess des Agenten zum Mitnehmen bereitlag. Der nächste Harness-Bug — und Novee fand dieselben Defaults auf hundert weiteren Repositories, es wird also einen geben — wird wieder danach greifen.
Sie können jeder Offenlegung mit einem Patch und einem Config-Review begegnen, und das sollten Sie. Aber der Patch schließt eine Tür in einem Agenten, und das Review gilt pro Repository und pro Release. Das Credential, nach dem ein funktionierender Exploit greift, ist über alle drei Agenten und jeden künftigen Bug hinweg dasselbe — und es ist das eine, was Sie mit einer einzigen Entscheidung außer Reichweite bringen können: Behalten Sie das echte Geheimnis auf dem Host, geben Sie dem Agenten einen Platzhalter, und lassen Sie den Proxy den echten Wert nur für den Host erzeugen, an den er adressiert ist.
Installieren Sie Bromure Agentic Coding, und geben Sie dem Agenten eine Box — und ein Credential — deren Verlust Sie verschmerzen können.