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

Die Blockade war die Zustellung

Auf der DEF CON 34 hat Tenet Security diese Woche einen Angriff gezeigt, der mit einer Anfrage beginnt, die Ihre Firewall garantiert abweist. Genau der 403 ist der Punkt: Die WAF schreibt die blockierte Anfrage wortwörtlich ins Sicherheitsprotokoll, und Tage später liest ein Coding-Agent dieses Protokoll, um die 403er zu debuggen, und befolgt die Anweisungen darin. Kein Schritt der Kette ist unautorisiert. Bromure Agentic Coding bewertet den Text beim Eintreffen und hält die Zugangsdaten, die der gekaperte Agent braucht, aus der Maschine heraus, auf der er läuft.

Die Firewall hat funktioniert. Sie hat die Regel getroffen, einen 403 zurückgegeben und die abgewiesene Anfrage ins Protokoll geschrieben, genau wie vorgesehen. Dieser Protokolleintrag ist der Weg, auf dem die Payload den Coding-Agenten erreicht hat.

Die DEF CON 34 ist heute Morgen in Las Vegas zu Ende gegangen. Am Freitag hielten Barak Sternberg, Nevo Poran und Ron Bobrov von Tenet Security einen Vortrag, dessen Titel zugleich das Argument ist: Your WAF Blocked Us, That Was The Exploit. Im Programm heißt es dazu „Remote Agent Takeover via Cloudflare, Sentry and Claude Zero-Day for data exfil“. Die zusammenfassende Berichterstattung erschien am 8. August.

Dasselbe Team taufte im Juni Agentjacking, nachdem es gezeigt hatte, dass ein gefälschter Sentry-Fehlerbericht, über MCP abgerufen, einen Coding-Agenten in 85 % der Versuche dazu brachte, angreiferkontrollierten Code auszuführen, über mehr als hundert produktive Instanzen hinweg. Der Vortrag vom Freitag dehnt das auf Sentrys eigenen Agenten Seer aus, dessen vergiftete Empfehlungen dann stromabwärts nach Cursor fließen. Die Cloudflare-Kette ist das neue Material.

Der 403 ist der Punkt

Beginnen Sie beim Problem des Angreifers. Er kommt an Ihren Coding-Agenten nicht heran. Der läuft auf dem Rechner einer Entwicklerin, hinter allem, was Ihnen gehört, und der Angreifer hat keine Zugangsdaten, keine Sitzung und keinen Weg hinein.

Also schickt er eine Anfrage, die abgewiesen werden soll.

Die WAF trifft eine Managed Rule und gibt 403 zurück. Sie erledigt außerdem die andere Hälfte ihrer Aufgabe und schreibt die blockierte Anfrage samt Payload ins Sicherheits-Eventlog. Ein Protokolleintrag ohne die Payload wäre für die Analystin, für die er existiert, wertlos.

Tage später fällt jemandem auf, dass der Endpunkt 403er wirft, und bittet den Agenten, sich das anzusehen. Der Agent ruft Cloudflares Observability-MCP-Server auf, einen der offiziellen Server, die Cloudflare dafür veröffentlicht, und holt die Zeilen der blockierten Anfragen. Der Text des Angreifers trifft in einem tool_result-Block ein, von einem Erstanbieterdienst, den die Entwicklerin selbst angebunden hat, unter einem Feld, das bedeutet dies ist eine Anfrage, die wir abgelehnt haben.

Der Agent liest ihn als Anweisungen. Dann nutzt er seine eigenen autorisierten Cloudflare-Werkzeuge, um DNS-Einträge umzuschreiben und Kundenverkehr umzuleiten. Tenet beziffert die Exposition auf über 15.000 Organisationen, darunter 27 % der Fortune 1000.

Jeder Schritt unten tut seine Arbeit1. eine Anfragegebaut, um abgewiesen zuwerden, an einen Endpunktkein Zugang nötig2. die WAF blocktManaged Rule trifft: 403und schreibt die Anfragewortwörtlich mit, korrekt3. jemand fragt„warum wirft der Checkout403er? sieh mal nach“eine ganz normale Aufgabe4. der Agent liestObservability-MCP-Server, erste Partei,bewusst angebundentool_result: blocked_request.bodyder Text des Angreifers, unverändert, in einem Feld, dessen Name heißt „das ist die Anfrage, die wir gestoppt haben“der Agent schreibt DNS mit eigenen Werkzeugen umKundenverkehr wird umgeleitet; jeder Aufruf ist autorisiert
Die Blockade ist es, die die Payload zustellt. Der Angreifer erreicht den Agenten nie, also schickt er eine Anfrage, die die WAF garantiert abweist, und die WAF legt die Payload wortwörtlich im Protokoll ab. Der Agent holt sie später über MCP, von einem Herstellerdienst, verpackt in einem Feldnamen, der bedeutet, dass die Anfrage gestoppt wurde.

Nichts Unautorisiertes passiert

Tenet nennt das Muster die Authorized Intent Chain, und der Juni-Text formuliert die Konsequenz:

Gehen Sie die Kette noch einmal durch und suchen Sie den Schritt, auf den Sie alarmieren würden. Die Entwicklerin hat den Agenten autorisiert. Der Agent wurde mit dem MCP-Server konfiguriert. Der MCP-Server hat Protokolle abgefragt, für deren Abfrage er gedacht ist. Das genutzte Konto trägt die DNS-Berechtigung, die Sie ihm mit Absicht gegeben haben. Und die Anfrage, die alles ausgelöst hat, wurde blockiert. Jede Kontrolle auf dem Weg hat genau das getan, wofür sie gekauft wurde, und die Komposition dieser korrekten Verhaltensweisen ist der Angriff.

Alles, was funktioniert, indem es fragt wer tut das und darf er das, wird an jedem Sprung mit ja antworten, weil die Antwort ja lautet. Zwei Züge bleiben: den Text auf seinem Weg hinein lesen, und die Durchsetzung dorthin legen, wo der gekaperte Agent sie nicht erreicht.

Den Text beim Eintreffen bewerten

Bromure Agentic Coding führt den Agenten in einer wegwerfbaren Linux-VM auf Apple Silicon aus und leitet jedes Byte seines Verkehrs durch einen Proxy auf dem Host, außerhalb der Box, in der der Agent läuft. Das schließt den Modellverkehr ein, und genau dort werden Protokollzeilen zu Anweisungen.

Werkzeugausgaben treffen nicht vertrauenswürdig ein

Bromure bewertet die Inhalte, die der Agent liest, einschließlich Dateiinhalten, Webseiten und der tool_result-Blöcke, die von MCP-Servern und Shell-Befehlen zurückkommen, mit einem lokalen Prompt-Injection-Modell. Dieser Detektor sucht genau danach: nach einer Protokollzeile, die einen Imperativ an ihre Leserin trägt. Er bewertet die Passage selbst, deshalb bringt es der Payload nichts, dass Cloudflare sie über eine Verbindung liefert, die Sie eingerichtet haben.

Sie entscheiden, was eine Erkennung bewirkt

Log and continue schreibt jeden Treffer ins Security-Log-Fenster und lässt die Anfrage durch. Ask me what to do hält die ausgehende Anfrage an und zeigt Ihnen den markierten Text, damit Sie mit dem Satz vor Augen entscheiden. Block stoppt einseitig, bevor das Modell liest, und der Agent bekommt einen harten 451, den er als API-Fehler meldet.

Autoritätsdateien bekommen einen eigenen Klassifikator

Config-Poisoning war die andere Hälfte der DEF-CON-Veröffentlichung. Ein feinabgestimmter ModernBERT-Klassifikator bewertet die Dateien, die ein Agent als Daueranweisung behandelt, CLAUDE.md und AGENTS.md und GROK.md samt ihrer verschachtelten und globalen Varianten, daneben ein deterministischer Scanner für die Payloads aus Zero-Width-, Bidi- und Unicode-Tag-Zeichen, die kein Modell lesen kann.

Es bleibt auf Ihrem Mac

Beide Detektoren laufen auf dem Gerät, aus Modellen, die Sie einmal von bromure.io herunterladen. Ihre Produktions-WAF-Protokolle auf eingeschleuste Anweisungen zu prüfen, heißt nicht, Ihre Produktions-WAF-Protokolle irgendwohin zu schicken.

Der Schreibzugriff braucht einen Schlüssel, der nicht in der Maschine ist

Angenommen, eine Payload kommt trotzdem durch. Am Ende dieser Kette steht ein API-Aufruf, der einen DNS-Eintrag ändert, und dieser Aufruf braucht Zugangsdaten.

In einem Bromure-Profil sind sie nicht da, um genommen zu werden. Ein Cloudflare-Token kommt als Other API keys-Eintrag hinein, wodurch ein falscher brm_…-Wert erzeugt und unter dem Umgebungsvariablennamen Ihrer Wahl in die VM exportiert wird. Das echte Token bleibt auf dem Host, und der Proxy setzt es auf der Leitung ein, bei ausgehenden Anfragen an den einen Zielhost, an den Sie es gebunden haben. Der Prozess des Agenten hält es nie. Eine Dotfile oder eine Shell-History auch nicht.

Schalten Sie Require approval to use für diesen Eintrag ein, und jede Ersetzung wirft einen Dialog auf macOS auf, außerhalb der VM, bevor Bromure den echten Wert weiterreicht. Ein gekaperter Agent kann ein wohlgeformtes DNS-Update zusammenstellen, und er kann den Dialog nicht beantworten.

Für den restlichen Wirkungsradius gibt es eine strengere Antwort. Guardrails ist eine Policy-Engine, die im Host-Proxy läuft und destruktive Operationen aus den Protokollen entfernt, die der Agent spricht: Kubernetes, AWS, DigitalOcean, Container-Registries, GitHub, GitLab, Bitbucket und die HTTPS-Datenbankendpunkte. Wählen Sie pro Ressource Block destructive oder Read-only, und ein blockierter Aufruf kommt als harter 403 zurück. Weil der Host diese Entscheidung trifft, hat ein Agent, der drinnen in der VM den Anweisungen eines Fremden folgt, nichts zum Abschalten.

Auf dem Laptop der Entwicklerindie Protokollzeile trifft einMCP-Server erster Partei, also vertrauenswürdignichts liest den Text selbstdas Token liegt direkt daCLOUDFLARE_API_TOKEN, gültig, nutzbarder DNS-Schreibzugriff geht raus und gelingtund kein Alarm geht losautorisierte Nutzerin, autorisierter Agent,autorisiertes Token, autorisierter AufrufIn einem Bromure-Profildie Zeile wird beim Eintreffen bewertetein lokales Modell liest die Passage, nicht den Absenderfragen, oder mit hartem 451 blockendas Token ist nicht in der VMenv hält brm_…, echter Wert auf dem Hostdie Ersetzung wirft einen Dialog auf macOS aufund die Kette ist eine Liste von ZeilenHost, Status, Latenz, Ersetzungsberichtpro Anfrage, im Trace Inspector
Derselbe gekaperte Agent, auf zwei Maschinen. Auf dem Laptop einer Entwicklerin steckt das Token in der Umgebung und der Aufruf geht raus. In einem Bromure-Profil wird die Protokollzeile beim Eintreffen bewertet, die Umgebung hält nur einen Platzhalter, das echte Token wird auf dem Host hinter einem Zustimmungsdialog eingesetzt, und der ganze Austausch ist eine Zeile im Security Log.

Ein Sandbox-Bug verschiebt keinen Hypervisor

Der Vortrag legte außerdem einen Claude-Zero-Day offen, der die Netzwerk-Sandbox des Agenten für vollständige Datenexfiltration umgeht, dazu agentische Rootkits, zusammengesetzt aus Memory-Injection und Config-Poisoning, die kein EDR aufgreift. Beide Befunde zeigen auf dieselbe Schwachstelle: Die Eingrenzung, die ein Agent mitbringt, ist von innen erreichbar.

Bromure legt die Grenze woandershin. Die Grenze ist eine virtuelle Maschine, die auf Apples Hypervisor mit eigenem Kernel hinter NAT läuft, wobei jedes Paket einen Proxy passiert, der auf macOS läuft. Ein Defekt in der In-Process-Sandbox des Agenten ist ein Defekt innerhalb der VM. Er verschiebt die VM nicht, und er verschafft Code in der VM keine Route ins Netz, die den Host-Proxy auslässt.

Und wenn doch etwas dort landet, landet es auf einer Maschine, die zum Wegwerfen gebaut ist. Erase home wischt /home/ubuntu, also Dotfiles, .ssh, npm-global, .cargo und Shell-History, und setzt es auf den Zustand nach dem Klonen zurück. Reset to base verwirft jede Änderung auf Systemebene und klont die Arbeitsdisk neu aus dem Basis-Image. Das Rootkit, das kein Scanner findet, sitzt weiterhin in einer Disk-Schicht, die Sie löschen können.

Die unsichtbare Kette, aufgeschrieben

Tenets stärkste Beobachtung ist, dass sich die Kette in aller Öffentlichkeit versteckt, weil jeder Schritt darin legitim ist. Es gibt keine Signatur und keine Anomalie zum Korrelieren.

Bromure versucht gar nicht erst, eine zu korrelieren. Jede Anfrage, die die VM stellt, passiert den Host-Proxy, und Bromure hält Host, Status, Latenz und die eingesetzten Zugangsdaten fest. Injection-Erkennungen landen im Security Log mit dem markierten Text im Anhang. Erhöhen Sie die Trace-Stufe, und Bromure behält auch die Bodies der KI-Anfragen, verschlüsselt mit demselben Keychain-Schlüssel wie Ihre Profilgeheimnisse.

Sie dürfen dann eine andere Frage stellen: Was hat diese Sitzung angefasst? Ein Agent, der den Nachmittag mit dem Lesen von Cloudflare-Protokollen verbracht und dann seinen allerersten Aufruf an die DNS-API gemacht hat, sind zwei Zeilen, die Sie lesen können, auf der Maschine, auf der die Sitzung lief, ohne Agent zum Ausrollen und ohne SIEM zum Weiterleiten.

Cloudflare wird die eigene Oberfläche nachziehen, Sentry die seine, und die beiden Ketten aus dem Freitagsvortrag werden sich schließen. Paaren Sie irgendein System, das feindliche Eingaben aufzeichnet, mit irgendeinem Agenten, der Aufzeichnungen liest, um seine Arbeit zu tun, und Sie haben diesen Angriff aus zwei Teilen nachgebaut, die beide ihre Arbeit tun. Sie führen Protokolle, damit jemand sie liest, und diese Leserin ist inzwischen ein Programm, das auf das Gefundene hin handelt.

Ein Instinkt deckt das ab: Behandeln Sie alles, was der Agent liest, als etwas, das ein Fremder geschrieben haben könnte, einschließlich der Teile, die Ihre eigenen Abwehrmechanismen aufgeschrieben haben.

Installieren Sie Bromure Agentic Coding, und setzen Sie zwischen Protokoll und Agent etwas, das den Text prüft.