Zurück zu allen Beiträgen
Veröffentlicht am · von Renaud Deraison

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.

Verschiedene Türen, dieselbe RückwandClaude Code · CVE-2026-54316Validator und Shell parsen denString unterschiedlichgit push --receive-pack passiert 23 Checkstac liest; Actions-Logs tragen es rausHuggingFace-Zähler leakt zeichenweiseGemini CLI · CVSS 10.0Headless-Modus vertraut dem OrdnerConfig läuft vor dem Sandbox-Start„eingeschränkte“ Liste nie durchgesetztKind bereinigt, doch Eltern-Geheimnisseweiter lesbar via /procCodex · AGENTS.mdzwei Durchläufe, ein Workspace.git und .codex geschützt; AGENTS.md nichtDurchlauf 1 vergiftet die Datei„sicherer“ Lauf 2 lädt sie als Autoritätund trägt sie erhöht weiterDer gemeinsame letzte Schrittein echtes Credential aus dem Prozessoder der Umgebung lesen und verschicken
Drei voneinander unabhängige Harness-Umgehungen, gemeinsam offengelegt. Die Türen unterscheiden sich — ein Quoting-Mismatch, eine nicht durchgesetzte Allowlist plus ein /proc-Leck, eine vertrauenswürdige Anweisungsdatei, die zwischen den Durchläufen überlebt. Die Rückwand ist identisch: Jede Kette endet damit, ein echtes Credential aus dem Prozess oder der Umgebung des Agenten zu lesen und es irgendwohin zu schicken.

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.

Eine normale Workstationder Prozess hältechten API-Key, Token, Cloud-Credsin Env-Vars, /proc und auf der Platteder Exploit liest estac, /proc oder ein erhöhter Durchlaufdie Exfiltration liefert einen echten Keyund er darf schreibengit push erreicht den Branchein vergiftetes Paket geht stromabwärtsIn einem Bromure-Profilder Prozess hältbrm_-Platzhalter, getauscht am Proxyder echte Wert betritt die VM nieder Exploit liest esgleiches tac, gleiches /proc, gleicher Laufdie Exfiltration liefert einen Köderund das Schreiben wird verweigertgit-receive-pack am Proxy blockiertdie VM, in der er lief, ist wegwerfbar
Der gemeinsame letzte Schritt, an zwei Orten. Auf einer normalen Workstation liest der Exploit ein echtes Credential direkt aus dem Prozess, und die Exfiltration liefert einen funktionierenden Schlüssel. In einem Bromure-Profil gelingt derselbe Lesezugriff gegen einen Platzhalter, der Schreibzugriff, der den Branch vergiften würde, wird am Proxy verweigert, und die Box, in der der Agent lief, ist wegwerfbar.

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.