Das Update brachte einen Schlüssel mit
Elf Stunden lang lieferte Cursors Extension-Marketplace am 29. Oktober eine trojanisierte Claude-Code-Extension unter Anthropics eigenem Publisher-Namen aus. Beim Laden fügte sie den SSH-Schlüssel eines Angreifers hinzu, installierte einen LaunchAgent und versuchte, einen Reverse-Tunnel zu öffnen, auf den Rechnern von bis zu 5.000 Entwicklern. In Bromure Agentic Coding kommt der Agent nicht aus einem Editor-Marketplace, und eine solche Payload läuft in einer VM, die niemand erreichen kann: Die Egress-Firewall verweigert ihren Tunnel, und das Zurückspulen des Home-Verzeichnisses entfernt ihre Persistenz.
Niemand musste einen Chat öffnen oder einen Tool-Aufruf genehmigen. Der Editor lud die Extension, und 66 Zeilen JavaScript liefen als der Entwickler, noch bevor der Code von Claude Code selbst lief.
Am 29. Oktober lieferte Cursors Extension-Marketplace zwischen etwa 2:27 und
13:35 Uhr pazifischer Zeit eine trojanisierte Version von Anthropics
Claude-Code-Extension aus. Cursors
Sicherheitshinweis
nennt die Versionen 2.1.312 und 2.1.313 von anthropic.claude-code,
veröffentlicht unter Anthropics Publisher-Identität, und hält fest, dass
Anthropic sie nicht gebaut hat.
BleepingComputer
berichtet, dass bis zu 5.000 Entwickler betroffen waren, und The Hacker
News
weist darauf hin, dass jeder mit aktiviertem Auto-Update sie bekommen
konnte, ohne etwas zu tun.
Forscher von Phorion und OpenSourceMalware veröffentlichten am 30. Oktober ihre Analysen. Cursor zog die Extension zurück, nahm seinen Marketplace für ein Audit und den Austausch der Schlüssel vom Netz und ließ den Server des Angreifers abschalten. Wie das Build unter Anthropics Namen veröffentlicht werden konnte, hat bisher niemand gesagt.
Was die 66 Zeilen taten
Der Angreifer ließ den Code von Claude Code unangetastet und setzte einen
66-zeiligen Loader davor, an den Anfang von extension.js.
OpenSourceMalware beschreibt das Muster: „place a compact backdoor before a
large legitimate bundle, suppress errors, and let the expected application
continue.“ Der Loader lief, sobald der Editor die Extension lud und ihre
Webview öffnete. Der Entwickler musste kein Gespräch beginnen. Danach lud
die echte Extension und funktionierte.
In der Zwischenzeit tat der Loader Folgendes:
- Er machte Inventur. Hostname, Benutzername, Betriebssystem, Home-
und Arbeitsverzeichnis, die globale Git-E-Mail, die öffentliche IP und
die Namen von bis zu 40 Umgebungsvariablen, die
KEY,TOKEN,SECRET,PASS,AWSoderGCPenthielten. All das schickte er als JSON über unverschlüsseltes HTTP an134.209.82.225:8099/beacon. - Er baute eine Tür ein. Er hängte einen Ed25519-Schlüssel mit dem
Kommentar
svc-telemetryan~/.ssh/authorized_keysan. - Er versuchte, sie zu öffnen. Unter macOS führte er
sudo -n systemsetup -setremotelogin onaus, unter Linux versuchte ersshdzu starten, und unter Windows installierte er OpenSSH Server. - Er rief nach Hause. Er schrieb einen privaten Schlüssel in eine
temporäre Datei und verband sich mit
[email protected]per-N -R '*:0:localhost:22', einem Reverse-Tunnel, der einen Port auf dem Server des Angreifers zurück auf den SSH-Port des Entwicklers weiterleitet. Alle 60 Sekunden baute er die Verbindung neu auf. - Er richtete sich dauerhaft ein. Ein Benutzer-LaunchAgent namens
com.apple.sysmondunter macOS, ein Crontab-Eintrag@rebootunter Linux und eine geplante Aufgabe namensSysMonunter Windows.
Laut BleepingComputer verhinderten Programmierfehler bei vielen Opfern,
dass SSH eingeschaltet wurde. Schlüssel, Persistenz und Beacon landeten
trotzdem auch auf diesen Rechnern.
Cursor rät, nach dem Schlüssel svc-telemetry zu suchen, die Persistenz zu
entfernen, eine Neuinstallation des Rechners zu erwägen, weil das
Deinstallieren der Extension womöglich nicht reicht, und alle
Zugangsdaten, die der Rechner erreichen konnte, auszutauschen, „using a
trusted system.“
Der vertrauenswürdigste Code auf dem Rechner
Eine Editor-Extension läuft mit dem vollen Konto des Entwicklers. Sie kann jede Datei im Home-Verzeichnis lesen, Prozesse starten und einen LaunchAgent schreiben, der den Editor überlebt. Marketplaces spielen Updates ein, ohne zu fragen, und der Publisher-Name auf diesem war der von Anthropic. Ein vorsichtiger Entwickler, der vor der Installation den Publisher geprüft hatte, bekam die Hintertür trotzdem: Sie kam als Update einer Extension, die er Wochen zuvor installiert hatte.
Coding-Agenten erhöhen den Einsatz. Die Extension, die den Agenten beherbergt, ist die, der Entwickler am meisten erlauben: Sie liest das ganze Repository, führt Befehle aus und steckt in einem Prozess mit den API-Schlüsseln und Cloud-Tokens der Umgebung. Dieser Loader nahm die Namen dieser Variablen mit. Ihre Werte zu lesen, kostet dieselben paar Zeilen.
Derselbe Morgen in Bromure Agentic Coding
Bromure Agentic Coding führt Claude Code, Codex, Grok, Kimi und omp in Ubuntu-VMs auf Ihrem Mac aus. Jede Maschine ist eine eigene VM, und der Agent, seine Repositories, seine Paketinstallationen und seine Befehle leben alle darin. Den Chat und die Terminals, in die Sie tippen, zeichnet die App auf Ihrem Mac. Die echten Zugangsdaten, der Proxy, durch den der Verkehr der VM läuft, und das Protokoll dessen, was passiert ist, bleiben ebenfalls auf dem Mac.
Der Agent kommt nicht aus einem Editor-Marketplace
Im Pfad liegt kein Extension-Marketplace: Bromure zeichnet sein eigenes
Chatfenster auf dem Mac. Claude Code wird in Ihre Kopie von Bromures
Basis-Image durch einen Setup-Schritt installiert, der in einem Katalog
steht, der mit demselben Schlüssel signiert ist wie Bromures App-Updates.
Dieser Schritt installiert @anthropic-ai/claude-code von npm, umhüllt vom
Supply-Chain-Scanner von Socket.dev. OpenSourceMalware führt das npm-Paket
unter den Distributionen, die nicht betroffen waren.
Alles, was der Agent danach installiert, geht durch den Proxy auf dem Mac,
und der Proxy wendet die Supply-Chain-Richtlinie der Maschine an. Das
Mindestalter ist ab Werk eingeschaltet, mit zwei Tagen: Versionen auf npm,
PyPI, Cargo, RubyGems und Packagist, die jünger sind, werden aus der
Auflistung der Registry entfernt, sodass latest auf das neueste Release
auflöst, das seit zwei Tagen öffentlich ist. Cursors bösartiges Build war
elf Stunden online. Ein gekapertes Release auf npm mit derselben
Lebensdauer taucht in einer Bromure-Maschine nie auf. Diesen Fall haben wir
anhand von LiteLLMs vergiftetem PyPI-Release in Das Release war zwei
Stunden alt durchgespielt.
Der Schlüssel öffnet eine Tür, die niemand erreicht
Angenommen, eine Payload wie diese gelangt trotzdem in eine Maschine, über
ein Repository, das der Agent klont, oder ein Tool, das er ausführt. Sie
läuft in Ubuntu, als Benutzer der Maschine. Sie bekommt weder Ihr
macOS-Konto noch Ihren Schlüsselbund noch das ~/.ssh Ihres Macs.
Ihr Schlüssel svc-telemetry landet in der eigenen authorized_keys der
VM. Die Maschinen hängen an einem privaten Netz innerhalb der App: Ihr Mac
erreicht sie, Ihr physisches LAN nicht, und von außen kann sich nichts
verbinden, solange Sie nicht selbst einen Dienst veröffentlichen. Der
einzige Weg hinein war der Reverse-Tunnel.
Der Tunnel geht nie auf
Der Tunnel braucht eine ausgehende SSH-Verbindung zu 134.209.82.225, der
Beacon unverschlüsseltes HTTP zu Port 8099 an derselben Adresse. Jede
Verbindung der VM läuft über den Mac, wo die Firewall
Outbound connections der Maschine greift. Ihre Regeln passen auf Host,
IP-Bereich, Protokoll und Port, und mit Unmatched traffic auf Deny
kommen nur die Hosts durch, die Sie aufgeführt haben. Eine
DigitalOcean-IP auf Port 22 steht auf niemandes Liste. Die Firewall
verweigert den Tunnel, jeden Neuversuch im 60-Sekunden-Takt und den Beacon.
Jede Ablehnung landet in der Security Timeline auf Ihrem Mac, mit Host, Port, Protokoll und Urteil. Ein Deny zur selben IP jede Minute ist kaum zu übersehen, und Sie sehen es, während der Angreifer noch auf eine Verbindung wartet.
Die Inventur ist nichts wert
Die Liste der Variablennamen hätte in einer Bromure-Maschine einiges
gefunden: ANTHROPIC_API_KEY, ein GitHub-Token, AWS-Einstellungen. Jeder
Wert ist ein Platzhalter. Die echten Zugangsdaten liegen verschlüsselt auf
dem Mac, und der Proxy tauscht einen Platzhalter nur bei Anfragen an den
Host, zu dem er gehört, gegen seinen echten Wert aus. Private SSH-Schlüssel
sind überhaupt nicht in der VM. SSH_AUTH_SOCK ist eine Brücke zum Mac,
die Signaturen zurückgibt, und der ssh-agent Ihres Macs wird nie
freigegeben. Ein Loader, der auch die Werte gelesen hätte, hätte
Zeichenketten bekommen, die kein Server akzeptiert. Hätte er einen davon an
seinen eigenen Server geschickt, hätte der Proxy die Anfrage blockiert, die
VM pausiert und This environment may have been compromised angezeigt,
mit dem Namen der Zugangsdaten und dem Ziel.
Das Aufräumen dauert eine Minute
Cursor sagt betroffenen Entwicklern, den Schlüssel und die Persistenz zu
entfernen, eine Neuinstallation des Rechners zu erwägen und die
Zugangsdaten von einem vertrauenswürdigen System aus auszutauschen. In
Bromure besteht die Neuinstallation aus zwei Menüpunkten. Bromure legt bei
jedem Start einen Copy-on-Write-Checkpoint des Home-Verzeichnisses jeder
Maschine an. Rewind home… setzt /home/ubuntu auf einen Start vor dem
Lauf der Payload zurück und nimmt den zusätzlichen Schlüssel und den
Launcher ~/.config/.smt mit. Reset disk klont die Systemplatte neu
aus dem Basis-Image und nimmt die Crontab mit. Einstellungen, Zugangsdaten
und SSH-Schlüssel der Maschine überstehen beides.
Das vertrauenswürdige System, das Cursor verlangt, ist der Mac, der die Payload nie ausgeführt hat. Auszutauschen gibt es nichts, weil die VM nie echte Zugangsdaten hatte.
Geben Sie der riskanten Arbeit eine eigene Maschine
Zugangsdaten und Firewall-Regeln werden pro Maschine festgelegt, und
Maschinen sind schnell angelegt. Eine Maschine, die neue Tools, Plugins und
Starter-Kits ausprobiert, kann ohne Produktionszugangsdaten auskommen und
eine Firewall haben, die alles außer ihren Paket-Registries verweigert. Die
Maschine, die deployt, behält ihre Zugangsdaten, mit einer Freigabe vor
jeder Verwendung. Für ein einmaliges Experiment legt
bromure-cli vm run --rm eine Maschine an, die beim Stoppen gelöscht wird.
Kein Marketplace im Pfad
Der Chat ist Teil der App. Claude Code kommt aus Anthropics npm-Paket, über einen signierten Setup-Schritt, gescannt von Socket.dev.
Zwei Tage vor allem Neuen
Das Mindestalter blendet Paket-Releases aus, die jünger als zwei Tage sind. Eine gekaperte Version, die elf Stunden lebt, wird nie aufgelöst.
Eine Tür, die niemand erreicht
Ein eingeschleuster Schlüssel landet in der eigenen authorized_keys der VM, in einem privaten Netz, in das weder Ihr LAN noch das Internet hineinkommt.
Unbekannte Hosts verweigern
Mit Unmatched traffic auf Deny werden Reverse-Tunnel und Beacon abgewiesen, und jeder Versuch wird auf dem Mac festgehalten.
Platzhalter in der VM
Jeder API-Schlüssel und jedes Token in der VM ist ein Platzhalter, und private SSH-Schlüssel kommen nie hinein. Die Inventur ist nichts wert.
Zurückspulen statt neu aufsetzen
Rewind home und Reset disk entfernen die Dateien und die Persistenz der Payload. Einstellungen, Zugangsdaten und Schlüssel bleiben.
Das Werkzeug, das den Agenten ausführt, gehört zur Angriffsfläche
Cursor und Anthropic haben nicht gesagt, wie das Build unter Anthropics Namen hinausging. Für Ihren eigenen Rechner klärt der Vorfall einen Punkt. Die Software, die Ihren Coding-Agenten beherbergt, läuft mit Ihrem Konto und aktualisiert sich selbst, und ein vertrauenswürdiger Publisher-Name auf dem Update beweist nichts über seinen Inhalt.
In Bromure Agentic Coding laufen Ihr Agent und alles, was er anfasst, in einer VM auf Ihrem Mac. Diese VM hält Platzhalter, erreicht nur die Hosts, die Sie erlauben, und lässt sich auf einen Start zurücksetzen, bevor etwas schiefging. Die echten Schlüssel verlassen den Mac nie.
Zu Infostealern, die inzwischen Tokens und Verläufe von Coding-Agenten einsammeln, lesen Sie Sie haben Ihren Agenten auf die Liste gesetzt. Zu einer Kompromittierung, die auf dem Laptop eines Entwicklers begann und bei 6,3 Milliarden Dollar endete, lesen Sie Der Laptop war das Einfallstor.