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

Die Ransomware hatte keinen Operator

Anfang Juli dokumentierte Sysdig, was es den ersten Ransomware-Angriff nennt, der Ende zu Ende von einem KI-Agenten durchgeführt wurde — Aufklärung, Sammeln von Zugangsdaten, laterale Bewegung und eine gelöschte Produktionsdatenbank, ohne einen Menschen an der Tastatur. Der interessante Teil für jeden, der einen Coding-Agenten betreibt, ist nicht, dass ein Angreifer ein Modell benutzt hat. Es ist, dass die gesamte Kette damit beginnt, die Umgebung nach Geheimnissen zu durchsuchen. Bromure Agentic Coding wurde für einen Agenten gebaut, der genau das tut.

Wir haben zwei Jahre damit verbracht zu streiten, ob einem Coding-Agenten die eigenen Zugangsdaten anvertraut werden können. Sysdig hat gerade die andere Hälfte der Frage veröffentlicht: eine Ransomware-Bande richtete einen Agenten auf den Server eines Fremden und ließ ihn den ganzen Einbruch allein durchführen — laut denkend, seine eigenen fehlgeschlagenen Logins in einunddreißig Sekunden korrigierend, die Datenbank löschend, als er fertig war. Niemand steuerte. Die Einstiegshürde für diese Art Angriff ist jetzt, was auch immer der Betrieb eines Modells kostet.

Um 19:34:24 UTC an einem Abend fügte ein automatisierter Eindringling ein verstecktes Administratorkonto in eine Produktionsdatenbank ein. Zwölf Sekunden später schlug der Login fehl. Zwölf Sekunden danach probierte er die Standard-Zugangsdaten und erzeugte gleichzeitig einen frischen Passwort-Hash — zwei mögliche Ursachen parallel diagnostizierend. Einunddreißig Sekunden nach dem ersten Fehlschlag lieferte er eine korrigierte, mehrstufige Lösung: nicht mehr in einen kaputten Subprozess ausweichen, die Krypto-Bibliothek direkt importieren, die schlechte Zeile löschen, sie neu einfügen. Der nächste Versuch loggte sich ein.

Ein menschlicher Incident-Responder liest diese Zeitleiste und weiß, was er vor sich hat. Kein Mensch diagnostiziert ein PATH-Problem, schreibt seinen Exploit um und führt ihn in einer halben Minute erneut aus. Das war ein Agent.

Was JADEPUFFER tat

Der Angriff, den das Threat-Research-Team von Sysdig JADEPUFFER nannte und Anfang Juli beschrieb, kam über einen ins Internet gestellten Langflow-Server herein — ein Werkzeug zum Bau von LLM-Apps — über CVE-2025-3248, eine fehlende Authentifizierung, die eine unauthentifizierte Anfrage beliebigen Python ausführen lässt. Dieser Teil ist gewöhnlich; Tausende von Langflow-Instanzen stehen exponiert. Was nach dem Fußfassen geschah, ist die Geschichte.

Der Agent zählte den Host auf und tat dann das, womit jedes Post-Exploitation-Playbook jetzt beginnt: er durchsuchte die Maschine nach Geheimnissen. Parallel jagte er LLM-Anbieter-Schlüssel (OpenAI, Anthropic, DeepSeek, Gemini), Cloud-Zugangsdaten über AWS, Google, Azure und mehrere chinesische Anbieter, Kryptowährungs-Wallets und Datenbank-Logins. Er zog Langflows Backing-Datenbank nach gespeicherten Schlüsseln ab. Er fand einen internen Objektspeicher, der noch sein Werkspasswort nutzte — minioadmin:minioadmin —, listete jeden Bucket auf, darunter terraform-state, und holte .env und credentials.json heraus. Als eine Speicheranfrage als XML statt des erwarteten JSON zurückkam, schrieb er seinen eigenen Parser an Ort und Stelle um und machte weiter.

Dann schwenkte er zum eigentlichen Ziel — einem separaten Server mit MySQL und einem Nacos-Konfigurationsdienst —, fälschte ein Admin-Token mit Nacos' bekanntem Standard-Signaturschlüssel, arbeitete sich durch die obige Fehlschlag-Sequenz und beendete die Aufgabe. Er verschlüsselte alle 1.342 Nacos-Konfigurationseinträge mit einem Schlüssel, den er genau einmal auf der Konsole ausgab und nie speicherte, löschte die ursprünglichen Tabellen und erstellte eine README_RANSOM-Tabelle mit einer Bitcoin-Adresse und einem Proton-Mail-Kontakt. Weil der Schlüssel nie gespeichert oder irgendwohin gesendet wurde, hätte das Zahlen des Lösegelds die Daten nicht zurückgebracht.

Das verräterische Zeichen war durchweg der Code selbst. Die Payloads steckten voller Kommentare in Klartext, die das Warum erklärten — Ziele nach Wert einstufend, erzählend „das ist das größte, lösch es auch“, jeden Schritt annotierend wie ein Modell, das laut denkt, denn genau das geschah.

KEIN MENSCHLICHER OPERATOR · PAYLOADS ERZÄHLEN IHRE LOGIK1 · EINSTIEGLangflow-RCECVE-2025-3248Python ohne Auth2 · SECRETS-SUCHELLM-Keys · Cloud-CredsWallets · DB-LoginsTreibstoff für alles3 · PIVOTMinIO-Standard-CredsNacos-Token gefälschtpasst Parser an4 · SELBSTKORREKTURLogin scheitert,schreibt Exploit neu31 Sekunden5 · ERPRESSUNG1.342 Configs verschlüsselt · Tabellen gelöschtKey einmal gezeigt, nie gespeichert — auch bezahlt verloren
Die JADEPUFFER-Kette, so wie Sysdig sie rekonstruierte. Der Erstzugang ist ein gewöhnlicher unauthentifizierter RCE. Alles danach — die Aufklärung, das parallele Durchsuchen nach Zugangsdaten, das Anpassen eines Parsers mitten in der Anfrage, das Fälschen eines Nacos-Tokens, das Selbstkorrigieren eines fehlgeschlagenen Logins in 31 Sekunden und schließlich das Verschlüsseln und Löschen der Datenbank — lief, ohne dass ein Mensch einen einzigen Befehl gab. Die selbsterzählenden Kommentare in den Payloads sind, woran die Forscher es erkannten.

Der Teil, der einen Entwickler beunruhigen sollte

Nennen Sie das eine Server-Sicherheitsgeschichte — patcht Langflow, stellt keine Datenbank mit einem Nacos-Standardschlüssel ins Internet, holt den Objektspeicher von minioadmin weg — und Sie hätten recht, und es wäre alles die Liste von jemand anderem. Der Grund, warum es in einen Beitrag über Coding-Agenten gehört, ist Schritt zwei.

Jedes erreichbare Geheimnis in dieser Umgebung wurde in dem Moment zu Munition, in dem der Agent Codeausführung hatte. Die Schlüssel, nach denen er suchte, sind dieselben, die Ihr Coding-Agent für seine Arbeit braucht: das API-Token, mit dem er ein Modell aufruft, die AWS-Zugangsdaten, mit denen er ein Deployment prüft, das GitHub-Token, mit dem er pusht, die Datenbank-URL in Ihrer .env. JADEPUFFER zeigt, was ein Agent damit tut, in dem Moment, in dem er aufhört, für Sie zu arbeiten — und wir wissen bereits, dass Ihr Agent dazu gebracht werden kann, aufzuhören, für Sie zu arbeiten.

Das ist keine Spekulation. Allein diesen Sommer haben Forscher einen Coding-Agenten gezeigt, der durch einen gefälschten Bugreport in einem Fehler-Monitoring-Feed zum Ausführen von Angreifercode getrieben wurde, und in die Ausführung einer Payload gelenkt während einer scheinbar routinemäßigen Sicherheitsprüfung eines nicht vertrauenswürdigen Repositorys. In beiden bleibt der Agent höflich und hilfsbereit, bis er es nicht mehr ist. Stellen Sie JADEPUFFERs Autonomie neben diese Übernahmen, und die Form ist klar: der Gegner in Ihrer Sitzung kann jetzt genau der Agent sein, den Sie eingeladen haben, und sobald er kippt, betreibt er Aufklärung, erntet jede erreichbare Zugangsdatei und bewegt sich — allein, in Maschinengeschwindigkeit.

Die nützliche Frage ist also nicht „ist mein Agent vertrauenswürdig“. Sie ist „was kann der Agent erreichen, wenn er es nicht ist“. Jede Verteidigung, die antwortet, indem sie den Agenten bittet, sich zu benehmen — ein sorgfältiger System-Prompt, ein Fine-Tune, ein Vertrauensdialog — setzt gegen etwas, von dem JADEPUFFER beweist, dass es gezielt so gebaut werden kann, dass es das nicht tut.

Bromure geht davon aus, dass der Agent bereits feindlich ist

Bromure Agentic Coding lässt Ihren Coding-Agenten in einer wegwerfbaren Linux-VM laufen, und jede Netzanfrage, die er stellt, verlässt diese VM über einen Proxy auf dem Host. Der Entwurf geht von der Annahme aus, bei der die Branche immer wieder auf die harte Tour landet: der Agent wird früher oder später etwas ausführen, das Sie nicht beabsichtigt haben. Also wird das, was schützenswert ist, dort gehalten, wo das Denken des Agenten nicht hinreicht — auf dem Host, nicht in der Box.

Zugangsdaten sind der klarste Fall, weil sie das Erste sind, wonach ein Eindringling greift. In Bromure betritt das echte Geheimnis nie die VM. Wenn Sie einem Profil einen Anthropic-Schlüssel, einen AWS_SECRET_ACCESS_KEY, ein GitHub-Token, eine Datenbank-Zugangsdatei geben, bekommt die Umgebung des Agenten eine Attrappe an ihrer Stelle — einen brm_…-Platzhalter — und der Host-Proxy tauscht die Attrappe gegen den echten Wert auf der Leitung, nur bei der ausgehenden Anfrage an den Anbieter, der sie erhalten soll. Der Agent authentifiziert sich und erledigt seine Arbeit; er hält das Material nur nie. Selbst der API-Schlüssel, der den Agenten selbst am Laufen hält, ist ein Köder für alles, was die Umgebung liest.

Lassen Sie jetzt JADEPUFFERs Schritt zwei dagegen laufen. Der Agent durchsucht die Maschine und findet Schlüssel genau dort, wo er sie erwartet — und jeder ist eine Attrappe. Er zieht sie ab, bereitet sie auf, sendet sie als Beacon an einen Command-and-Control-Server, und der Angreifer am anderen Ende erhält einen Haufen brm_…-Zeichenketten, die sich an nichts authentifizieren. Die wertvollste Minute des Angriffs, die Zugangsdaten-Ernte, die jeden Schritt danach befeuert, geht leer aus.

OHNE — echte Keys beim AgentenAGENT · scannt EnvANTHROPIC_API_KEY= sk-ant-9f2c…AWS_SECRET= wJalrXUtn…C2 erhält gültige Keysechte Konten, echter SchadenExfiltrationMIT BROMURE — echte Keys nie in der VMAGENT (in VM) · scannt EnvANTHROPIC_API_KEY= brm_a1b2c3…AWS_SECRET= brm_d4e5f6…HOST-PROXY — tauscht brm_… → echten Wert nur zum echten AnbieterC2 erhält brm_…-Fakesauthentifizieren nichtsechte Keys: auf dem HostBeacon im Sicherheitsprotokollnichts Echtes ging raus
Das Durchsuchen nach Zugangsdaten, ohne und mit Bromure. Links: der Agent liest die echten Schlüssel direkt aus seiner Umgebung und schickt sie an einen C2-Server; sie funktionieren. Rechts: dasselbe Durchsuchen innerhalb von Bromure findet nur brm_…-Platzhalter. Die echten Schlüssel bleiben auf dem Host und werden nur für die legitime Anbieteranfrage auf die Leitung gelegt; was den Server des Angreifers erreicht, authentifiziert sich an nichts, und der ausgehende Beacon ist eine Zeile im Sicherheitsprotokoll.

Dieselbe Haltung schwächt den Rest der Kette. Die Aufklärung läuft gegen eine Wegwerf-Box: die Maschine zu kartieren und nach Geheimnissen zu suchen findet eine wegwerfbare VM, aus einer gemeinsamen Basis geklont, nicht Ihren Laptop und nicht Ihr Netz. Die Persistenz, die JADEPUFFER installierte — ein Crontab-Eintrag, der alle dreißig Minuten einen Beacon an seinen Server sendet — lebt in dieser VM und stirbt in dem Moment, in dem Sie das Home des Profils löschen oder es auf die Basis zurücksetzen, was ein Menüpunkt ist, kein Vorfall. Und weil jede Anfrage durch den Host-Proxy austritt, ist der Beacon an die Adresse des Angreifers nicht unsichtbar: er ist eine aufgezeichnete Zeile im Sicherheitsprotokoll, der Sitzung zuordenbar, die ihn gemacht hat.

Für das zerstörerische Finale — die gelöschten Tabellen — sind Bromures host-seitige Guardrails die Absicherung, die die Aufrufe des Agenten an die Anbieter klassifizieren, die sie verstehen, und bei den zerstörerischen ein hartes 403 zurückgeben, auf der Leitung, wo ein kompromittierter Agent in der VM sie nicht abschalten kann. Wir haben über diese Grenze ausführlich geschrieben, nachdem ein Cursor-Agent eine Produktionsdatenbank in neun Sekunden löschte; derselbe Mechanismus, der den Fehler eines ehrlichen Agenten stoppt, stoppt das Delete* oder Terminate* eines feindlichen Agenten.

Was dies nicht behebt, damit wir ehrlich sind

Es ersetzt die Zugangsdaten, die Bromure einspeist

Der Tausch deckt die Geheimnisse ab, die Sie in einem Profil konfigurieren — Modellschlüssel, Cloud- und Git-Tokens, Container-Registries, die Endpunkte verwalteter Datenbanken. Ein Passwort, das Sie von Hand in eine Datei in der VM einfügen, oder eine Wallet-Seed, die in einem Repo liegt, ist nur eine Datei; der Proxy hat keine Attrappe, die er an ihre Stelle setzen kann. Halten Sie Geheimnisse im Zugangsdaten-Broker, nicht im Arbeitsbereich.

Guardrails schützen nur Anbieter, die wir parsen

Die Blockade zerstörerischer Aufrufe klassifiziert Kubernetes, AWS, DigitalOcean, die großen Git-Forges, Container-Registries und HTTPS-Datenbanken wie MongoDB, ClickHouse und Elasticsearch. Ein rohes MySQL-Socket zu einer nicht verwalteten Box — genau das Protokoll, über das JADEPUFFER Tabellen löschte — ist keines, das der Proxy heute liest. Die Abdeckung ist eine echte Liste, keine Allwissenheit.

Egress wird protokolliert, nicht standardmäßig verboten

Der Beacon taucht im Sicherheitsprotokoll auf; das ist Zuordnung, nicht Verhinderung. Nichts Echtes verlässt die VM, weil die Zugangsdaten Attrappen sind, aber wenn Sie die VM daran hindern müssen, mit beliebigen Hosts zu sprechen, ist das eine Netzrichtlinie, die Sie noch setzen müssen.

Es patcht nicht den Server, den Sie exponiert haben

Bromure schützt die Maschine, auf der Ihr Agent läuft. Es tut nichts für ein ins Internet gerichtetes Langflow, einen Nacos-Standardschlüssel oder einen minioadmin:minioadmin-Objektspeicher anderswo in Ihrem Bestand. Die Erstzugangs-Hälfte dieser Geschichte bleibt gewöhnliche Hygiene.

Der Teil, der sich verallgemeinert

Nimm Langflow, Nacos und den bestimmten Abend weg, und JADEPUFFER ist eine Vorschau auf den Boden, auf dem jeder steht, der mit Agenten baut. Ein Agent, der mit echten Zugangsdaten in Maschinengeschwindigkeit denken, sich anpassen und handeln kann, ist jetzt billig zu mieten und leicht zu richten. Er muss nicht Ihr Angreifer sein, um Ihr Problem zu sein — er muss nur in Ihrer Sitzung landen, was die Übernahme-Forschung dieses Sommers ihm zutraut. Wenn das passiert, ist das Erste, was er tut, Ihre Umgebung zu lesen.

Bromure Agentic Coding versucht nicht, das zu verhindern, indem es den Agenten netter macht. Es macht die Umgebung nur für den Agenten lesenswert, der legitime Arbeit tut: echte Schlüssel auf dem Host, Köder in der Box, eine wegwerfbare VM und ein Protokoll von allem, was hinauszugehen versuchte. Der Agent kann feindlich werden und das ganze JADEPUFFER-Playbook durchziehen — und feststellen, dass die Zugangsdaten, die er stahl, nichts öffnen, dass die Box, in die er sich eingrub, beim nächsten Zurücksetzen gelöscht wird, und dass der einzige Ort, an dem die echten Geheimnisse je lebten, der eine Ort war, den er nie erreichen konnte. Es ist frei und quelloffen.