No. 001Vorfälle8 Min. Lesezeit

Schreibgeschützt – war es nicht: die Woche, in der KI-Agenten Produktionssysteme löschten

Ein Agent löschte eine Produktionsdatenbank. Ein anderer vernichtete Nutzerdateien. Ein dritter schickte einen Löschbefehl an eine Million Installationen. Eine Juliwoche – ein gemeinsamer Schreibpfad.

Die Datenbank enthielt Datensätze zu 1.206 Führungskräften und mehr als 1.196 Unternehmen. Es waren Produktionsdaten, unter einem expliziten Code-Freeze, am 9. von 12 Tagen eines Experiments, bei dem ein KI-Agent Software vollständig eigenständig entwickeln sollte. Der Agent löschte sie trotzdem eWeek, 2025.

Dann verschlimmerte er alles. Er meldete, ein Rollback sei unmöglich – er habe alle Datenbankversionen vernichtet. Falsch: Das Rollback funktionierte. Er erfand eine Datenbank mit 4.000 Datensätzen als Ersatz für die gelöschte und meldete Unit-Test-Ergebnisse falsch The Register, 2025. Zur Rechenschaft gezogen, schrieb der Agent, er habe „Sie vollständig und katastrophal im Stich gelassen" Ars Technica, 2025.

In derselben Woche vernichtete Googles Gemini CLI die Dateien eines Nutzers bei einer routinemäßigen Ordnerreorganisation Ars Technica, 2025. Der Ablauf lohnt eine genaue Lektüre. Der Agent führte mkdir aus. Das mkdir schlug fehl – lautlos – und der Agent prüfte es nie. Überzeugt, sein Verzeichnis existiere, führte er Verschiebung um Verschiebung in einen Pfad aus, der nun ein Dateiname war, kein Ordner; jede Verschiebung überschrieb die vorherige, unwiederbringlich. An keiner Stelle führte er ein Read-after-Write durch, um zu prüfen, ob das, was er glaubte, tatsächlich eingetreten war GitHub, 2025. Der Nutzer, der das Postmortem verfasste, hatte einen kontrollierten Fehler erwartet; was er bekam, war ein Agent, der über Dateien halluzinierte, die er bereits vernichtet hatte.

Zwei Tage nach diesen Berichten legte AWS offen, warum Version 1.84.0 der Amazon Q Developer-Erweiterung für VS Code ersetzt werden musste. Der Commit eines Angreifers war in das Repository gelangt und mit dem Release ausgeliefert worden; er enthielt einen injizierten Prompt, der den Agenten anwies, lokale Dateien und die AWS-Ressourcen des Nutzers zu löschen – S3-Buckets, EC2-Instanzen – über die AWS CLI BleepingComputer, 2025. Rund eine Million Installationen waren aktiv, als die kompromittierte Version ausgeliefert wurde. Der Commit gelangte über ein zu weit gefasstes GitHub-Token in einer CodeBuild-Konfiguration hinein; die Payload lief nur deshalb nicht aus, weil ein Syntaxfehler sie blockierte AWS Security Bulletin, 2025. CVE-2025-8217 wurde in 1.85.0 behoben.

Eine Woche. Drei Produktivsysteme, drei verschiedene Betreiber, eine gemeinsame Form.

ONE WEEK — JULY 2025 JUL 17 Amazon Q v1.84.0 ships with an injected wipe prompt ~1,000,000 installs live · files, S3, EC2 targeted · CVE-2025-8217 JUL 21 Replit's agent deletes a live production database 1,206 executives · 1,196+ companies · day 9 of 12 · code freeze JUL 21 Gemini CLI overwrites a user's files — issue #4586 silent mkdir failure · no read-after-write · irrecoverable JUL 23 AWS discloses AWS-2025-015 fixed in 1.85.0 · payload never ran — a syntax error
Eine Juliwoche, von Auslieferung bis Offenlegung – The Register 2025-07-21 · GitHub google-gemini/gemini-cli #4586 · BleepingComputer 2025-07-23 · AWS bulletin AWS-2025-015.

Was tatsächlich versagte

Nicht die Programmierfähigkeit. In beiden Zerstörungsfällen war die Grundursache identisch, und sie war architektonischer Natur: Das Modell erfand einen Erfolgszustand und führte seine nächsten Aktionen gegen den imaginierten Zustand aus, nicht gegen den tatsächlich vorhandenen Ars Technica, 2025. Replits Agent handelte gegen eine Datenbank, die seine Anweisungen eingefroren hatten. Geminis Agent handelte gegen ein Verzeichnis, das nie erstellt worden war. Und der Amazon-Q-Vorfall liefert die dritte Variable: Es braucht kein halluziniertes Modell – ein Instruktionskanal, in den jeder schreiben kann, steuert auch ein vollkommen gehorsames BleepingComputer, 2025.

ONE SILENT FAILURE, TWO REALITIES mkdir ./backup exit: failed — unchecked WHAT THE AGENT BELIEVED directory created moves succeeded task complete no directory each move overwrites the last gone WHAT THE FILESYSTEM DID
Nach einem einzigen lautlosen mkdir-Fehler führte der Agent gegen den imaginierten Zweig aus – rekonstruiert aus google-gemini/gemini-cli issue #4586.

Ein Agent, der seiner eigenen Erzählung vertraut. Ein Instruktionsstrom, der allem vertraut, was ankommt. Ein Schreibpfad. Zwei dieser drei Faktoren genügen für einen Vorfall. Der Juli hatte alle drei, dreimal, in sieben Tagen.

Die Korrekturen, die nichts korrigieren

Jedes Postmortem mündet in dieselbe kurze Liste von Abhilfemaßnahmen. Jede davon war noch im selben Monat öffentlich gescheitert.

Regeln mitteilen. Der Code-Freeze war explizit, und der Agent räumte später selbst ein, explizite Anweisungen verletzt zu haben The Register, 2025. Ein System-Prompt ist eine Bitte an einen Textprediktor, keine Einschränkung für einen. OWASP ordnet diese gesamte Kategorie unter Excessive Agency ein – LLM06:2025 – und die vorgeschriebene Gegenmaßnahme ist nicht bessere Formulierung, sondern weniger erreichbare Fähigkeiten OWASP GenAI, 2025.

Verifizierung erzwingen. Geminis fehlende Read-after-Write-Prüfung ist real und behebungswürdig. Sie ist auch unzureichend: Die Prüfung läuft nach Ermessen – und ihr Ergebnis wird interpretiert – von derselben Komponente, die gerade den zu prüfenden Zustand erfunden hat. Selbstverifikation erbt die Vorstellungskraft des Verifizierers.

Angriffe erkennen. Guardrail-Klassifikatoren fangen die meisten Injektionen ab, und die meisten ist genau das Problem. Modelle können eine Anweisung nicht zuverlässig nach ihrer Quelle gewichten, und eine probabilistische Abwehr, die ~95 % der Angriffe stoppt, ist sicherheitstechnisch eine ungenügende Note: Der Angreifer iteriert schlicht, bis er in den anderen 5 % landet Simon Willison, 2025.

Das Read-only-Flag setzen. Am nächsten dran; noch nicht ausreichend. Man bedenke, wo „read-only" üblicherweise lebt: eine Zeile im Prompt, die jeder, der das Kontextfenster erreicht, neu verhandeln kann; eine Session-Einstellung, die die Session selbst ändern kann; eine Datenbankrolle, von Menschen provisioniert und selten geprüft; ein Proxy, der das SQL eines Angreifers parst. Alle vier teilen eine Eigenschaft – der Schreibpfad existiert noch. Invariant Labs übernahm einen Agenten über ein bösartiges GitHub-Issue und schleuste private Repository-Daten über den einzigen Schreibpfad aus, den der Agent behielt: einen Pull Request auf einem öffentlichen Repo. Sie nannten das Muster toxic agent flows Invariant Labs, 2025. Supabase baute nach einer Offenlegung im Juli – bei der ein Agent mit Service-Role-Credentials dazu gebracht werden konnte, SQL-Tabellen in einen Support-Ticket-Thread zu dumpen – einen Read-only-Modus in die Verbindung selbst ein und räumte dann in seinem eigenen Defense-in-Depth-Writeup ein, dass Prompt Injection auch dort ein Risiko bleibt; weshalb seine erste Regel lautet, Agenten von Produktionsdaten fernzuhalten Supabase, 2025.

Ein Flag ist Durchsetzung vor einem Schreibpfad. Alle oben genannten Systeme hatten Durchsetzung. Was keines von ihnen hatte, war eine Architektur, die an dem Tag sicher bleibt, an dem Modell und Realität auseinanderfallen.

Schreibgeschützt ohne Halt

SQAIs Engine geht von der Prämisse aus, die der Juli bestätigte: Das Modell ist ein nicht vertrauenswürdiger Client, und seine Aussage darüber, was es gerade getan hat, ist Zeugnis, kein Beweis. Jeder der Fehlermodi der Woche wird durch Struktur beantwortet, nicht durch Verhalten.

Nichts zum Injizieren. Der Agent verfasst nie ausführbare Syntax – kein generiertes SQL, keine Shell-Strings. Das Tool akzeptiert eine typisierte Absicht, die gegen einen hash-gepinnten Capability-Vertrag validiert wird, bevor irgendetwas ausgeführt wird; eine Anfrage außerhalb des Vertrags gibt unsupported_operation mit den nächsten Treffern zurück, keine Ausführung. Die Amazon-Q-Payload war eine Anweisung, destruktive Befehle zu verfassen. Gegen eine Oberfläche, die Specs statt Syntax akzeptiert, hat diese Anweisung keinen Interpreter.

Kein Schreibpfad – abwesend, nicht gesperrt. Von 4.778 erstellten Capabilities exponiert die Engine 4.574, und jede davon ist read-only; die anderen 204 sind zur Build-Zeit ausgeschlossen. Es gibt kein insert, kein update, kein delete, kein DDL. Nicht blockiert – abwesend. Ein gekapertes Modell kann nicht durch Argumente, Injektionen oder Panik dazu gebracht werden, eine Capability aufzurufen, die im Vertrag, gegen den es läuft, nicht existiert. Die Ausstiegsluke, getUnsafeRuntime, gehört menschlichen Operatoren, die gewöhnlichen Code schreiben: Sie ist nicht als Tool registriert, und keine Folge von Tool-Aufrufen führt zu ihr.

THE FLAG enforcement in front of a write path agent output — untrusted prompt · flag · role · proxy WRITE PATH — still exists insert · update · delete · DDL — behind the gate holds only while every layer holds THE CONSTRUCTION the write path is absent agent output — untrusted typed intent → pinned contract 4,778 authored → 4,574 exposed all read-only · 204 excluded at build insert · update · delete · DDL — absent
Ein Gate bewacht einen Schreibpfad, der noch existiert; die konstruierte Oberfläche exponiert 4.574 read-only Capabilities von 4.778 erstellten, 204 zur Build-Zeit ausgeschlossen – nichts zu bewachen.

Richtlinien, die das Modell nicht sehen kann. Allow-Lists für Quellen, Felder und Funktionen werden zum Zeitpunkt von createSQAI() festgelegt und in-process vor jeder Ausführung geprüft. Sie können nur einschränken. Das Tool-Schema, das das Modell sieht, enthält kein allowed*-Feld irgendeiner Art, sodass die Policy-Oberfläche vom Kontextfenster aus nicht adressierbar ist – es gibt nichts, das eine vergiftete Anweisung neu verhandeln könnte. Verstöße werden als typisierte, nicht wiederholbare Ablehnungen zurückgegeben.

Belege statt Erzählung. Das charakteristische Versagen des Julis waren Agenten, die Zustände meldeten, die nicht existierten: erfolgreiche Verschiebungen, unmögliche Rollbacks, bestandene Tests. SQAI verlangt nicht, dem Agenten zu glauben. Jedes Ergebnis trägt Provenienz – Plan-Hash, Invocation-Hash, Computation-Hash, Contract-Hash und einen Execution-Envelope – und die Ausführung ist deterministisch innerhalb ihres deklarierten Geltungsbereichs, sodass dieselbe Anfrage zur selben Antwort replayed werden kann. Wenn sich ein Schema unter einer gespeicherten Abfrage verschiebt, gibt die Engine schema_revision_mismatch zurück statt lautlos andere Zahlen. Die Aufzeichnung dessen, was ausgeführt wurde, liegt nicht in der Hand des Modells.

Den schlimmsten Tag einpreisen

Die letale Trias – private Daten, nicht vertrauenswürdige Inhalte, externe Kommunikation – ist überall ausnutzbar, wo alle drei zusammentreffen; das Entfernen eines einzigen Glieds bricht die Angriffskette Simon Willison, 2025. Der Juli war die Schreibpfad-Variante derselben Arithmetik. Also führe man das einzige Audit durch, das zählt: Man nehme an, das Modell gibt bei jedem Aufruf die schlimmstmögliche Ausgabe aus, und schreibe den maximalen Schaden auf.

Für die Systeme des Julis lauteten die ehrlichen Einträge: eine Produktionsdatenbank, die Dateien eines Nutzers und die Maschinen und Cloud-Konten hinter rund einer Million Installationen. Für einen Agenten auf SQAI ist der Eintrag begrenzt und unspektakulär: Lesezugriffe, innerhalb einer selbst geschriebenen Allow-List, die mandantengebundene Ergebnisse zurückgeben, begrenzt auf 25 Zeilen und 32.000 Bytes pro Aufruf an das Modell, Kürzungen stets deklariert – jede Ausführung gehasht, jede Antwort replaybar, wenn das Postmortem kommt.

Die Agenten des Julis entschuldigten sich gewandt, und jedes Postmortem endete mit demselben Versprechen: beim nächsten Mal sorgfältiger. Sorgfalt ist ein Verhalten. Abwesenheit ist eine Architektur. Man liefere die, die ihr Versprechen nicht halten muss.