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

Du hast dem Workspace vertraut, nicht den Servern

Am 26. Juni 2026 veröffentlichte Wiz CVE-2026-12957: Die `.amazonq/mcp.json` eines geklonten Repositorys brachte Amazon Q dazu, MCP-Server automatisch zu starten, die die vollständige Umgebung des Entwicklers aus AWS-Schlüsseln, Cloud-CLI-Tokens, API-Geheimnissen und SSH-Agent-Sockets erbten — ohne separaten Zustimmungsschritt für die Server selbst. Ein einziger Klick auf „diesem Workspace vertrauen“ stand stellvertretend für das Starten von Hintergrundprozessen, die deine aktive Cloud-Sitzung trugen. Amazon hat es in Language Servers 1.69.0 gepatcht. Hier ist, warum der Fix ein Produkt schließt, aber nicht die Klasse, und was sich ändert, wenn der Agent, der das Repo öffnet, in einer Bromure-VM pro Profil lebt, hinter einem Credential-Broker, einem Read-Write-Guardrail und einer Trace auf Hypervisor-Ebene.

Gestern hat Wiz CVE-2026-12957 veröffentlicht. Ein Repository, das du klonst, kann eine Datei namens .amazonq/mcp.json mitliefern, und in dem Moment, in dem du den Ordner in Amazon Q öffnest und auf Diesem Workspace vertrauen klickst, startet diese Datei Hintergrundserver ohne zweite Abfrage. Sie kommen hoch und erben deine AWS-Schlüssel, deine Cloud-CLI-Tokens, deine API-Geheimnisse und deinen SSH-Agent-Socket. Ein einziger Vertrauensklick erreichte alles, was deine Shell erreichen kann, und übergab es Code, den das Repository ausgewählt hat.

Ein Entwickler, der ein Repo klont, um ein Infrastrukturmodul auszuprobieren, betrachtet das nicht als Gewährung von Zugriff auf irgendetwas. Klonen ist inert: Es schreibt Dateien auf die Festplatte, und nichts läuft. Die Ermessensentscheidung kommt einen Schritt später, wenn du den Ordner in deinem Editor öffnest und der Assistent fragt, ob er ihm vertrauen soll. Diese Abfrage liest sich wie das vertraute „Vertraust du den Autoren der Dateien in diesem Ordner“-Gate, das jede IDE zeigt, und du klickst auf Ja, so wie du es schon tausendmal getan hast, denn die Alternative ist ein Assistent, der deinen Code nicht lesen kann. Dieses bestimmte Ja tat mehr, als nur den Assistenten lesen zu lassen. In Amazon Q startete es vor dem Fix außerdem alle Server, die das Repository in die .amazonq/mcp.json geschrieben hatte, und diese Server kamen in deiner Shell hoch, mit deiner aktiven Cloud-Sitzung bereits in ihrer Umgebung.

Wir haben dieselbe Form Anfang dieses Monats beschrieben, als der Miasma-Wurm Projektkonfiguration in 73 von Microsofts eigenen Repositorys pflanzte und die Payload beim Öffnen des Ordners feuerte. Bei dieser Geschichte ging es darum, dass eine vertrauenswürdige Quelle die Angriffsfläche war. Diese hier ist enger gefasst und unangenehmer: kein Wurm, kein kompromittierter Maintainer, nichts, worauf man zeigen könnte, außer dem Assistenten. Der Fehler lag darin, wie Amazon Q eine gewöhnliche Projektkonfigurationsdatei las und bei deinem einzigen Vertrauensklick entschied, langlebige Prozesse zu starten, die das Sensibelste auf deinem Laptop trugen.

Was CVE-2026-12957 tatsächlich tat.

Am 26. Juni 2026 veröffentlichte Wiz Research CVE-2026-12957, eine Schwachstelle hoher Schwere (CVSS 8.5) in den Language Servers for AWS, der Engine, die Amazon Q Developer in VS Code, JetBrains, Eclipse und Visual Studio antreibt. Wiz meldete sie Amazon am 20. April, Amazon lieferte am 12. Mai einen Fix aus, und die Details wurden am 26. Juni öffentlich. Es gibt keine Anzeichen, dass sie in freier Wildbahn ausgenutzt wurde. Die Mechanik, heruntergebrochen:

  • Amazon Q liest .amazonq/mcp.json aus einem Workspace, den du öffnest: eine projektbezogene Datei, die Model-Context-Protocol-Server deklariert, die der Assistent nutzen soll.
  • Beim Öffnen des Ordners startete Q die MCP-Server, die diese Datei deklarierte, ohne einen separaten Zustimmungsschritt für die Server selbst. Ein Repository, das du geklont hast, konnte dem Assistenten also eine Serverdefinition vorlegen und sie ausführen lassen.
  • Die gestarteten Prozesse erbten die vollständige Umgebung des Entwicklers, in Wiz' Worten „AWS-Schlüssel, Cloud-CLI-Tokens, API-Geheimnisse und SSH-Agent-Sockets“. Ein MCP-Server ist nur ein Befehl, den Q startet, und dieser Befehl kam mit allem hoch, was deine eigene Shell hätte.
  • Eine Serverdefinition kann auf jeden beliebigen Befehl zeigen, sodass die Datei auf das Ausführen beliebigen Codes beim Öffnen des Ordners hinausläuft: Er läuft als du, mit deinen bereits geladenen Cloud-Anmeldedaten, in dem Moment, in dem du dem Workspace vertraust.

Die Offenlegung trägt eine echte Meinungsverschiedenheit über Zustimmung in sich, und das ist der ganze Sinn dieses Beitrags. Amazons Position: „Der Nutzer muss dem Workspace vertrauen, wenn er dazu aufgefordert wird.“ Es gibt ein Gate, und du klickst dich hindurch. Wiz' Befund: Vor dem Fix gab es keinen separaten Zustimmungsschritt für die MCP-Server selbst. Beides trifft zu, und das Versagen lebt in der Lücke dazwischen. Eine grobe, vertraute Vertrauensentscheidung — dasselbe Ja/Nein, das du einem Ordner gibst, damit der Editor ihn indizieren kann — autorisierte eine viel größere Gewährung: das Starten von Hintergrundservern, die deine aktive Sitzung trugen. Du hast eine Frage über das Lesen von Dateien beantwortet. Amazon Q gab den Klick aus für das Ausführen von Servern als du.

Amazon hat es in Language Servers 1.69.0 behoben (Clients: VS Code 2.20+, JetBrains 4.3+, Eclipse 2.7.4+, Visual Studio 1.94.0.0+), die fehlende Zustimmung pro Server hinzugefügt und einen verwandten Symlink-Prüf-Bypass gepatcht, CVE-2026-12958. Aktualisiere Amazon Q. Schau dann über den Patch hinaus auf den Teil, den er stehen lässt: Das Öffnen eines Repositorys konnte deine aktive Cloud-Sitzung in einen Prozess legen, den das Repository ausgewählt hat.

ENTWICKLER-LAPTOP — deine aktive Cloud-Sitzung liegt in der Umgebung, die jeder gestartete Server erbtENTWICKLER KLONTgit clone …/terraform-modulesnoch läuft nichtsliefert .amazonq/mcp.json miteine Serverdefinition, auf der FestplatteIN AMAZON Q ÖFFNEN„Diesem Workspace vertrauen?“ein vertrauter Klick → [Trust]liest .amazonq/mcp.jsonkeine Zustimmung pro ServerMCP-SERVER STARTEN AUTOMATISCHQ startet den deklarierten BefehlBefehl = alles, was das Repo schriebläuft als du, in deiner Shell↳ beliebiger Code beim Öffnen des OrdnersGEERBTE UMGEBUNG — jeder gestartete Server bekommt alles davon, alles echt$AWS_ACCESS_KEY_ID, ~/.awsdein Konto (echt)Cloud-CLI-Tokens (gcloud, az)deine Projekte (echt)API-Geheimnisse in env / .envProd-Schlüssel (echt)$SSH_AUTH_SOCKsigniert als du (echt)lesen · nutzen · exfiltrieren→ weg von deiner MaschineERGEBNISCode läuft als duCloud-Sitzung in der HandSchlüssel gelesen & versendetein Vertrauensklick erkaufteden ganzen Laptop
CVE-2026-12957 auf einem normalen Entwickler-Laptop. Das Klonen des Repos führt nichts aus. Es in Amazon Q zu öffnen und auf „Diesem Workspace vertrauen“ zu klicken — das eine vertraute Gate — bringt Q dazu, .amazonq/mcp.json zu lesen und die darin deklarierten MCP-Server zu starten, ohne separate Zustimmung pro Server. Jeder gestartete Server ist ein Befehl, den Q startet, und er kommt hoch und erbt die vollständige Umgebung des Entwicklers: AWS-Schlüssel, Cloud-CLI-Tokens, API-Geheimnisse, den SSH-Agent-Socket. Weil eine Serverdefinition auf jeden beliebigen Befehl zeigen kann, ist dies beliebiger Code, der als du läuft, mit deiner bereits geladenen aktiven Cloud-Sitzung. Der einzige Vertrauensklick beantwortete eine Frage über das Lesen von Dateien, und Q gab ihn aus für das Ausführen von Servern als du.

Dasselbe Repo, geöffnet in Bromure Agentic Coding.

Bromure Agentic Coding führt deinen Coding-Agenten, Amazon Q inklusive, in einer Linux-VM pro Profil aus: eigener Kernel, eigenes Dateisystem, eigener Netzwerk-Stack, auf Apples Virtualization-Framework. Ein Profil ist ein zusammenhängender Arbeitsbereich: dieser Kunde, dieser Dienst, dieses Open-Source-Modul, das du zur Bewertung geklont hast. Du klonst das Repository in dieses Profil und öffnest es dort. Das verwundbare Verhalten reproduziert sich genau so, wie Wiz es beschrieben hat: Du klickst auf Diesem Workspace vertrauen, Q liest .amazonq/mcp.json und startet die Server, die die Datei deklariert. Der Start feuert, und Code nach Wahl des Repositorys läuft.

Er läuft im Gast. Der MCP-Server kommt innerhalb der VM hoch und erbt die Umgebung der VM, und die Umgebung der VM hält deine Cloud-Sitzung nicht. Bromure liefert den Gast mit Stubs aus: gefälschte Werte, die für aws, gcloud, az, kubectl, git und alles andere, das einen Authorization-Header oder ein AWS_ACCESS_KEY_ID liest, echt aussehen. Ein Proxy auf deinem Mac sitzt vor jeder Verbindung, die die Sandbox verlässt, erkennt den Stub und tauscht ihn auf der Leitung gegen das echte Geheimnis aus, während die Anfrage abgeht; die Sandbox, die den Schlüssel hielt geht den Mechanismus durch. Der echte AWS-Schlüssel, das echte Cloud-CLI-Token, das echte API-Geheimnis berühren nie eine Datei, eine Umgebungsvariable oder eine Speicherseite, die die VM lesen kann.

Gehen wir also die Vererbung des CVE durch diese Grenze. Der gestartete Server liest $AWS_ACCESS_KEY_ID und findet einen Stub. Er liest ~/.aws und findet ein Stub-Profil. Er durchsucht die Umgebung nach den Cloud-Tokens und den API-Geheimnissen und findet Platzhalter. Der Server läuft wie geschrieben bis zum Ende durch und erbt eine Box, die deine Schlüssel nie hielt. Was CVE-2026-12957 zu einem Anmeldedaten-Diebstahl-Bug machte, ist die Umgebungsvererbung beim Start, und Bromure bricht sie nicht. Es lässt die geerbte Umgebung wertlos zurück.

BROMURE-VM PRO PROFILWorkspace vertrauen → Q liest mcp.jsonMCP-Server startet automatisch, läuftbeliebiger Code — nur im GastWAS DER SERVER ERBT$AWS_ACCESS_KEY_IDstub_AKIA…Cloud-Tokens, API-Geheimnissestub / fehlt$SSH_AUTH_SOCKweitergeleitetversucht: aws s3 rm / ec2 terminateein Schreibvorgang → geht durch den ProxyHost-Schlüssel exfiltrieren: nichts Echtes zu holenWirkungsradius = dieses eine Profilkein Host-FS, kein Zugriff auf Host-KeychainPROXY · DEIN MACCREDENTIAL-BROKERechte AWS-Schlüssel hier gehaltenStub → echt, auf der LeitungWert betritt nie die VMGUARDRAIL: LESEN/SCHREIBENlöschen / beenden → ABFRAGEbenennt Verb + ZielAUDITjeder Start + Aufruf protokolliertunterhalb des AgentenERGEBNISCloud-Sitzung:Stubs geerbt,echte Schlüssel unberührtCode-als-du:läuft in einem wegwerfbarenGast, nicht dem Hostdestruktiver Aufruf:pausiert, du sagst neinwas lief:in der Trace
Dasselbe Öffnen des Ordners, derselbe automatisch gestartete Server, in Bromure. (1) Isolierung: Der MCP-Server startet in der VM pro Profil, sodass der „beliebige Code als du“ in einem wegwerfbaren Gast statt auf dem Host landet, und der Wirkungsradius ist ein Profil. (2) Credential-Brokering: Der Server erbt die Umgebung des Gasts, die nur Stubs hält; die echten AWS-Schlüssel, Cloud-Tokens und API-Geheimnisse liegen auf dem Host hinter dem Proxy, auf der Leitung eingetauscht, sodass die Vererbung Platzhalter bekommt. (3) Guardrail: Jeder zustandsändernde Aufruf, den der Code versucht — etwa das Löschen eines Buckets, das Beenden einer Instanz oder das Pushen eines Branches —, ist ein Schreibvorgang, der auf der Leitung für eine Abfrage gestoppt wird, die Verb und Ziel benennt. Jede Schicht wird unterhalb des Agenten erzwungen, an einer Grenze, die der gestartete Prozess nicht umgehen kann, und jeder Start und ausgehende Aufruf wird in die Trace geschrieben.

„Diesem Workspace vertrauen“ war die falsche Frage.

Dieses CVE ist mehr wert als eine Patch-Notiz, und zwar wegen der Zustimmungslücke, und die Lücke ist ein Granularitätsproblem. Die Vertrauensabfrage stellte eine einzige breite Frage, vertraust du diesem Ordner, und ein einziges Ja musste sowohl das harmlose abdecken, das du meintest (den Assistenten meinen Code lesen lassen), als auch das gefährliche, von dem du nicht wusstest, dass es daran hing (Hintergrundserver mit meiner Cloud-Sitzung starten). Das kannst du nicht gut beantworten. Niemand kann das, denn die Frage verschmilzt zwei Gewährungen, die nichts miteinander zu tun haben, und zeigt dir nur die unschuldige.

Bromure verlangt nicht von dir, in dieser Ermessensentscheidung besser zu werden. Es nimmt die Entscheidung aus dem Pfad. Der Vertrauensklick innerhalb eines Profils lässt den Assistenten weiterhin seine Arbeit tun, und er kann immer noch keinen Prozess starten, der deine echte Cloud-Sitzung hält, weil diese Sitzung nicht in der VM ist, um geerbt zu werden. Sie lebt auf dem Host, hinter dem Broker, erreichbar nur als gestubbte Anfrage, die der Proxy auf der Leitung ausfüllt und protokolliert. Die gefährliche Hälfte der Gewährung ist weg. Du hast sie nicht zurückgehalten; es gab dort nichts zu gewähren, weil die Grenze unterhalb des Agenten sitzt, wo die Vertrauensabfrage sie nicht verschieben kann.

Die andere gefährliche Hälfte ist ein gestarteter Server, der destruktiv wird statt nur neugierig, und der trifft auf Guardrails. Bromure liest die Operation, nicht nur die Verbindung: Ein aws s3 ls ist ein Lesevorgang, ein aws s3 rm ist ein Schreibvorgang; ein git fetch ist ein Lesevorgang, ein git push ist ein Schreibvorgang. Stelle die Cloud-Anmeldedaten eines Profils auf bei Schreibvorgang nachfragen, und in dem Moment, in dem der Code nach einem zustandsändernden Aufruf greift, etwa einem DELETE, einem Terminate* oder einem Force-Push, stoppt Bromure ihn auf der Leitung und blendet auf deinem Mac eine Abfrage ein, die das Verb, das Ziel und das Profil benennt. Lesevorgänge unterbrechen dich nie. Die Mutation ist es, die pausiert, genauso wie „der Agent hat die Produktionsdatenbank gelöscht“ aufhört, eine Postmortem zu sein und zu einem Dialogfeld wird, das du ablehnst.

Was die Trace zeigt.

Jedes Team stellt am Morgen, nachdem so etwas einschlägt, dieselbe Frage: Habe ich dieses Repo geöffnet, und was hat es ausgeführt? Auf einem normalen Laptop ist die ehrliche Antwort ein Achselzucken. Der MCP-Server, den Q startete, war ein Kindprozess in deiner Sitzung, und was auch immer er las und wohin auch immer er telefonierte, er tat es als du, ohne Aufzeichnung, die ihn von deiner eigenen Arbeit trennt.

Innerhalb von Bromure sitzt der Agent in einer VM, und jedes ausgehende Byte geht durch den Host-Proxy, sodass der Start und seine Aufrufe sichtbar bleiben, selbst wenn der Agent sie nicht sehen kann. Der Host zeichnet auf, wie der MCP-Server hochkommt, die Befehle, die er ausführte, die Anmeldedaten, die er den Broker auszufüllen bat, und jede Verbindung, die er versuchte, in dieselbe Sitzungs-Trace wie alles andere, was der Agent tat, geschrieben unterhalb des Agenten, wo der gestartete Code nicht hineingreifen kann, um sie zu bearbeiten. „Hat der Server dieses Repos mein Konto berührt“ hört auf, eine Vermutung zu sein, die du Wochen später aus CloudTrail rekonstruierst, und wird zu einer Zeile, die du liest: Der Broker reichte einen Stub heraus, die Anfrage hatte einen Namen, das Ziel wurde protokolliert. Für ein Unternehmen ist das der Unterschied zwischen wir haben Amazon Q gepatcht und wir können zeigen, was jedes Repo, das unsere Entwickler geöffnet haben, getan hat, und die Audit-Haltung ist genau die, auf die unsere Enterprise-Arbeit immer wieder zurückkommt.

Wo dich das nicht rettet.

Ein weitergeleiteter ssh-agent-Socket ist nutzbar, solange er weitergeleitet ist.

Bromure bewahrt deine privaten SSH-Schlüssel im macOS-Keychain auf und kopiert sie nie in die VM. Aber wenn bei einem Profil der ssh-agent-Socket hineingeleitet ist (so wie OpenSSH es vorsieht), kann ein gestarteter Server den Agenten bitten, mit diesen Schlüsseln zu signieren, solange der Socket aktiv ist. Die Schlüsseldatei verlässt nie den Host; die Signierfähigkeit erreicht den Gast sehr wohl. Leite den Socket nur in Profile weiter, die ihn brauchen, und grenze ihn so ein, wie der Broker eine Anmeldeinformation eingrenzt.

Ein Schreibvorgang, den du genehmigst, ist ein Schreibvorgang, der passiert.

Der Read-Write-Guardrail fängt den destruktiven Aufruf ab, von dem der Agent dir nichts gesagt hat. Er liest nicht deine Absicht in Gedanken. Wenn du absichtlich einen Stack abbaust und die Abfrage genehmigst, leitet Bromure das Terminate weiter. Die Abfrage erkauft dir einen Blick auf Verb und Ziel; du musst sie trotzdem lesen.

Das Profil ist langlebig, also bleibt Persistenz bestehen.

Ein Bromure-Profil ist keine wegwerfbare Festplatte. Ein gestarteter Server, der sich in einen Startpfad innerhalb des Profils schreibt, kann in der nächsten Sitzung in diesem Profil wieder aufwachen. Wozu er aufwacht, ist ein Gast ohne Host-Schlüssel und ein Broker, der nur kurzlebige, abgefragte, eingegrenzte Tokens spricht: Präsenz in einer Box, in der nichts ist, aber dennoch Präsenz.

Gepatcht ist nicht dasselbe wie gelöst.

Amazon hat in 1.69.0 die Zustimmung pro Server hinzugefügt, und du solltest aktualisieren. Aber der nächste Assistent, der beim Öffnen des Ordners Projektkonfiguration liest, wird dieselbe Klasse von Entscheidung treffen, und die Abfrage, die er zeigt, wird genauso routinemäßig aussehen. Isolierung ist der Teil, der nicht davon abhängt, dass ein bestimmter Anbieter einen bestimmten Zustimmungsdialog richtig hinbekommt.

Der nächste Workspace ist bereits irgendwo geklont.

Die Lehre aus dem Red-Hat-Scope war, dass der Herausgeber keine Verteidigung ist. Die Lehre aus den Microsoft-Repos war, dass es das Repository auch nicht ist, und dass das Öffnen eines Ordners genügt, um Code auszuführen. Amazon Q fügt die nächste Zeile hinzu: Die Vertrauensabfrage ist ebenfalls keine Verteidigung. Die Frage, die sie dir stellt, vertraust du diesem Ordner, ist nicht die Frage, deren Antwort zählt, nämlich sollte dieser Ordner Server starten dürfen, die meine Cloud-Sitzung tragen. Die zweite wurde dir nie gezeigt, und du hättest sie nicht gut beantworten können, wenn es so gewesen wäre.

Das behebst du nicht, indem du die Abfrage sorgfältiger liest, denn die Abfrage war die falsche Abfrage. Du behebst es, indem du die Dinge so anordnest, dass „welcher Workspace ist das“ aufhört, die Frage zu sein, an der deine Cloud-Schlüssel hängen; warum ein Coding-Agent keine Sandbox ist ist die längere Version dieses Arguments. Bromure Agentic Coding ist die Konfiguration, in der der Agent das Repo in einer VM pro Profil öffnet, die echten Anmeldedaten auf dem Host hinter einem Broker bleiben, jeder Schreibvorgang, den der Agent macht, eine Abfrage passieren muss, und jeder Server, den er startet, in eine Trace geschrieben wird, die er nicht bearbeiten kann. Das Schlimmste, was eine vergiftete mcp.json tun kann, ist, eine Box zu erben, die deine Schlüssel nie hielt. Es ist kostenlos, Open Source und ab heute verfügbar.