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.
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.
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.