Die Schlüssel lagen in ihrer Konsole
In der Nacht zum 17. Oktober drang jemand in ein Altsystem von OpenCode ein und erreichte die OpenAI-, Anthropic- und Google-API-Schlüssel, die rund 1,4 % der Nutzer der OpenCode Console in ihren Workspaces gespeichert hatten. OpenCode sprach von einem groß angelegten Distillation-Angriff, und Nutzer meldeten Anbieterrechnungen, die sie nicht verursacht hatten. In Bromure Agentic Coding bleiben Anbieterschlüssel verschlüsselt auf Ihrem Mac, das Routing über mehrere Anbieter läuft auf Ihrem Mac, und jede Kopie eines Schlüssels, die die VM verlässt, ist ein Platzhalter, den kein Anbieter akzeptiert.
Ihr Laptop war in Ordnung. Ihr Anthropic-Schlüssel wurde von einem Server gestohlen, in den Sie ihn vor Monaten eingefügt hatten.
Am Samstag, dem 17. Oktober, teilte OpenCode einem Teil seiner Nutzer mit, man habe „identified unauthorized access to a legacy system“, ein System, das gerade stillgelegt wurde. Der Einbruch geschah in der Nacht vom 16. auf den 17. Oktober. In der Mitteilung hieß es, „third party provider keys (eg OpenAI, Anthropic) saved in your workspace may have been exposed“. OpenCode bezifferte den Anteil betroffener Nutzer der OpenCode Console auf etwa 1,4 %, beschränkt auf Konten mit verknüpften externen Anbietern, und schrieb jeden davon per E-Mail an. Den Vorfall beschrieb das Unternehmen als „related to a large scale distillation attack“ und erklärte, es arbeite mit Anthropic, OpenAI und Google zusammen. OfficeChai, Startup Fortune und andere berichteten noch am selben Tag.
OpenCode erklärte, man könne nicht bestätigen, ob die Schlüssel benutzt worden seien, und der Vorfall dauere noch an. Nutzer auf X meldeten Abbuchungen auf Schlüsseln, die sie ausschließlich mit OpenCode verwendet hatten, teils im Bereich von Hunderten Dollar. Überall stand derselbe Rat: jeden in der Console gespeicherten Schlüssel im Dashboard des jeweiligen Anbieters widerrufen, neue ausstellen und jede Stelle aktualisieren, an der der alte Schlüssel lag.
Die Opfer hatten kein bösartiges Paket ausgeführt und kein präpariertes Repository geöffnet. Ein Eindringling nahm ihre Schlüssel von einem Server, in den sie sie selbst eingefügt hatten.
Warum die Schlüssel dort lagen
OpenCode ist ein Open-Source-Coding-Agent, der mit mehr als 75 Modellanbietern spricht. Die Console ist sein gehosteter Teil: Dort können Sie Ihre eigenen Anbieterschlüssel in einem Workspace speichern und den Dienst sie für Sie verwenden lassen. Die Zusammenfassung von ai-tldr beschreibt sie als Schlüssel, die „for bring-your-own-key use“ gespeichert wurden. Das ist bequem: ein Konto, alle Anbieter, kein Jonglieren mit Schlüsseln über mehrere Laptops.
Es macht die Datenbank eines Anbieters aber auch zum Schlüsselbund. Jeder Nutzer, der einen Anbieter verknüpfte, legte eine weitere aktive, abrechenbare Zugangsberechtigung in denselben Speicher. Monate später hatte ein System, das der Anbieter gerade außer Betrieb nahm, noch immer Zugriff auf diesen Speicher.
Ein Modell-API-Schlüssel ist eine Ausgabenvollmacht. Wer ihn besitzt, kann auf Ihre Rechnung Inferenz kaufen, bis Sie ihn widerrufen, in dem Tempo, das der Anbieter erlaubt. Das gemeldete Motiv, „Distillation“, bedeutet, die Antworten eines starken Modells in großer Menge abzugreifen, um damit ein billigeres zu trainieren. Das braucht sehr viele Anfragen, und ein gestohlener Schlüssel lässt jemand anderen dafür bezahlen.
Eine Kopie, auf Ihrem Mac
Bromure Agentic Coding führt Claude Code, Codex, Grok, Kimi und omp in Linux-VMs auf Ihrem Mac aus. Sie registrieren jeden Modellanbieter einmal, unter Preferences › Models: Fügen Sie einen API-Schlüssel ein oder klicken Sie auf Sign in with Anbieter, um ein Abonnement von Claude, ChatGPT, Grok oder Kimi ganz ohne API-Schlüssel zu nutzen.
Die Schlüssel landen in models.enc im Support-Ordner der App,
verschlüsselt mit AES-GCM unter einem Hauptschlüssel pro Installation.
Dieser Hauptschlüssel liegt im Data Protection Keychain von macOS, gebunden
an die Signaturidentität der App, mit ausgeschalteter iCloud-Synchronisation.
Er verlässt den Mac nie. Bromure hat kein Konto, in dem Ihre Schlüssel
liegen, und keinen gehosteten Workspace, mit dem sie sich synchronisieren.
Bromure bietet den Komfort der Konsole auf dem Mac. Jede Maschine liest dieselbe Übersicht, und eine Maschine kann sie mit eigenen Schlüsseln überschreiben. Codex, Grok, Kimi und omp erreichen Bedrock, OpenRouter, xAI und Moonshot über einen übersetzenden Proxy, der auf dem Mac läuft und den echten Schlüssel dort hält. Claude Code erreicht OpenRouter und z.ai direkt mit einem Platzhalter.
In der VM ist alles ein Platzhalter
Der Agent braucht zum Start weiterhin ANTHROPIC_API_KEY oder
OPENAI_API_KEY, und er bekommt einen. In der VM enthalten diese Variablen
Platzhalter, die wie das Original aussehen: sk-ant-api03-brm-… für
Anthropic, sk-brm-… für OpenAI, xai-brm-… für xAI, sk-kimi-brm-… für
Kimi. Der HTTPS-Verkehr des Agenten läuft über einen Proxy auf dem Mac, der
den Platzhalter nur bei Anfragen an die eigenen Hosts dieses Anbieters
gegen den echten Schlüssel tauscht: anthropic.com, openai.com, x.ai,
moonshot.ai. Der Abgleich erfolgt exakt oder per Subdomain, nie per
Teilstring, also bekommt api.openai.com.evil.example nichts.
Mit einem Abonnement ist es dasselbe, nur ohne Schlüssel. Die Anmeldung läuft in einer Wegwerf-VM oder über den eigenen Login des Agenten, der Proxy fängt die OAuth-Tokens auf dem Mac ab, und der Agent behält einen Platzhalter. Der Host erneuert das Access-Token etwa fünf Minuten vor Ablauf. Die VM hält nie ein Refresh-Token.
Viele Werkzeuge bieten inzwischen an, ihre Einstellungen in die Cloud des
Herstellers zu synchronisieren: eine CLI, die ihre Config „sichert“, ein
Editor, der Ihren Workspace in Ihrem Konto ablegt, ein Plugin mit
Dashboard. In einer Bromure-Maschine enthält die Config, die diese
Werkzeuge hochladen, sk-ant-api03-brm-…. Ein Platzhalter auf dem Server
eines anderen ist dort wertlos. Kein Anbieter akzeptiert ihn, und zum
echten Schlüssel wird er erst, wenn die Anfrage über Ihren Mac zu dem
Anbieter geht, für den er erzeugt wurde.
Der Proxy erwischt auch den Upload selbst. Er durchsucht jede ausgehende Anfrage, Header und Body, nach Platzhaltern, die an ein anderes Ziel als ihren eigenen Anbieter gehen. Eine Config-Synchronisation, die einen Anthropic-Platzhalter an einen Drittserver trägt, bekommt HTTP 451. Nichts wird weitergeleitet, die VM pausiert, und der Mac zeigt This environment may have been compromised an, mit der Token-Vorschau, der Zugangsberechtigung, dem Host, zu dem sie gehört, und dem Host, an den sie geschickt wurde. Sie erfahren davon an dem Tag, an dem ein Werkzeug versucht, Ihren Schlüssel von der Maschine zu kopieren, Monate vor der Breach-Mitteilung irgendeines Anbieters.
Am Morgen danach, in Bromure
Angenommen, Sie haben die E-Mail trotzdem bekommen, weil Sie einen Schlüssel auch anderswo verwendet haben. Jede Anleitung sagt dieselben drei Dinge: widerrufen, überall ersetzen, Nutzung prüfen. In Bromure ist jeder Schritt kurz.
Überall ersetzen. Der echte Schlüssel liegt an genau einer Stelle.
Fügen Sie den neuen im Popover des Anbieters unter Preferences › Models
ein, und Bromure aktualisiert jede laufende Maschine etwa anderthalb
Sekunden, nachdem Sie aufgehört haben zu tippen: die Tauschtabelle, die
Umgebung der Agenten und ihre Config-Dateien. Agenten, deren
Zugangsberechtigung sich geändert hat, starten in ihrem Tab mit ihren
Resume-Flags neu, das Gespräch geht also weiter, und die VM bootet nie neu.
Es gibt keine .env-Dateien, CI-Secrets oder Laptops von Kollegen, denen
Sie für die Kopien in den VMs hinterherjagen müssten, denn diese Kopien
waren Platzhalter.
Nutzung prüfen. Auf der Stufe AI request details, mit der neue
Maschinen starten, protokolliert der Mac jeden Austausch mit einem
Modellanbieter als llm.request-Eintrag: Anbieter, Host, Modell, Status
sowie Token-Zahlen für Eingabe, Ausgabe und Cache. Zeigt das Dashboard
eines Anbieters um 3 Uhr morgens eine Spitze, können Sie sie mit dem
abgleichen, was Ihre Maschinen gesendet haben. bromure-cli trace summary
und bromure-cli trace hostnames liefern die Ansicht pro Maschine im
Terminal. Jeder Tausch eines Anbieterschlüssels erscheint in der Security
Timeline als Zeile Credential brokering, mit maskierter Vorschau und
Host, in einer Tabelle mit einer Spalte Workspace. Alles auf der
Rechnung des Anbieters, was Ihre Maschinen nicht gesendet haben, kam von
jemand anderem.
Für ein Team fasst Bromure Enterprise Manager dieselben
llm.request-Zahlen pro Nutzer, pro Workspace und pro Modell zusammen,
ohne Prompts, Antworten oder Secrets hochzuladen. Ein gestohlener
Schlüssel zeigt sich als Ausgabe, die zu keiner Installation passt.
Oder ganz ohne Schlüssel. Für Claude Code, Codex, Grok und Kimi ersetzt eine Anmeldung per Abonnement den nutzungsbasiert abgerechneten Schlüssel, und die dabei entstehenden Tokens bleiben auf dem Mac und werden dort erneuert. So bleibt kein langlebiger API-Schlüssel übrig, den ein Dritter speichern könnte.
Eine verschlüsselte Kopie, auf Ihrem Mac
Anbieterschlüssel und Anmeldungen liegen in models.enc, unter einem Hauptschlüssel im Data Protection Keychain. Bromure hat keinen gehosteten Workspace und kein Konto, das sie hält.
Routing über mehrere Anbieter, lokal
Jede Maschine liest dieselbe Models-Übersicht. Agenten erreichen andere Anbieter über einen Proxy auf dem Mac, der den echten Schlüssel hält.
Platzhalter, wo immer eine Kopie landet
Die VM, ihre Config-Dateien und alles, was ein Werkzeug in die Cloud synchronisiert, enthalten Platzhalter. Ein Platzhalter, der an den falschen Host geht, bekommt ein 451 und pausiert die Maschine.
Einmal rotieren, pro Anfrage prüfen
Ein neuer Schlüssel erreicht jede laufende Maschine ohne Neustart. Jeder Austausch mit einem Modell wird mit Modell und Token-Zahlen protokolliert.
Wo ein Schlüssel liegen sollte
Jede Stelle, an der Sie einen Anbieterschlüssel einfügen, ist eine weitere Stelle, von der er gestohlen werden kann. Laptops fangen sich Stealer ein, Repositories werden abgegrast, und wie diese Woche gezeigt hat, legen Anbieter Systeme still, die noch an die Schlüssel ihrer Kunden herankommen.
Bewahren Sie den echten Schlüssel in einer einzigen verschlüsselten Datei auf Ihrem Mac auf und verteilen Sie überall sonst Platzhalter. Zur Laptop-Seite desselben Problems lesen Sie Der Stealer packte die Platzhalter ein und Der Agent leakte seinen eigenen Schlüssel.