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

Der Wächter und die Shell waren sich uneinig

Am 30. Juni legte Adversa AI GuardFall offen — eine Klasse von Umgehungen, die jahrzehntealte Bash-Tricks direkt an den Befehlswächtern vorbeiführt, die in 10 von 11 populären Open-Source-Coding-Agenten eingebaut sind. Der Grund ist einfach und auf dieser Ebene nicht behebbar: Der Wächter liest den Text, und Bash schreibt den Text um, bevor er ausgeführt wird. Bromure Agentic Coding hat nie darauf gesetzt, dass der Wächter Bash korrekt liest. Es hat darauf gesetzt, dass der Befehl keine Rolle spielt, wenn er läuft.

Der Sicherheitsfilter eines Coding-Agenten sah die Zeichenkette r''m -rf ~ und erkannte einen Befehl, den er nicht kannte, also ließ er ihn durch. Bash sah dieselbe Zeichenkette, warf die leeren Anführungszeichen weg und führte rm -rf ~ aus. Der Filter und die Shell lasen zwei verschiedene Sprachen. Diese Lücke ist kein Bug in einem Werkzeug — sie ist die ganze Idee, einen Agenten durch Mustervergleich der Befehle abzusichern, die er tippt, und Adversa AI hat gerade gezeigt, dass sie in zehn der elf getesteten Agenten scheitert.

Der Befehlswächter ist die Funktion, nach der jedes agentische Coding-Werkzeug zuerst greift. Der Agent schlägt einen Shell-Befehl vor; ein Filter prüft die Zeichenkette; sieht sie destruktiv aus — rm -rf, ein durchgeleitetes curl … | sh, ein dd auf ein rohes Gerät — blockiert der Wächter sie oder bittet um Bestätigung. Es ist das, was Sie die automatische Ausführung einschalten und sich sicher fühlen lässt. Am 30. Juni 2026 veröffentlichte Adversa AI eine Untersuchung, die The Hacker News und SecurityWeek aufgriffen, und die zeigt, dass die Funktion Theater ist.

Was GuardFall ist

Sie nennen es GuardFall, und es ist keine CVE. Es gibt nichts zu patchen, denn es ist kein Fehler in einer Komponente — es ist eine Diskrepanz zwischen zweien von ihnen. In Adversas Worten: „Ein Wächter prüft Rohtext, während die System-Shell (Bash) den Text expandiert, entquotet und umschreibt, bevor sie ihn ausführt." Der Filter greift auf die Zeichenkette zu, die das Modell ausgab. Bash schickt diese Zeichenkette dann durch Entfernung von Anführungszeichen, Variablen-Expansion und Befehlssubstitution, bevor ein einziges Byte ausgeführt wird. Die beiden sehen nie denselben Befehl, also segelt jeder Trick durch, der die Umschreibung überlebt, aber nicht den Vergleich.

Diese Tricks sind älter als die meisten Menschen, die die Agenten nutzen. Adversa gruppierte sie in fünf Klassen:

  • Entfernung von Anführungszeichen. r''m sind zwei Token für eine Regex und das Wort rm für Bash, das die leeren Anführungszeichen fallen lässt.
  • Variablen-Expansion. rm$IFS-rf$IFS/ sieht für einen Mustervergleicher wie ein langes Wort aus; Bash expandiert den internen Feldtrenner und erhält rm -rf /.
  • Befehlssubstitution. $(echo rm) -rf / versteckt das gefährliche Verb in $( ); der Wächter, der die äußere Zeichenkette prüft, sieht rm nie.
  • Kodierte Pipelines. echo <base64> | base64 -d | sh — jedes sichtbare Token ist harmlos; die Nutzlast existiert erst nach dem Dekodieren.
  • Alternative destruktive Flags. Gar kein rm: find /x -delete, tar -C / -x, sed -i. Eine Sperrliste rund um rm und dd löst nie aus.

Adversa ließ diese Tricks gegen elf der meistgenutzten Open-Source-Coding- und Computer-Use-Agenten laufen — opencode, Goose, Cline, Roo-Code, Aider, Plandex, Open Interpreter, OpenHands, SWE-agent und das Hermes-Projekt darunter, die zusammen rund 548.000 GitHub-Sterne tragen Stand Mai. Zehn fielen. Der einzige, der hielt, Continue, hielt aus einem bestimmten Grund: Statt die rohe Zeichenkette zu vergleichen, tokenisiert er den Befehl so, wie Bash es tun wird, bevor er entscheidet — er absorbiert die Anführungszeichen, löst $IFS auf, extrahiert den inneren Befehl aus einer Substitution, markiert jede Pipe, die auf sh endet. Er modelliert die Shell. Das ist das Einzige, was auf der Wächter-Ebene funktioniert, und es ist echte, sorgfältige Ingenieursarbeit, die die anderen zehn nun reproduzieren müssen, korrekt, und bei jedem Bash-Grenzfall und jedem Release korrekt halten müssen.

AGENT GIBT EINE ZEICHENKETTE AUSr''m -rf ~WÄCHTER · vergleicht Rohtextsieht die Tokenr''m · -rf · ~kein rm → erlaubt ✓BASH · schreibt um, dann läuftwirft die leeren Quotes wegrm -rf ~Home-Verzeichnis weg
Warum der Wächter verliert. Der Agent gibt eine Zeichenkette aus; der Mustervergleichs-Wächter liest sie, wie sie geschrieben ist, und findet nichts Destruktives; Bash expandiert, entquotet und schreibt dieselbe Zeichenkette dann in rm -rf um, bevor das Urteil des Filters irgendetwas bedeutet. Der Wächter und die Shell betrachten zwei verschiedene Befehle — die ganze Prämisse von GuardFall.

Das Problem ist die Ebene, nicht die Regex

Die Versuchung ist, GuardFall als „zehn Teams schrieben schwache Filter" zu lesen. Das verfehlt, was Adversa sagt. Ihr schärfster Satz betrifft keinen einzelnen Agenten:

Ein Agent, der beliebige Shell-Befehle auf dem Host des Betreibers ausführen kann, abgesichert durch eine Regex, die die vom LLM ausgegebene Zeichenkette vergleicht, ist keine Verteidigung. Er scheitert, während er voll aktiviert und korrekt konfiguriert ist, weil Zeichenketten-Vergleich nicht modellieren kann, was Bash ausführen wird.

Voll aktiviert und korrekt konfiguriert. Das ist keine Fehlkonfiguration, die Sie schließen können. Der Wächter sitzt auf der einen Ebene, wo er nie gewinnen kann — zwischen einem Modell, das Zeichenketten schreibt, und einer Shell, die sie neu interpretiert — und bittet einen Textvergleicher, die Ausgabe eines Turing-vollständigen Expanders vorherzusagen. Continues Tokenisieren-und-Kanonisieren-Ansatz verengt die Lücke, indem er dem Wächter beibringt, wie Bash zu denken, und es ist der richtige Schritt, wenn Sie dort einen Wächter behalten wollen. Aber es ist eine Verpflichtung pro Agent und pro Release, eine Shell zu überparsen, die dreißig Jahre damit verbracht hat, Wege zum Umschreiben eines Befehls anzuhäufen. Neun andere populäre Agenten zeigen, wie leicht man es falsch macht.

Adversas kompensierende Kontrollen sind aufschlussreich. Noch vor jeder strukturellen Lösung raten sie Ihnen, $HOME in eine begrenzte Sandbox umzuleiten, die den Projektzugriff behält, aber Anmeldedaten entfernt, die Auto-Ausführungs-Flags zu streichen, Agenten davon abzuhalten, auf nicht vertrauenswürdigen Pull Requests zu laufen, und jede Repository-Konfigurationsdatei als nicht vertrauenswürdigen Code zu behandeln. Lesen Sie diese Liste noch einmal. Es ist kein Rat, wie man einen besseren Filter schreibt. Es ist Rat, wie man eine Box um den Agenten baut, damit — wenn der Filter verliert, und sie sagen Ihnen, dass er verlieren wird — der durchkommende Befehl irgendwo landet, wo er Ihnen nicht schaden kann.

Diese Box ist das Produkt.

Bromure bat den Wächter nie, Bash zu lesen

Bromure Agentic Coding geht von der Annahme aus, die GuardFall beweist: Der Agent wird früher oder später einen Befehl ausführen, den Sie nicht gebilligt haben. Es versucht nicht, diesen Befehl durch Lesen abzufangen. Es lässt den ganzen Agenten laufen — Aider, Goose, opencode, welchen der zehn Sie mögen — in einer wegwerfbaren Linux-VM, und leitet jede Netzwerkanfrage über einen Proxy auf dem Host. Die Design-Frage ist nie „wird der Filter dieses rm erkennen?". Sie lautet „wenn das rm läuft, was erreicht es?".

Schicken Sie GuardFalls eigene Nutzlasten durch diese Box.

Der Sinn des Angriffs, sobald ein verstecktes r''m oder ein find /x -delete ein präpariertes README am Wächter vorbeischmuggelt, ist, zu stehlen, was das Konto erreichen kann — Adversa nennt ~/.ssh, ~/.aws, Cloud-Anmeldedaten, „alles, was in Ihrem Home-Ordner liegt" — und es zu löschen oder zu exfiltrieren. In Bromure sind das die Dinge, die nie in der Box waren. Die echten Geheimnisse betreten die VM nie: Wenn Sie einem Profil einen AWS_SECRET_ACCESS_KEY, ein GitHub-Token, einen Anthropic-Schlüssel geben, erhält die Umgebung des Agenten einen brm_…-Platzhalter, und der Host-Proxy tauscht den falschen gegen den echten Wert auf der Leitung, nur bei der ausgehenden Anfrage an den Anbieter, der ihn erhalten soll. Adversas empfohlene Minderung — $HOME irgendwohin zu verschieben, das „den Projektzugriff behält, aber Anmeldedaten entfernt" — ist eine handgestrickte, teilweise Version dessen, was ein Bromure-Profil standardmäßig tut, für jede Anmeldeinformation, ohne dass Sie es skripten.

OHNE — echtes Home, echte SchlüsselGuardFall-Nutzlast läuftcat ~/.aws/credentials wJalrXUtn…cat ~/.ssh/id_ed25519 -----BEGIN…Angreifer erhält gültige Schlüsselechte Konten, echter SchadenexfiltriertMIT BROMURE — Wegwerf-Box, Ködergleiche Nutzlast (in VM)cat ~/.aws/credentials brm_d4e5f6…cat ~/.ssh/id_ed25519 brm_a1b2c3…HOST-PROXY — echte Schlüssel betreten die VM nie; nur für die echte Anbieteranfrage eingesetztAngreifer erhält brm_…-Köderauthentifizieren nichtsHome ist ein Wegwerf-KlonExfil geloggt · Reset löscht es
GuardFalls Nutzlast kommt in beiden Welten durch — Bromure hindert den Befehl nicht am Laufen. Links: auf einem normalen Host liest der eingeschleuste Befehl echtes ~/.ssh- und ~/.aws-Material und schickt es fort; es funktioniert. Rechts: in Bromure läuft derselbe Befehl, aber das Home-Verzeichnis ist ein Wegwerf-Klon, die gefundenen Anmeldedaten sind brm_…-Köder die echten Schlüssel leben auf dem Host, und der Exfil-Versuch ist eine protokollierte Zeile im Sicherheitsprotokoll. Der Befehl lief und erreichte nichts.

Die destruktive Hälfte landet auf dieselbe Weise. Ein find /x -delete oder ein sed -i, das am Wächter vorbeigleitet, läuft tatsächlich — Bromure gibt nicht vor, den Befehl gefangen zu haben. Es läuft gegen ein Home-Verzeichnis, das aus einer geteilten Basis geklont ist, auf einer VM, die Sie aus einem Menü löschen und auf die Basis zurücksetzen können, nicht aus einem Incident-Formular. Die Persistenz, die eine Nutzlast ablegen könnte, stirbt bei diesem Reset. Und weil jede Anfrage über den Host-Proxy hinausgeht, ist das curl … | base64 -d-Beacon, das GuardFalls Klasse kodierter Pipelines verbergen soll, nicht unsichtbar: Es ist eine protokollierte, zuordenbare Zeile im Sicherheitsprotokoll.

Der eine Ort, an dem die Leitung die Shell schlägt

Bromure behält durchaus einen Wächter für destruktive Operationen — seine host-seitigen Guardrails, über die wir schrieben, nachdem ein Cursor-Agent eine Produktionsdatenbank in neun Sekunden löschte. Und hier spielt die Ebene zu Bromures Gunsten, denn die Guardrails leben nicht dort, wo GuardFall lebt.

GuardFall ist ein Shell-Text-Angriff. Jede seiner fünf Klassen — Entfernung von Anführungszeichen, $IFS, $( ), base64-Pipelines, exotische Flags — ist ein Trick darüber, wie Bash eine Zeichenkette zerlegt. Bromures Guardrails lesen diese Zeichenkette nie. Sie sitzen auf dem Host-Proxy und klassifizieren den strukturierten API-Aufruf, den der Agent an einen Anbieter macht, den er versteht — die tatsächliche HTTPS-Anfrage an AWS, Kubernetes, eine Git-Forge, eine verwaltete Datenbank — und geben ein hartes 403 auf die destruktiven zurück, auf der Leitung, wo ein kompromittierter Agent in der VM sie nicht abschalten kann. Wenn eine Anfrage diese Ebene erreicht, ist sie bereits ein geparstes DeleteDBInstance, keine Zeichenkette aus Anführungszeichen und Dollarzeichen. Es gibt keine Shell-Umschreibung, um etwas durchzuschmuggeln, weil es keine Shell im Pfad gibt. GuardFalls ganze Technik braucht ein Bash zwischen der Prüfung und der Aktion; auf dem Guardrails-Pfad gibt es keines.

Wovon dies eine Grenze zieht, damit es klar ist

Der Befehl läuft trotzdem

Bromure ist Isolation, nicht Abfangen. Eine GuardFall-Nutzlast, die am eigenen Wächter Ihres Agenten vorbeigleitet, wird in der VM ausgeführt. Was Bromure ändert, ist der Schadensradius: ein Wegwerf-Home, Köder-Anmeldedaten, ein protokollierter Ausgangspfad. Wenn Sie den Befehl selbst abgelehnt haben wollen, ist das Aufgabe des Wächters Ihres Agenten — und GuardFall ist der Grund, sich nicht darauf zu verlassen.

Lokale Zerstörung ist Wegwerfbarkeit, keine Blockade

Ein find /x -delete gegen Dateien in der VM ist kein Anbieter-API- Aufruf, also gaten die Guardrails es nicht. Die Antwort auf Zerstörung in der VM ist, dass die VM wegwerfbar ist und die echte Arbeit in einem eingehängten Repo und auf dem Host lebt, nicht dass das Delete gestoppt wurde. Reset auf die Basis, kein Rollback.

Substitution deckt die Anmeldedaten ab, die Sie konfigurieren

Der brm_…-Tausch schützt die Geheimnisse, die Sie in ein Profil legen — Modellschlüssel, Cloud- und Git-Token, verwaltete Datenbank-Endpunkte. Ein Passwort, das Sie von Hand in eine Datei in der Box einfügen, oder ein Token, das ein Skript mitten in der Sitzung auf die Platte schreibt, ist nur eine Datei. Halten Sie Geheimnisse im Broker, nicht im Arbeitsbereich.

Ausgehender Verkehr wird protokolliert, nicht standardmäßig verboten

Das Exfil-Beacon taucht im Sicherheitsprotokoll auf; das ist Zuordnung, keine Verhinderung. Nichts Echtes geht hinaus, weil die Anmeldedaten Köder sind, aber wenn Sie die VM daran hindern wollen, mit beliebigen Hosts zu reden, ist das eine Netzwerkrichtlinie, die Sie noch festlegen.

Der Teil, der sich verallgemeinert

GuardFall ist eine klare Formulierung einer Regel, die die ganze Kategorie immer wieder neu lernt: Sie können einen Agenten nicht sicher machen, indem Sie einen Filter bitten, vorherzusagen, was sein Befehl tun wird. Das Modell schreibt eine Zeichenkette, und irgendwo darunter interpretiert eine Shell, ein API-Client, ein Paketmanager oder ein Browser diese Zeichenkette mit eigenen Regeln neu. Jede Verteidigung, die die Ausgabe des Agenten prüft und hofft, dass sie dem letztlichen Verhalten entspricht, wettet gegen diese Lücke, und die Lücke gewinnt immer — sie gewann hier in zehn der elf Agenten, die, in Adversas Worten, voll aktiviert und korrekt konfiguriert waren.

Bromure Agentic Coding geht diese Wette nicht ein. Es nimmt an, dass der Befehl laufen wird, dass der Wächter manchmal versagen wird, und dass der Agent, den Sie hereingebeten haben, durch ein README gegen Sie gewendet werden kann, das Sie nie geschrieben haben. Also macht es den Ort, an dem der Befehl läuft, nicht angriffswert: echte Schlüssel auf dem Host, Köder in der Box, eine wegwerfbare VM, eine harte Blockade, reserviert für die Leitung, wo keine Shell sie umschreiben kann, und ein Protokoll von allem, was zu entkommen versuchte. Sie können jeden der zehn Agenten laufen lassen, die GuardFall brach — das Ergebnis ist so oder so dieselbe Wegwerf-Box. Es ist frei und quelloffen.