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

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.

Wo der echte Schlüssel liegtSchlüssel in einer gehosteten KonsoleIhr LaptopKolleginAndere Nutzerechte SchlüsselWorkspace-Speicher des Anbieterssk-ant-… sk-proj-… AIza…Schlüssel aller verknüpften NutzerAltsystem, wird stillgelegtAngreifer fährt Inferenz in MasseBezahlt wird vom Inhaber, bis der Schlüssel widerrufen ist.Schlüssel in Bromure Agentic CodingIhr Mac · models.encAES-GCM, Hauptschlüssel im Data Protection KeychainLinux-VM · Umgebung und Config des AgentenANTHROPIC_API_KEY=sk-ant-api03-brm-… (Platzhalter)Proxy auf dem Mac prüft das Ziel jeder Anfrageapi.anthropic.comPlatzhalter → Schlüsseljeder andere Host451, VM pausiertKeine gehostete Kopie. Die VM hält nur Platzhalter.
Links: In einer gehosteten Konsole gespeicherte Schlüssel teilen sich einen Server mit den Schlüsseln aller anderen Nutzer, und ein einziger Einbruch erreicht sie alle. Rechts: In Bromure existiert der echte Schlüssel in einer verschlüsselten Datei auf Ihrem Mac und in der Anfrage, die der Mac an den Anbieter schickt. Alles, was die VM hält, ist ein Platzhalter, und ein Platzhalter, der anderswohin geschickt wird, hält die Maschine an.

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.