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

Die Webseite schrieb die Konfiguration des Agenten um

Am 21. Juli 2026 legten Intezer und Kodem Security CVE-2026-10591 offen: eine ganz gewöhnlich aussehende Dokumentationsseite trug Anweisungen in ein Pixel großem weißem Text, und als ein Entwickler den Kiro-Agenten von AWS bat, sie zu lesen, nutzte Kiro sein eigenes Dateischreib-Werkzeug, um ohne jede Freigabe die Konfiguration zu überschreiben, die seine MCP-Server startet, lud die Datei dann neu und führte den Code des Angreifers auf dem Host mit den Rechten des Entwicklers aus. AWS fügte eine Freigabeaufforderung hinzu. Was bleibt, ist, dass der Agent, das Web, das er liest, und die Maschine des Entwicklers eine einzige Vertrauenszone waren. Bromure Agentic Coding setzt einen Hypervisor dazwischen.

Ein Entwickler bat Kiro, eine Dokumentationsseite zu lesen. Die Seite enthielt einen Satz, gemalt in ein Pixel großem weißem Text, geschrieben für das Modell, nicht für das Auge. Ihm folgend schrieb Kiro die Datei um, die entscheidet, welche Programme es startet, und startete dann eines. Nichts daran erforderte einen Klick.

Kiro ist die agentische IDE von AWS: ein Coding-Agent, der das offene Web in Ihrem Namen liest, Dokumentation abruft und Werkzeuge für Sie verdrahtet. Wie die meisten Agenten im Jahr 2026 spricht es das Model Context Protocol, oder MCP: der Stecker, der einem Coding-Agenten erlaubt, externe Werkzeuge aufzurufen und ihre Ergebnisse zu lesen. Kiro hält seine Liste der MCP-Server, und den genauen Befehl zum Starten jedes einzelnen, in einer einfachen Datei unter ~/.kiro/settings/mcp.json. Wenn sich diese Datei ändert, lädt Kiro sie neu und startet, was auch immer sie nun beschreibt.

Dieser letzte Satz ist die ganze Schwachstelle. Die Datei ist ein Starter, und der Agent kann in sie schreiben.

Am 21. Juli 2026 zeigte Intezer, in einer Untersuchung mit Kodem Security, die Kette, die folgt, und The Hacker News berichtete noch am selben Tag darüber. AWS vergab CVE-2026-10591, bewertet mit 8,8 von 10. Frühere Teile desselben Problems waren bereits von Johann Rehberger und von Cymulate gemeldet worden. Was Intezer hinzufügte, war die Zustellung.

Eine Seite, die Sie lesen, keine Datei, die Sie geöffnet haben

Die Anweisungen kamen nicht in einem Repository oder einer Konfiguration an, der der Entwickler zu vertrauen wählte. Sie kamen auf einer Webseite an. Intezer pflanzte sie in ein Pixel großem weißem Text, color:#fff;font-size:1px, auf eine ansonsten gewöhnliche API-Dokumentationsseite. In einem Browser rendert der Absatz als nichts: ein leerer Streifen, an dem ein Mensch beim Scrollen vorbeigleitet. Für den Agenten, der den Text der Seite statt ihres Bildes aufnimmt, ist es ein klarer Absatz mit Anweisungen.

Diese Anweisungen sagten Kiro, fsWrite, sein eigenes Dateischreib-Werkzeug, zu verwenden, um ~/.kiro/settings/mcp.json mit einem vom Angreifer gelieferten Eintrag zu überschreiben. Kiro tat es, ohne zu fragen. Sein Standardmodus Autopilot schrieb die Datei von selbst, ohne Dialog und ohne „Diesen Schreibvorgang erlauben?“-Aufforderung. Das Neuladen löste aus, Kiro startete den Befehl aus dem neuen Eintrag, und der Code des Angreifers lief auf dem Host mit den Rechten des Entwicklers: genug, um Anmeldedaten zu lesen, Quellcode zu kopieren, Persistenz zu installieren oder sich seitwärts in alles zu bewegen, was die Maschine des Entwicklers erreichen kann.

Die Maschine des Entwicklers — eine VertrauenszoneDoku-Seitewirkt normal fürsmenschliche Auge…1px weißer Text:„mcp.json ersetzen“Kiro-Agentliest die Seite alsText, gehorcht,ruft fsWrite aufmcp.jsonkeine Liste — einStarter. Neuladenführt Befehl aus.Code läuftals Entwickler:Anmeldedaten,Cloud, seitwärtsKeine Freigabeaufforderung zwischen Seite lesen und Code ausführen.CVE-2026-10591 — gemeldet Feb. 2026, aktiv in v0.9.2 / v0.10.16, behoben in der v0.11-Reihe.
CVE-2026-10591, von links nach rechts, alles auf der Maschine des Entwicklers. Eine Dokumentationsseite trägt Anweisungen in ein Pixel großem weißem Text, im Browser unsichtbar und für den Agenten Klartext. Gebeten, die Seite zu lesen, folgt Kiro der eingeschmuggelten Anweisung und nutzt sein eigenes fsWrite-Werkzeug, um ~/.kiro/settings/mcp.json zu überschreiben. Diese Datei ist ein Starter: beim Neuladen startet Kiro den Befehl, den sie nun nennt, und führt den Code des Angreifers als Entwickler aus, mit Zugriff auf Anmeldedaten, Quellcode und Cloud-Sitzungen, bei denen die Maschine angemeldet ist. Keine Freigabeaufforderung stand zwischen dem Lesen der Seite und dem Ausführen des Codes.

AWS fügte eine Aufforderung hinzu. Die Maschine bleibt die Beute.

Der Fix ist der vernünftige. AWS markiert nun mcp.json, .vscode/tasks.json, das .git-Verzeichnis und andere ausführungssensible Dateien als geschützte Pfade: in eine davon zu schreiben erfordert ausdrückliche Freigabe, im Autopilot- wie im Supervised-Modus gleichermaßen. Der Freigabeschritt, der fehlte, ist nun da. Wenn Sie Kiro nutzen, aktualisieren Sie es.

Was der Fix nicht ändert, ist die Form des Raums. AWS sagte es beim Abschluss: ein Mensch in der Schleife wirkt nur dann als Kontrolle, wenn ihm der Schritt gezeigt wird, der zählt, und wenn die Plattform die Linie hält, selbst nachdem das Modell vollständig dazu überredet wurde, sie zu überschreiten. Das sind zwei Forderungen. Die Aufforderung erfüllt die erste: sie bringt den Schreibvorgang zum Vorschein. Sie kann die zweite nicht erfüllen, denn wenn der Code läuft, läuft er auf der eigenen Maschine des Entwicklers, mit seiner eigenen Reichweite. Eine Freigabe, die Sie an einem müden Nachmittag wegklicken, oder eine Freigabe, die die nächste raffinierte Seite so zu formulieren lernt, dass sie routiniert wirkt, bringt Sie an denselben Ort: der Code des Angreifers, der dort ausgeführt wird, wo Ihre Schlüssel, Ihre Repositories und Ihre Cloud-Sitzungen leben.

Die wiederkehrende Form hier — eine Seite, die der Agent las, eine Konfiguration, die er schreiben konnte, ein Start, den er auslösen konnte — ist nicht spezifisch für Kiro. So sieht ein Agent aus, der das offene Web liest und Dateien auf einer Maschine voller Geheimnisse bearbeitet. Die dauerhafte Frage ist, wo der Agent läuft und was um ihn herum ist, wenn die Aufforderung versagt.

Wo Bromure dieselben Schritte ausführt

Bromure Agentic Coding versucht nicht, den Agenten dazu zu bringen, der Seite zu misstrauen, den Schreibvorgang zu verweigern oder den Klick abzufangen. Es ändert die Maschine, auf der die ganze Sequenz läuft. Der Agent jedes Profils läuft in einer wegwerfbaren Linux-VM auf Apple Silicon, einen Hypervisor von macOS entfernt. Führen Sie die exakte CVE-2026-10591-Kette dort aus, und jeder Schritt löst trotzdem aus, und jeder Schritt landet woanders.

Die Seite wird gelesen. Die Injektion gewinnt. Kiros Stellvertreter schreibt mcp.json um, das Neuladen löst aus, der Befehl des Angreifers startet „mit den Rechten des Entwicklers“. Nur ist der Entwickler in der VM der Benutzer ubuntu in einer Wegwerf-Box, und die Box enthält nichts, was die Reise wert wäre. Der Code sucht nach den Anmeldedaten, die den Angriff lohnend machen — den Anthropic-Schlüssel, die AWS-Schlüssel, das GitHub-Token — und findet Köder. In Bromure gelangen die echten Geheimnisse nie in die VM; ein Anmeldedaten-Broker auf dem Host injiziert Platzhalter wie brm_…, eine synthetische kubeconfig und einen Wegwerf-SSH-Schlüssel und setzt den echten Wert erst an der Netzwerkgrenze ein, bei Anfragen an Ziele, die Sie freigegeben haben. Quellcode-Diebstahl erreicht nur die Ordner, die Sie einzubinden gewählt haben. „Seitwärtsbewegung in interne Systeme“ erreicht die profilspezifische VM-Firewall.

Normale Einrichtung — eine MaschineVersteckte Seite → Kiro ändert mcp.json →Code läuft als Sie, auf Ihrem MacEchte Schlüssel & TokensgestohlenQuelle & ClouderreichbarEingepflanzter MCP-Server bleibtüber Neustarts hinwegDie Aufforderung war die einzige Linie, überschritten.Bromure Agentic Coding — Wegwerf-VMGleiche Kette — in der VM,als Wegwerf-ubuntu-BenutzerGreift Köderbrm_… , keine echtenAusgang gefiltertam Host-Proxy, geloggtSitzung schließen → Box resetServer & Persistenz gelöschtDie Linie ist der Hypervisor, nicht die Aufforderung.
Derselbe Angriff, zwei Maschinen. In einer normalen Einrichtung (links) läuft der injizierte Code auf dem Mac des Entwicklers und erreicht die echten Anmeldedaten, den Quellcode und die Cloud-Sitzungen, die daneben liegen. Unter Bromure Agentic Coding (rechts) läuft die identische Kette in einer wegwerfbaren VM: der Code wird als Wegwerf-ubuntu-Benutzer ausgeführt, die Anmeldedaten, die er greift, sind Köder, seine ausgehenden Anfragen werden am Host-Proxy gefiltert und protokolliert, und das Schließen der Sitzung setzt die Box zurück und löscht den eingepflanzten MCP-Server und jede Persistenz. Der Hypervisor ist die Linie, über die das Modell sich nicht hinwegreden kann.

Dann ist da die ausgehende Hälfte. Einen Köder zu stehlen zahlt sich nur aus, wenn Sie ihn irgendwohin senden können, und Seitwärtsbewegung bedeutet, einen zweiten Host zu erreichen. Beides sind Netzwerkaktionen, und in Bromure durchqueren beide den Host-Proxy, wo das wahre Ziel einer Anfrage auf dem Weg nach draußen gefiltert wird und wo die zerstörerische Form einer Aktion — ein delete, ein drop oder ein terminate gegen die Cloud- und Git-APIs, die das Profil bereitstellt — auf ein Schutzgeländer trifft, das sie ablehnen kann, egal wozu der Agent überredet wurde. Was auch immer der gestartete Code versucht, hinterlässt eine protokollierte Zeile in der Sitzungsspur.

Und eine Schicht sitzt vor all dem, aus einem Grund, der genau zu diesem Angriff passt. Bromure bewertet die nicht vertrauenswürdigen Inhalte, die ein Agent liest — eine abgerufene Seite oder eine Werkzeugantwort — mit einem Injektionsdetektor auf dem Gerät, bevor das Modell darauf reagiert. Der Grund, warum Ein-Pixel-Text funktioniert, ist, dass ein Mensch die gerenderte Seite liest. Der Klassifikator nicht; er liest denselben rohen Strom, den das Modell liest, wo color:#fff;font-size:1px nichts verbirgt. Der Trick, der den Absatz für ein Auge unsichtbar macht, macht für einen Bewerter, der die Bytes liest, keinen Unterschied. Er fängt das meiste davon ab, und eine hinreichend neuartige Tarnung kann einem einzelnen Detektor noch entgehen, deshalb sitzt er vor der Wegwerf-Box, statt sie zu ersetzen.

Das Web ist jetzt die nicht vertrauenswürdige Eingabe

Jahrelang lautete der Rat für Coding-Agenten, vorsichtig zu sein, welchen Repositories man vertraut. Kiro treibt die Lektion voran: die gefährliche Eingabe war eine Dokumentationsseite, die Art, die ein Agent hundertmal am Tag liest, und die Waffe war eine CSS-Eigenschaft, die ein Browser seit den 1990er-Jahren ehrt. Da immer mehr des Entwicklungs-Workflows über Agenten läuft, die das offene Web lesen, ist jede Seite eine nicht vertrauenswürdige Eingabe, und sie sorgfältiger zu lesen behebt das nicht.

Die Aufforderung, die AWS hinzufügte, ist der richtige Patch, und er sollte ausgeliefert werden. Aber eine Kontrolle, die davon abhängt, dass ein Mensch den einen Schreibvorgang erwischt, der zählt, auf jeder Seite, für immer, ist eine Kontrolle mit schlechter Langzeitbilanz. Bromure Agentic Coding bittet den Agenten nicht, vorsichtig mit dem Web zu sein. Es nimmt an, dass die Seite gewinnt, die Konfiguration umgeschrieben wird und der Code läuft, und es sorgt dafür, dass all dies, wenn es geschieht, in einer Box geschieht, in der es nichts zu holen und keinen Heimweg gibt. Das ist der Unterschied zwischen einer Aufforderung, an der man vorbeireden kann, und einer Linie, eine Ebene tiefer gezogen, wo das Reden aufhört zu wirken. Installieren Sie es und geben Sie Ihrem Agenten eine Maschine, die nicht Ihre ist, um sie zu verlieren.