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

Der Stealer packte die Platzhalter ein

Am 15. Oktober berichtete Symantec, dass Aoki, ein dieses Jahr erstmals gesichteter Infostealer, jetzt Zugangsdaten von Coding-Agenten sucht: .claude.json, Codex’ config.toml und .env-Dateien, Tokens für GitHub Copilot, Cursor, Gemini, JetBrains AI Assistant und Kiro sowie AWS-Schlüssel. In Bromure Agentic Coding enthält jede dieser Dateien einen Platzhalter, Anmeldungen und Schlüssel bleiben verschlüsselt auf dem Mac, und ein Platzhalter, der an den Server eines Stealers geht, hält die Maschine an.

Die Liste des Stealers beginnt jetzt mit Ihrem Coding-Agenten. Er will .claude.json, die Codex-Konfiguration und die .env-Dateien daneben.

Ein Infostealer hatte es früher auf Browser-Cookies, gespeicherte Passwörter, Krypto-Wallets und Discord-Tokens abgesehen. Aoki nimmt all das immer noch mit. Neuere Builds suchen zusätzlich nach den Dateien, die Ihr Coding-Agent in Ihrem Home-Ordner ablegt.

Symantecs Threat Hunter Team beschrieb die Änderung am Mittwoch, dem 15. Oktober, in Aoki: Infostealer Targets AI Coding Assistant Credentials. Infosecurity Magazine berichtete am selben Tag. Aoki, nach einer Zeichenkette in seiner Entschlüsselungsroutine auch Aokigahara genannt, tauchte Anfang dieses Jahres auf. Symantec schreibt, dass „frühere Versionen der Malware keine KI-bezogenen Dateien ins Visier nahmen“. Die neueste Probe tut es.

Was Aoki mitnimmt

Symantec listet die Agent-Dateien der neuesten Probe auf:

  • .claude.json und die Cookies von Claude Desktop.
  • ChatGPT-Cookies.
  • Codex’ config.toml und .env-Dateien.
  • Die lokale Zustandsdatenbank von Cursor, die „Chat-Kontext und Code-Schnipsel zwischenspeichern kann“.
  • Tokens für GitHub Copilot, Cursor, Google Gemini, JetBrains AI Assistant und Kiro.
  • AWS-Zugangsdaten.

Der Rest der Liste ist die übliche Infostealer-Beute: mehr als vierzig Browser, rund neunzig Wallet-Erweiterungen, Desktop-Wallets, Passwortmanager, Telegram, Discord, FTP- und VPN-Clients. Aoki sucht außerdem nach jeder Datei, deren Name secret, privatekey, keystore, mnemonic, passphrase oder backup enthält. Symantec merkt an, dass „die Malware keine Liste von Backdoor-Befehlen hat“. Sie sammelt, was sie findet, und schickt es per POST an einen /gate-Endpunkt auf ihrem Command-and-Control-Server.

Symantec erklärt, warum sich die Agent-Dateien lohnen: „Wie Kartendaten lässt sich ein gestohlener KI-Schlüssel direkt zu Geld machen.“ Der Käufer verbraucht Kontingent auf Ihrem Konto, eine Praxis, die als LLMjacking bekannt ist. Dieselben Tokens „können Angreifern ermöglichen, unter der Identität eines legitimen Nutzers zu handeln“, und reichen bis zu den Repositories, Cloud-Konten und CI/CD-Pipelines, mit denen das Konto verbunden ist.

Symantec sagt nicht, wie Aoki auf eine Maschine gelangt. Auf dem Laptop eines Entwicklers mit Coding-Agent ist der naheliegende Weg ein Paket. Der Agent installiert täglich Dutzende davon auf eigene Faust, und eine bösartige Abhängigkeit mit einem postinstall-Skript läuft mit den Rechten des Agenten, sobald npm install fertig ist.

Dieselbe Liste in einer Bromure-Maschine

In Bromure Agentic Coding läuft der Agent in einer Linux-VM auf Ihrem Mac. Echte Zugangsdaten gelangen nie in diese VM. Der Mac hält sie in einem verschlüsselten Tresor und schreibt Platzhalter in die VM, die wie die echten aussehen, damit jedes Tool sie akzeptiert. Ein Proxy auf dem Mac tauscht jeden Platzhalter auf der Leitung gegen den echten Wert, und zwar nur bei Anfragen an den Host, zu dem die Zugangsdaten gehören.

Setzen Sie einen Stealer mit Aokis Liste in diese VM und gehen Sie seine Checkliste mit ihm durch.

.claude.json und der Claude-Schlüssel

Claude Code läuft in der VM mit sk-ant-api03-brm-…, einem Platzhalter-Schlüssel. Wenn Sie sich mit einem Claude-Abo angemeldet haben, wurden die OAuth-Tokens bei der Anmeldung auf dem Mac abgefangen und verschlüsselt in claude-subscription.enc gespeichert. Der Host erneuert das Access-Token etwa fünf Minuten vor Ablauf und fügt es in Anfragen an Anthropic ein. Die VM hält nie ein Refresh-Token, also enthält weder .claude.json noch irgendetwas anderes im Home-Ordner gültige Claude-Zugangsdaten, die der Stealer mitnehmen könnte.

Codex’ config.toml, auth.json und .env

Codex bekommt eine vorbelegte ~/.codex/auth.json mit einem gefälschten JWT, dessen Ablaufdatum weit in der Zukunft liegt, damit der Client nicht versucht, es zu erneuern. Die echte ChatGPT-Anmeldung liegt auf dem Mac in codex-subscription.enc. Ein OpenAI-API-Schlüssel erscheint in der VM als sk-brm-….

Eine Projekt-.env, importiert mit Import env file… im Bereich Credentials der Maschine, kommt mit denselben Variablennamen zurück, jeder Wert ein brm_…-Platzhalter, beschränkt auf die Hosts, die Sie wählen. Ihr Code liest STRIPE_KEY wie eh und je, und der Stealer liest brm_….

GitHub, AWS und SSH

~/.git-credentials und GH_TOKEN enthalten einen ghp_-Platzhalter mit 40 Zeichen wie das Original. Es gibt keine ~/.aws/credentials. ~/.aws/config verweist auf einen credential_process-Helfer, der dem AWS SDK die echte Access-Key-ID mit einem falschen, 40 Zeichen langen geheimen Schlüssel übergibt, und der Mac signiert jede Anfrage auf dem Weg zu AWS neu. Ein Stealer, der die Ausgabe des Helfers kopiert, bekommt einen geheimen Schlüssel, der nur InvalidSignatureException liefert.

Die Stichwortsuche nach privatekey oder id_ed25519 findet nichts. SSH_AUTH_SOCK ist in der VM eine Brücke zu einem Signier-Agenten auf dem Mac, und die Bytes des privaten Schlüssels gehen nie hinüber.

Cookies

Aoki will die Cookies von Claude Desktop und ChatGPT. Die VM der Maschine hat weder eine Desktop-App noch ein Browserprofil, das sich lesen ließe. Wenn Sie sich für Bromure bei Claude oder ChatGPT anmelden, öffnet sich die Anmeldeseite im Browser Ihres Macs, und die Tokens landen im Tresor. Der Agent surft mit einem Chromium, das in einer eigenen, wegwerfbaren Sidecar-VM läuft, getrennt von der VM der Maschine, sodass ein Stealer in der VM des Agenten das Browserprofil nicht erreicht.

Die Checkliste eines Stealers, in einer Bromure-MaschineVM des AgentenDatei, die der Stealer öffnetWas er findet~/.claude.json, ANTHROPIC_API_KEYsk-ant-api03-brm-… (Platzhalter)~/.codex/auth.json, config.tomlgefälschtes JWT, sk-brm-….env des ProjektsSTRIPE_KEY=brm_…~/.git-credentials, GH_TOKENghp_… (Platzhalter)AWS-Zugangsdatenechte Key-ID + falsches Secret~/.ssh/id_*keine Datei (Signier-Brücke)Der Mac, außerhalb der VMVerschlüsselter Tresor (AES-GCM)Hauptschlüssel im Data ProtectionKeychain, kein iCloud-Syncclaude-subscription.enccodex-subscription.encmodels.encWorkspace-Secrets, SSH-SchlüsselRefresh-Tokens bleiben hier.Der Proxy setzt den echten Wertnur für den zugehörigen Host ein.POST https://dobeqnesmot.cc/gateBody: sk-ant-api03-brm-…, ghp_…, brm_…Mac-Proxy: Platzhalter auf dem Weg zum falschen Host451, nichts weitergeleitet, VM angehalten
Aokis Checkliste, abgearbeitet in einer Bromure-Maschine. Jede Datei auf der Liste existiert und enthält einen Platzhalter. Wenn der Stealer seine Beute an /gate schickt, findet der Proxy auf dem Mac Platzhalter auf dem Weg zu einem Host, für den sie nie ausgestellt wurden, antwortet mit 451 und hält die VM an.

Der Upload an /gate

Zum Schluss schickt Aoki seine Beute per POST an /gate. Symantec nennt dobeqnesmot[.]cc, hjazfioe[.]surf und neihite[.]cc. In einer Bromure-Maschine muss diese Anfrage durch den Proxy auf dem Mac, denn der Proxy ist der einzige Weg der VM ins Netz.

Der Proxy durchsucht jede ausgehende Anfrage, Header und Body, nach Platzhaltern, die anderswohin unterwegs sind als zu dem Host, für den sie ausgestellt wurden. Ein sk-ant-api03-brm-…-Wert hat genau eine legitime Zielfamilie, Anthropic. Ein ghp_-Platzhalter gehört zu GitHub. In einem POST an eine .cc-Domain können sie nur Exfiltration bedeuten. Der Proxy antwortet mit HTTP 451 und leitet nichts weiter. Die VM hält sofort an, und der Mac zeigt This environment may have been compromised, mit einer Zeile pro geleaktem Platzhalter: eine Token-Vorschau, der Name der Zugangsdaten, der Host, zu dem sie gehören, und der Host, den der Stealer angesteuert hat.

Was dann passiert, entscheiden Sie. Save for Investigation exportiert die Festplatte der VM, ihren Home-Ordner und die freigegebenen Ordner in einen Ordner Ihrer Wahl und fährt die Maschine dann herunter. Shut down stoppt sie und markiert sie als kompromittiert. Eine kompromittierte Maschine startet erst nach Wipe and Launch wieder, das Festplatte und Home-Ordner ersetzt und Ihre Tokens, SSH-Schlüssel und Einstellungen behält. Ihre Claude-Anmeldung, Ihr GitHub-Token und Ihre AWS-Schlüssel waren nie in der VM, also hat der Stealer nichts kopiert, das Sie rotieren müssten.

Sie können den Upload auch schon vor dem Scan stoppen. Stellen Sie im Bereich Guardrails der Maschine unter Outbound connections den Punkt Unmatched traffic auf Deny und tragen Sie die Hosts ein, die die Maschine braucht. Eine Verbindung zu einer unbekannten .cc-Domain wird dann abgewiesen, und die Security Timeline zeigt dafür eine rote Firewall-Zeile.

Verpackt der Stealer seine Beute so, dass der Scan die Platzhalter nicht lesen kann, erhält der Server am anderen Ende trotzdem Werte, die sich nirgends authentifizieren. Ein Platzhalter funktioniert nur, wenn er auf dem Weg zu dem Host, für den er ausgestellt wurde, durch den Proxy Ihres Macs läuft.

Bevor der Stealer läuft

Der wahrscheinlichste Weg in die VM eines Agenten ist ein Paket, das der Agent installiert hat. Der Bereich Supply Chain der Maschine prüft jeden Abruf auf dem Mac, bevor die VM ihn zu sehen bekommt:

  • Die Mindestalter-Sperre, standardmäßig aktiv mit zwei Tagen Minimum, blendet Paketversionen aus, die jünger als die Grenze sind. Ein gekapertes Release, das binnen Stunden zurückgezogen wird, erreicht npm install nie.
  • Das Entfernen von Installationsskripten streicht, wenn Sie es einschalten, die Hooks preinstall, install, postinstall und prepare aus jedem npm-Tarball unterwegs, der übliche Weg, auf dem npm-Malware bei der Installation läuft.
  • OSV, socket.dev oder Depi blockieren Versionen mit bekannten Sicherheitshinweisen und Pakete, die als Malware oder Typosquats markiert sind, mit einem 451, dessen Begründung der Paketmanager wörtlich ausgibt.

Jeder Abruf erscheint in der Security Timeline, sodass Sie nach einem Vorfall das Paket finden, das den Stealer hereingebracht hat.

Wenn der Stealer auf dem Mac läuft

Aokis Dateiliste zeigt auch, was ein Stealer auf dem Mac selbst findet, und eine Bromure-Installation fügt dem nichts hinzu. Bromure importiert die Anmeldungen der Claude- oder Codex-CLI Ihres Macs nicht und braucht sie nicht: Die Agenten laufen in der VM, und ihre Anmeldungen liegen im Tresor. Alles unter ~/Library/Application Support/BromureAC/, was ein Geheimnis enthält, ist AES-GCM-Chiffretext. Der Hauptschlüssel liegt im Data Protection Keychain, gebunden an Bromures Signaturidentität, und wird nie synchronisiert. Ein Stealer, der den Ordner kopiert, erbeutet verschlüsselte Blobs.

Symantec hebt die lokale Datenbank von Cursor hervor, weil sie Chat-Kontext und Code zwischenspeichert. Bromures Aufzeichnung dessen, was der Agent getan hat, der Session-Trace, ist im Ruhezustand mit demselben Tresorschlüssel verschlüsselt und speichert Token-Tausche nur als Vorschau aus erstem und letztem Zeichen. Kein echtes Geheimnis erscheint in einem Trace, ob verschlüsselt oder nicht.

Jede Datei auf der Liste enthält einen Platzhalter

.claude.json, Codex’ auth.json und config.toml, importierte .env-Werte, Git-Zugangsdaten und die AWS-Konfiguration tragen allesamt Platzhalter. Refresh-Tokens und private SSH-Schlüssel kommen nie in die VM.

Der Upload stoppt die Maschine

Der Proxy findet Platzhalter auf dem Weg zu einem Host, für den sie nicht ausgestellt wurden, antwortet mit 451, hält die VM an und nennt jeden geleakten Zugang.

Nichts zu rotieren

Wipe and Launch ersetzt Festplatte und Home-Ordner und behält Ihre Schlüssel. Der Stealer hat Werte erbeutet, die nur durch den Proxy Ihres Macs funktionieren.

Die Tür wird bewacht

Mindestalter-Sperre, Entfernen von Installationsskripten und Reputationsprüfungen laufen auf dem Mac, bevor ein Paket die VM erreicht, und jeder Abruf wird protokolliert.

Die Liste wird länger

Laut Symantec scheinen Aokis Fähigkeiten „sich noch in aktiver Entwicklung zu befinden“, und andere Stealer werden die Liste kopieren. Aoki hat die Agent-Dateien aufgenommen, weil sich gestohlene Agent-Schlüssel und -Anmeldungen verkaufen lassen. Lassen Sie Ihre Agenten in einer Bromure-Maschine laufen, und der Käufer bekommt ein Bündel Platzhalter, das kein Server außerhalb des Proxys Ihres Macs annimmt.

Zur alltäglichen Variante desselben Problems, bei der der Agent selbst ein Geheimnis in sein Transkript kopiert, lesen Sie Das Transkript behielt das Token. Zu einem Wurm, der es aus einem kompromittierten npm-Paket heraus auf dieselben Dateien abgesehen hatte, lesen Sie Das Widerrufen des Tokens war der Auslöser.