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

Der Befehl begann mit npm install

Am 24. August 2026 veröffentlichte das CTRL-Team von Cato Networks eine Kampagne, die gesponserte Google-Treffer für „codex macos download“ kauft, Entwickler auf eine als OpenAIs Codex-Portal verkleidete Google-Sites-Seite lotst und sie bittet, einen Terminal-Befehl einzufügen, dessen erste Zeile ein echtes npm install für Codex ist. Alles nach dieser Zeile ist Base64. Bromure Agentic Coding schickt niemanden auf die Suche nach einem Coding-Agenten: Der Installationsbefehl ist eine feste Zeichenkette in Bromures eigenem Image-Katalog, er läuft in einer wegwerfbaren Linux-VM, die Zugangsdaten darin sind Attrappen, und wenn nicht zugeordneter ausgehender Verkehr verweigert wird, verlassen die drei Abrufe des Loaders die Maschine nie.

Seit zwei Jahren baut die Branche Kontrollen für das, was ein Coding-Agent installiert. Diese Kampagne geht einen Schritt früher an und vergiftet, wie Sie den Coding-Agenten installieren. Dieser Schritt hat keine Registry, keine Lockfile und keine Provenance-Attestierung. Er hat ein Suchfeld, eine Seite, die richtig aussieht, und Ihre eigenen Hände auf der Tastatur.

Ein Entwickler will OpenAIs Codex CLI auf seinem Mac ausprobieren und tippt deshalb codex macos download in Google. Der erste Treffer ist gesponsert und steht über OpenAIs eigenem Eintrag. Er führt zu einem sauberen Download-Portal mit dem richtigen Logo und der richtigen Typografie, gehostet auf sites.google.com. Die Seite sagt: Terminal öffnen, das hier einfügen.

Er fügt es ein. Der Befehl beginnt mit npm install, und der Paketname stimmt.

Am 24. August veröffentlichte das Forschungsteam CTRL von Cato Networks die Analyse dieser Kampagne, noch am selben Tag aufgegriffen von Infosecurity Magazine, SiliconANGLE und Techzine. Die Nutzlast ist ein macOS-Infostealer. Die Zustellung ist das, was die Analyse verdient.

Google hostete die Seite. Den Köder hostete jemand anderes.

Google Sites ist ein Website-Baukasten. Jeder mit einem Konto bekommt eine Seite auf einer Google-Domain, und das Zertifikat, das Schloss und die erste Hälfte der URL gehören alle Google. Das ist das geliehene Vertrauen.

Die Seite selbst enthält nichts. Cato fand darauf überhaupt keinen Schadcode. Der Köder kommt in einem iframe, der auf die Infrastruktur des Angreifers zeigt und laut Catos Analyse über einen Google-Proxy für statische Inhalte geroutet wird, sodass selbst der zweite Hop aussieht wie Google, das etwas abholt. Techzine nennt zwei der iframe-Hosts: bright-links[.]com und swiftsaverfin[.]com.

Diese Trennung bringt den Betreibern zweierlei. Die sichtbare Seite ändert sich nie, löst also kein Reputationssystem aus und wird nie erneut geprüft, und sie tauschen die Nutzlasten auf der anderen Seite des iframes aus, wann immer sie wollen. Cato zählte drei getrennte Infrastruktur-Sets, wobei das dritte einen iframe-Host aus dem ersten wiederverwendet.

Der Rest liest sich wie eine ausgereifte Anzeigenbetrugs-Operation. Aktive Köder liegen unter einem verschleierten Pfad, /codexx/, während /codex/ etwas Harmloses ausliefert. Die Betreiber erstellen Fingerabdrücke der Besucher, und alles, was kein plausibles macOS-Ziel ist, sieht harmlose Inhalte — ihre Antwort auf Forscher und Sandboxes. Domains rotieren. Nutzlast-URLs variieren.

Die erste Zeile war echt

ClickFix liefert Ihnen keine Datei. Es gibt Ihnen eine Anweisung und lässt Sie die Nutzlast selbst über die Grenze tragen. Techzine formuliert es so: „keine Datei wird heruntergeladen, die eine Antivirenlösung blockieren könnte“.

Der eingefügte Befehl beginnt mit einer legitim wirkenden npm install-Zeichenkette für Codex. Das ist der ganze Trick. Ein Entwickler, der gerade ein Node-CLI installieren will, sieht npm install, sieht den Paketnamen, nach dem er gesucht hat, und sein Gehirn legt die Zeile als richtig ab. Der Base64-Blob danach ist einen Shell-Operator entfernt, auf derselben Zeile, jenseits des Falzes der Kopierbox. Man liest nicht die zweite Hälfte eines Befehls, dessen erste Hälfte der Befehl ist, den man erwartet hat.

Dekodiert holt er ein entferntes Skript und leitet es an zsh weiter. Drei Stufen folgen.

Stufe eins ist ein Shell-Skript, gepolstert mit totem Code und unbenutzten Variablen, das einen kodierten Blob umschließt, der an eval übergeben wird. Die Polsterung existiert, um Mustererkennung auszuhebeln und einen Menschen, der die Datei überfliegt, aufgeben zu lassen.

Stufe zwei funkt den Angreifer mit einem Parameter event=pasted an, bevor sie irgendetwas anderes tut. Das ist eine Zustellquittung. Jemand am anderen Ende misst die Einfüge-Rate seiner Landingpages, so wie ein Marketer Conversions misst.

Stufe drei lädt die Binärdatei nach /tmp/helper, führt xattr -c aus, um das Quarantäne-Attribut zu entfernen, das macOS allem anhängt, was aus dem Netz kam — was die Gatekeeper-Warnung unterdrückt —, markiert sie als ausführbar und startet sie. Die Binärdatei ist ein universelles Mach-O, läuft also auf Intel wie auf Apple Silicon.

Cato merkt an, dass die Betreiber den Loader noch weiterentwickeln. Ältere Samples nutzten Base64 mit Kompression; neuere nutzen AES-verschlüsselte gzip-Container, deren Schlüssel aus über das Skript verstreuten Variablen wieder zusammengesetzt wird.

Für die finale Nutzlast verbindet Cato das Zustell-Framework mit Atomic macOS Stealer: die Struktur der Loader-URL, die Form der Telemetrie-Anfrage, der Staging-Pfad /tmp/helper, das Entfernen von xattr, die Update-thematisierten Nutzlast-URLs. Sie nennen die Überschneidung stark und konsistent und verzichten darauf, die Binärdatei zu benennen — die richtige Entscheidung, und eine, die man beim Weitererzählen beibehalten sollte.

Zustellung: alles, was das Opfer siehtcodex macos downloadgesponsertes Ergebnis,über OpenAIs Eintragsites.google.comCodex-Portal-Doppelgänger,kein eigener Schadcodeiframe: der echte Köderbright-links[.]comswiftsaverfin[.]com„Terminal:einfügen“kein DownloadDie eine Zeile, die der Entwickler liestnpm install ... codex ...; base64 -d ... | zshAusführung: drei Stufen, drei ausgehende Abrufe1 · LoaderShell-Skript, gepolstert mittotem Code und unnützen Varseval "$blob"2 · QuittungTelemetrie-Beacon nach Hause?event=pasteddie Conversion-Metrik3 · Nutzlast/tmp/helperxattr -c ; chmod +xuniverselles Mach-O
Die Kette vom Suchfeld bis zur laufenden Binärdatei. Nirgends darin ein Exploit: eine gesponserte Anzeige, eine von Google gehostete Seite, die nichts enthält, ein iframe, das alles enthält, und ein Mensch, der die Nutzlast durch Einfügen selbst über die Grenze trägt. Der einzige Befehl, den das Opfer je zu sehen bekommt, beginnt mit einer echten npm-install-Zeile für Codex; das Base64 danach holt Stufe eins. Der event=pasted-Beacon von Stufe zwei ist die eigene Zustellquittung des Betreibers.

Der Schritt oberhalb der Scanner

Stellen Sie die Kontrollen nebeneinander, die die Branche zwei Jahre lang für Coding-Agenten gebaut hat. Reputationsprüfung von Registries. Lockfiles und Integritäts-Hashes. Build-Provenance und Attestierung. SBOMs. Mindestalter-Gates für neue Paketversionen. Statische Analyse von generiertem Code. Sie alle funktionieren, und sie alle gehen von derselben Annahme aus: der Entwickler hat bereits eine funktionierende Toolchain, und das Risiko liegt flussabwärts, in dem, was er damit tut.

Diese Kampagne sitzt flussaufwärts von all dem. Die Fälschung ist hier der Agent selbst, und sie kommt vor jeder Registry, vor jeder Lockfile, in einem Befehl, den der Entwickler mit den eigenen Händen in sein eigenes Terminal tippt. Ein Scanner hat kein Artefakt zu bewerten, weil das Artefakt ein Satz auf einer Webseite ist.

Das Targeting ist die andere Hälfte der Ökonomie. Wer auf codex macos download bietet, kauft die Maschine einer Person, die in genau diesem Moment einen Coding-Agenten einrichtet: eine Maschine, die binnen einer Stunde ein API-Token, einen SSH-Schlüssel, eine ~/.aws/credentials-Datei und ein GitHub-PAT enthalten wird — alles Dinge, die ein Infostealer zu finden weiß. Der Installationsmoment ist der billigste Zeitpunkt, um dort zu sein.

Wir haben die Umkehrung davon schon behandelt: bei FakeGit und AgentBaiting sucht der Agent und reicht dem Menschen die Installationsschritte. Hier sucht der Mensch. Beides funktioniert, weil Entdecken-dann-Einfügen die Art ist, wie Software installiert wird, und an keinem Ende dieser Schleife ein Scanner sitzt.

Woher der Installationsbefehl kommt

Bromure Agentic Coding hat keine solche Schleife, und der Grund liegt darin, woher der Agent kommt.

Sie gehen nicht auf die Suche nach einem Coding-Agenten. Codex ist ein Schalter im Agents-Panel eines Profils, neben Claude Code und Grok Build. Schalten Sie ihn ein, wählen Sie, wie er sich authentifiziert, und der Agent ist in der nächsten Sitzung da und läuft in einem kitty-Tab in der VM des Profils.

Hinter diesem Schalter steckt eine feste Zeichenkette. Bromure provisioniert sein Basis-Image aus dem eigenen Katalog, und der Eintrag für Codex ist eine Zeile:

npx --yes @socketsecurity/cli npm install -g --silent @openai/codex

Claude Code ist @anthropic-ai/claude-code nach demselben Muster, Kimi Code ist @moonshot-ai/kimi-code. Die Paketnamen sind in die App einkompiliert, nicht gefunden. Die Registry ist registry.npmjs.org, nicht irgendein Host, den ein iframe benennt. Die Installation ist über die socket.dev-CLI gewickelt, und der Abruf geht durch den MITM-Proxy des Hosts hinaus, wo die Supply Chain-Richtlinien des Profils greifen: das standardmäßig aktive Zwei-Tage-Altersgate, dazu die OSV-Abfragen, das socket.dev- oder Delpi-Filtern und das Entfernen von Installationsskripten, das Sie einschalten können.

Dieser Weg hat kein Suchergebnis und keine Seite, die sich imitieren ließe. Der Kanal, den der Angreifer bezahlt hat, um ihn zu vergiften, fehlt im Workflow — und fehlend ist keine Kontrolle, an deren Bedienung man denken muss.

Ganz normal installierenwer benennt das Artefakt?wer die Anzeigenauktion gewannwer liefert es aus?ein iframe auf einer Fake-Seitewas läuft?alles nach der ersten Zeilewo?Ihr Mac, Ihr Benutzerkonto, neben~/.ssh · ~/.aws · ~/.git-credentialsGatekeeper per xattr -c stummgeschaltetVier offene Fragen, beantwortet von einem Fremden.In einem Bromure-Profil aktivierenwer benennt das Artefakt?@openai/codex, aus dem Image-Katalogwer liefert es aus?registry.npmjs.org, über den Host-Proxywas läuft?ein einkompilierter Befehl, kein Freitextwo?eine wegwerfbare Linux-VM, gebaut bevordie Suche geschah — keine Schlüssel drin,Zugangsdaten sind Attrappen, Egress geregeltDieselben vier Fragen, vorab beantwortet.
Zwei Wege, einen Coding-Agenten zu beziehen. Links ist der Beschaffungsschritt ein Suchfeld und ein Kopier-Button: der Name des Artefakts, der Host, der es ausliefert, und der Befehl, der es installiert, werden alle von demjenigen gewählt, der die Anzeigenauktion gewonnen hat, und das Ergebnis läuft auf dem Mac, der die Schlüssel des Entwicklers hält. Rechts ist der Artefaktname in die App einkompiliert, die Registry ist fest, der Abruf wird am Host-Proxy gefiltert, und die Installation läuft in einer wegwerfbaren VM, die gebaut wurde, bevor all das begann.

Und jetzt fügen Sie es trotzdem ein

Architektur muss den Tag überleben, an dem jemand sie ignoriert. Nehmen Sie die Kampagne, schenken Sie ihr den Sieg, und führen Sie sie durch ein Profil: Jemand findet das gefälschte Portal, kopiert den Befehl und fügt ihn in das Terminal ein, in dem er Agentenarbeit macht — in Bromure Agentic Coding ein kitty-Tab in der VM.

Die Binärdatei läuft nicht. Ein universelles Mach-O ist eine macOS-Executable. Das Gastsystem ist Ubuntu. xattr ist kein Linux-Befehl, und /tmp/helper ist ein Pfad auf einer Systemplatte, die existiert, um verworfen zu werden. Ressourcen → Speicher bietet Home löschen… für /home/ubuntu und Auf Basis zurücksetzen…, um die Workspace-Systemplatte aus dem geteilten, schreibgeschützten Basis-Image neu zu klonen.

Die drei Abrufe gehen nicht hinaus. Jede Stufe dieser Kette braucht das Netz: die base64-dekodierte URL, die Stufe eins holt, der event=pasted-Beacon und der Nutzlast-Download. Guardrails → Ausgehende Verbindungen ist eine Regeltabelle im pf-Stil: Aktion, Protokoll (tcp, udp, web, any), Host oder CIDR, Ports, und für web eine Liste von HTTP-Methoden, von oben nach unten ausgewertet, erste Übereinstimmung gewinnt, mit Nicht zugeordneter Verkehr auf Erlauben oder Verweigern. Stellen Sie ihn auf Verweigern und listen Sie die Hosts auf, die Ihre Arbeit braucht. bright-links.com gehört nicht dazu. Bromure setzt die Tabelle hostseitig durch, im virtuellen Switch und im Proxy, sodass nichts, was der Gast an seiner eigenen Umgebung ändert, die Antwort verändert.

Stufe zwei ist die, bei der es sich lohnt zu verweilen. event=pasted ist die Conversion-Metrik des Betreibers, der Ping, der ihm sagt, dass eine Landingpage funktioniert, und wie gut. Wenn diese Anfrage am Host stirbt, bekommt er keinen Bericht über eine fehlgeschlagene Infektion. Er bekommt Stille, und die liest sich wie eine Anzeigeneinblendung, die nie konvertiert hat.

Der Diebstahl liefert Platzhalter zurück. Ein Stealer der Atomic-Klasse geht auf Browserdaten, Wallets und, auf einer Entwicklermaschine, Zugangsdaten los. In einem Bromure-Profil gelangen die echten Werte nie in die VM. Generische API-Schlüssel sind brm_…-Fälschungen, als Umgebungsvariablen exportiert und vom Host-Proxy auf der Leitung ausgetauscht. Die kubeconfig ist synthetisch, mit Wegwerf-Client-Zertifikaten. AWS-Anfragen werden hostseitig neu signiert, sodass alles, was den Proxy umgeht, InvalidSignatureException bekommt. ~/.docker/config.json enthält einen gefälschten Base64-Blob. Private SSH-Schlüssel sind nicht darin zu lesen: sie waren es nie. Schalten Sie Genehmigung zur Nutzung erforderlich pro Zugangsdatum ein, und jeder Austausch wird zu einem Host-Dialog mit einer zeitlich begrenzten Freigabe: fünf Minuten, eine Stunde, der Rest der Sitzung. Ein Profil teilt höchstens acht von Ihnen ausgewählte Ordner, sodass der Rest des Macs nicht einen Verzeichnisgang entfernt liegt.

Die Korrelation ist schon auf Ihrem Bildschirm. Catos eigenes Fazit lautet, dass keine einzelne Stufe dieser Kampagne sie enttarnt; die Erkennung erforderte, die gesponserte Suchzustellung, den eingebetteten Webinhalt, die Terminal-Ausführung und die ausgehende Aktivität zusammen zu korrelieren. Das ist ein schweres Problem, wenn Ihre Belege in einem Browser, einer Shell und einem Netzwerk-Tap liegen. In einem Profil ist es ein Fenster: das Sicherheitsprotokoll (Fenster → Sicherheitsprotokoll…) ist eine einzige chronologische, hostseitige Tabelle aus Paket-Urteilen, Firewall-Entscheidungen, Zugangsdaten-Austauschen und Prompt-Injection-Erkennungen. Gastcode kann sie nicht ändern, weil Gastcode sie nicht erreichen kann.

Schalten Sie es ein

Das Altersgate ist standardmäßig auf zwei Tage aktiv. Die anderen Schichten sind Einstellungen, und sie sind zwei Minuten wert: Guardrails → Ausgehende Verbindungen, mit Nicht zugeordneter Verkehr auf Verweigern und einer Erlaubnisliste für die Hosts, die Ihre Arbeit braucht. Supply Chain → OSV-Schwachstellenprüfung, dazu socket.dev- oder Delpi-Filtern, falls Sie einen Schlüssel haben, und das Entfernen von Installationsskripten. Zugangsdaten → Genehmigung zur Nutzung erforderlich für alles, was Geld ausgeben oder Daten löschen kann. Lassen Sie dann das Sicherheitsprotokoll-Fenster eine Woche lang auf einem zweiten Bildschirm offen und sehen Sie, mit wem Ihre Builds reden.

Gesponserte Suchergebnisse werden weiter die Vordertür sein, und Website-Baukästen auf vertrauenswürdigen Domains werden weiter die Veranda hosten. Google wird diese Seiten abschalten und drei neue werden hochgehen, weil die Ökonomie ein paar Dollar pro Klick gegen eine Entwickler-Workstation mit Cloud-Zugangsdaten darauf ist. Installieren Sie Bromure Agentic Coding, aktivieren Sie Ihre Agenten im Profil-Editor statt auf einer Downloadseite, und lassen Sie den nächsten eingefügten Befehl in einer Maschine landen, die gebaut wurde, um weggeworfen zu werden.