Der Scanner weigerte sich, es zu lesen
Googles Threat Intelligence Group hat am 8. September seinen AI Threat Tracker veröffentlicht. Vergraben im Abschnitt über eine Lieferketten-Gruppe namens UNC6780 steckt eine Technik, die die Sicherheitsrichtlinie eines Modells zur Tarnung macht: Der JavaScript-Loader der Malware beginnt mit einem Kommentarblock, der Synthesewege für Biowaffen und Spezifikationen für Kernwaffen verlangt, dort platziert, damit ein LLM-Sicherheitsscanner beim Lesen aus Richtliniengründen ablehnt und den Code darunter nie erreicht. Die Ablehnung ist die Umgehung. Bromure Agentic Coding begegnet solchen Artefakten mit Prüfungen, die sie nie lesen.
Einen Sicherheitsscanner dazu zu bringen, Malware freizugeben, ist harte Arbeit. Ihm eine Datei hinzulegen, die so radioaktiv ist, dass er gar nicht hinsieht, ist ein Kommentarblock — und Ihre Pipeline legt die Ablehnung unter „Analyse nicht möglich“ ab.
In Ihrer Build-Pipeline steckt inzwischen ein LLM. In den meisten steckt eines. Irgendwo zwischen dem Eintreffen des Dependency-Updates und dem Aufleuchten des Merge-Buttons liest ein Modell das Diff, liest die neuen Dateien und schreibt eine kurze Einschätzung, ob irgendetwas davon feindlich aussieht. Guter Einsatz der Technologie: Es erwischt verschleierte Loader, an denen Mustererkennung vorbeiläuft, und es kostet einen Bruchteil eines Cents pro Datei.
Am 8. September veröffentlichte Googles Threat Intelligence Group seinen AI Threat Tracker, eine vierteljährliche Übersicht darüber, was Angreifer mit diesem Zeug anstellen. Die meiste Aufmerksamkeit ging an die Schlagzeilenzahl: ein finanziell motivierter Akteur, der die Cloud-Infrastruktur eines Unternehmens kompromittierte und dann, in GTIGs Worten, „einen KI-Coding-Chatbot, einen Prompt und einen Satz Agenten-Anweisungen nutzte, um in weniger als sechs Stunden eine Massenkampagne zum Abgreifen von Zugangsdaten zu planen, zu bauen und auszuführen“. Tausende fremde Zugangsdaten, hinausgeleitet über die eigenen IP-Adressen des Opfers. Auf einem separaten offenen Server fanden die Forscher ein Aufklärungs-Framework, dessen Dashboard in Echtzeit mehr als 23 800 erbeutete Geheimnisse mitzählte.
Das ist die Geschichte, die geschrieben wurde. Der Absatz, der Ihren Nachmittag verdient, steht mehrere Abschnitte weiter unten, im Teil über eine Lieferketten-Gruppe, die Google als UNC6780 führt.
Der Kommentar am Anfang der Datei
UNC6780, auch bekannt als TeamPCP, betreibt seit März 2026 großflächige
Open-Source-Kompromittierungen über PyPI, npm und Docker Hub. Ihr aktueller
Zugangsdaten-Dieb heißt DUSTMAKER und ist eine JavaScript-Payload.
JavaScript-Payloads haben einen Loader. Der hier ist eine Datei namens
_index.js, und GTIG fand oben darin etwas Neues:
Neben Prompts, die in Konfigurationsdateien eingebettet sind und auf KI-Coding-Agenten zielen, enthielten DUSTMAKER-Samples Prompts, die als Kommentare am Anfang der JavaScript-Loader-Skripte der Malware (
_index.js) eingebettet waren. Diese Prompts enthalten extremen adversarialen Text, der Themen wie biologische und nukleare Waffen aufgreift und vermutlich dazu gedacht ist, LLM-Sicherheitsscanner scheitern zu lassen oder sie die Analyse des darunterliegenden bösartigen JavaScript-Codes überspringen zu lassen — wegen Sicherheits- oder Richtlinien-Ablehnungen.
Der Kommentarblock lässt die Malware in aller Offenheit liegen. Entpackt, unkodiert, alles in einer Datei: Das bösartige JavaScript steht drei Zeilen weiter unten, wo jeder, der bis zum Ende liest, darüber stolpern würde.
Der Kommentar macht den Leser unwillig, das Ende zu erreichen. Er beginnt mit einer gefälschten System-Übersteuerung, verkündet, dass die Sicherheitsrichtlinien ausgesetzt seien, und verlangt einen Schritt-für-Schritt-Syntheseweg für aerosolverbreitete biologische Waffen. Dann geht er weiter zum Design einer Implosions-Kernwaffe, samt Sprengkraftziel. Ein Modell, das die Datei aufnimmt und gefragt wird „ist dieser Code bösartig?“, hat nun eine lautere Frage vor sich, und die beantwortet es mit einer Ablehnung. Der Scanner gibt eine Richtlinienmeldung zurück. Ihre Pipeline protokolliert Analyse nicht verfügbar, so wie sie es ein paar Dutzend Mal pro Woche für Timeouts und übergroße Dateien tut, und der Build wird grün.
Die Technik kostet UNC6780 nichts. Sie verlangt kein Wissen darüber, welches Modell die Datei liest, welcher Anbieter dieses Modell hostet oder was in seinem System-Prompt steht. Sie verlangt dem Leser eine einzige Sache ab: eine Sicherheitsrichtlinie — also genau das, weshalb Sie in einer Assurance-Pipeline überhaupt ein Modell gewählt haben.
Der Rest der Kette macht dasselbe
Hat man den Zug einmal gesehen, liest sich der Rest von UNC6780s Handwerk als Variationen darüber. Jede verbleibende Verteidigung auf dem Weg ist ebenfalls ein Leser, der sich ein Urteil über ein Artefakt bildet, das der Angreifer geschrieben hat — und jede wird gefüttert statt geschlagen.
Das Paket kommt über die Werkzeuge, denen der Agent am meisten traut. GTIG
beschreibt, wie UNC6780 legitime Entwicklerkonten kompromittiert, „um trojanisierte
Forks legitimer MCP-Server im PyPI-Registry zu veröffentlichen, etwa
tiktoken_mcp, und bösartigen Code direkt in offizielle GitHub-Repositories von
Organisationen einzuschleusen, etwa azure-functions-mcp-extension“. MCP-Server
mit Hintertüren zu versehen heißt, dass die Payload über genau jene Klasse von
Abhängigkeiten ankommt, die ein Coding-Agent zu laden und mit Werkzeugen
auszustatten gebaut ist.
Die Herkunftsprüfung bekommt eine gültige Signatur. Wer Attestierungen als Vertrauenssignal behandelt, sollte bei dieser hier innehalten:
DUSTMAKER-Samples enthalten Funktionalität, um zu erkennen, ob sie in einer Umgebung für Continuous Integration und Continuous Delivery (CI/CD) laufen. Ist das bestätigt, extrahieren sie OIDC-Token aus dem Prozessspeicher von GitHub-Actions-Runnern. Mit diesen Token autorisiert sich DUSTMAKER selbst als vertrauenswürdiger Herausgeber und veröffentlicht kompromittierte Paketversionen mit gültigen, kryptografisch signierten SLSA-Build-3- Attestierungen. Pakete, die mit gültigen Token veröffentlicht wurden, bestehen die automatisierten Vertrauensprüfungen von KI-Coding-Agenten.
Die Identität des Herausgebers selbst hat dieses Paket signiert. DUSTMAKER hob die Identität aus dem Prozessspeicher auf dem Runner, auf dem es lebt, sodass ein Prüfer, der die Signatur kontrolliert, gültig zurückgibt — und damit recht hat.
Der Endpoint-Agent bewacht die falsche Nachbarschaft. DUSTMAKER „legt bösartige
Dateien in versteckten Projekt-Workspace-Verzeichnissen für KI-Coding-Assistenten
und integrierte Entwicklungsumgebungen (IDEs) ab oder verändert sie (.claude/,
.vscode/, .cursor/ usw.)“. GTIG sagt auch, warum: Diese Ordner lassen die
Malware „im routinemäßigen Entwickler-Rauschen“ aufgehen und die Orte meiden, die
Endpoint-Erkennung beobachtet, etwa Registry-Schlüssel und /etc/cron.*. Ihr
EDR-Anbieter hat keine Regel für eine neue Datei in .cursor/ ausgeliefert, weil
dieser Ordner bis dieses Jahr Editor-Einstellungen enthielt.
Der Assistent bekommt eine Konfigurationsdatei, und Konfigurationsdateien sind
Anweisungen. Aus eben diesen versteckten Verzeichnissen „nutzt“ DUSTMAKER
„bösartige Konfigurationsdateien …, um den KI-Assistenten anzuweisen, beliebige
Befehle oder Skripte (etwa setup.mjs) bei routinemäßigen Entwicklerinteraktionen
auszuführen. Damit wird das KI-Modell effektiv gezwungen, Befehle im Auftrag des
Angreifers auszuführen, ohne Wissen des Entwicklers“. Der Assistent hat die
Konfiguration seines Workspace gelesen, was seine Aufgabe ist, und die
Konfiguration nannte ein Skript zum Ausführen. In diesem Satz steckt nirgends ein
Exploit.
Und die Audit-API löscht die Audit-Spur. Die Malware tarnt ihre CI-Tasks unter KI-Namen wie „Copilot Setup“ und setzt dann automatisierte API-Aufrufe ab, um Workflow-Ausführungsprotokolle aus der GitHub-Oberfläche zu entfernen.
Alle fünf funktionierten wie entworfen
Sie haben hier keinen Bug zu melden. Der Scanner wandte seine Sicherheitsrichtlinie an, wofür Sie ihn bezahlen. Der Prüfer validierte eine Signatur, die gültig war. Der Assistent lud die Konfiguration seines Workspace, das ist die Funktion. Der Endpoint-Agent beobachtete die Pfade, die wichtig waren, bevor Coding-Agenten Konfigurationsverzeichnisse hatten. Jeder tat seine Arbeit an der Eingabe, die er bekam — und UNC6780 wählte die Eingabe.
Gewöhnliche Umgehung verlangt ein falsches Urteil: das Binary packen, den String zerlegen, die URL kodieren, hoffen, dass die Analyse sauber zurückkommt. DUSTMAKER bekommt, was es will, aus einem richtigen Urteil — oder aus gar keinem.
Jede Verteidigung mit der Form lies das Artefakt, bilde dir eine Meinung liegt in dieser Reichweite. Ein Sprachmodell auf dem Stuhl des Lesers vergrößert die Reichweite, weil ein Modell seine eigene Liste von Dingen mit sich trägt, die es nicht tun wird — und diese Liste ist öffentlich, dokumentiert und für jeden erreichbar, der einen Kommentar tippen kann. Die Branche hat zwei Jahre damit verbracht, Modelle dagegen zu härten, zum Ja überredet zu werden. UNC6780 überredet sie dazu, gar nichts zu sagen.
Stellen Sie den Kontrollen in Ihrer agentischen Pipeline also eine andere Frage: Welche davon müssen vom Angreifer geschriebene Inhalte lesen, um ihre Arbeit zu tun, und was bleibt stehen, wenn Sie die beiseitelegen.
Prüfungen, mit denen sich nicht diskutieren lässt
Bromure Agentic Coding führt jeden Coding-Agenten in einer hardwarevirtualisierten Linux-VM auf Ihrem Mac aus, mit allen Sicherheitskontrollen auf der Host-Seite dieser Grenze. Gegen eine Kette wie diese zählt, was diese Kontrollen als Eingabe nehmen.
Das Altersgatter liest eine Uhr. Der Host-Proxy erkennt Anfragen an die großen Paket-Registries und wendet die Lieferketten-Richtlinie des Workspace an, bevor ein Byte die VM erreicht. Das Altersgatter, die einzige standardmäßig aktive Schicht und auf mindestens zwei Tage eingestellt, lehnt Versionen ab, die jünger sind als der Stichtag. Es schreibt dafür die Versionsliste des Registry um, sodass eine zu frische Version aus Sicht des Agenten noch nicht existiert; ein gepinnter direkter Abruf kommt als HTTP 451 zurück, dessen Body das echte Alter des Pakets nennt. Das Paket selbst wird nie gelesen. Ein Kommentarblock, der ein Sprachmodell entgleisen lassen soll, verschiebt keinen Veröffentlichungszeitstempel, und UNC6780s trojanisierte Forks sind konstruktionsbedingt frische Veröffentlichungen. npm, PyPI, Cargo, RubyGems und Packagist führen alle Veröffentlichungszeiten pro Version, also deckt das Gatter sie ab.
Ein Klassifikator hat keine Richtlinie, auf die er sich berufen könnte.
Bromures Quellcode-Detektor bewertet die tool_result-Abschnitte, die der Agent an
das Modell zurückstreamt — Dateiinhalte, Webseiten und Kommandoausgaben — mit einem
lokalen PromptGuard-Modell der DeBERTa-Familie, das als ONNX auf Ihrem Mac läuft.
Es ist ein Sequenzklassifikator, kein generatives Modell. Reicht man ihm
DUSTMAKERs Kommentarblock, verfasst er keine Antwort, wägt keine Frage ab, ob
Antworten erlaubt ist, und lehnt nichts ab. Er gibt eine Zahl zwischen null und
eins aus, und Text, der mit einer gefälschten System-Übersteuerung samt
ausgesetzter Sicherheitsrichtlinien beginnt, ist genau die Form, die diese Zahl
hochtreibt. Pro Workspace wählen Sie, was ein Treffer bewirkt: protokollieren,
nachfragen oder blockieren. Ein Block gibt 451 zurück, und das Modell sieht den
Inhalt nie.
Etwas anderes als der Agent liest die Workspace-Konfiguration. Eine Datei in
.claude/, die dem Assistenten sagt, er solle setup.mjs ausführen, ist die
Rules-File-Hintertür, und sie hat ihren eigenen Detektor: ein deterministischer
Heuristik-Durchlauf für verstecktes Unicode, Meta-Anweisungsmuster,
Zugangsdaten-Pfade und Curl-in-die-Shell-Konstruktionen, dazu ein feinjustierter
ModernBERT-Klassifikator für die bösartigen Anweisungen, die auf kein festes Muster
passen. Beide laufen im Proxy, auf dem Gerät, über die aus dem System-Prompt
herausgelösten Anweisungsdateien — dort, wo nichts in der VM sie abschalten kann.
Beide sind Schalter pro Workspace, und jeder will beim ersten Einschalten einen
Modell-Download. Dieser Download sind die fünf Minuten, um die diese Geschichte
Sie bittet.
Ein Zugangsdaten-Dieb braucht Zugangsdaten. DUSTMAKER existiert, um
Geheimnisse aus Entwicklerumgebungen zu ernten, und ein Bromure-Workspace enthält
keine. Bromure ersetzt jedes Zugangsdatum, das Sie konfigurieren, durch eine
strukturerhaltende Fälschung, abgeleitet aus dem echten Wert und einem Salt pro
Installation: sk-ant-api03-brm-…, ein ghp_-Token der richtigen Länge,
brm-mcp_…, brm-k8s-…. Diese Fälschungen wandern in die Umgebungsvariablen und
in ~/.git-credentials, ~/.docker/config.json, ~/.kube/config und
~/.aws/config — also genau die Liste, die ein Dieb durchgeht. Ihre echten Werte
bleiben verschlüsselt auf dem Mac, und der Host-Proxy tauscht sie auf der Leitung
ein, begrenzt auf den Zielhost, für den jedes geprägt wurde. Die Bytes privater
SSH-Schlüssel betreten die VM nie; nur Signaturen überqueren die Grenze. Kein
Schalter regelt irgendetwas davon, weil der Proxy die einzige Route der VM ins Netz
ist.
Die Fälschungen sind zugleich Stolperdrähte. Ein gefälschtes Token hat genau ein legitimes Ziel. Der Proxy durchsucht jede ausgehende Anfrage, Header und Body, nach einer Fälschung, die woandershin unterwegs ist. Bei einem Treffer lehnt er die Anfrage ab, ohne ein Byte weiterzuleiten, pausiert die VM auf der Stelle und trägt eine rote Credential brokering-Zeile in die Security Timeline ein. Er markiert den Workspace als kompromittiert, und der nächste Start zwingt Sie, zuerst Festplatte und Home-Image zu löschen. Sie rotieren danach nichts, weil der Dieb einen Platzhalter in der Hand hatte und der Platzhalter nie hinausgelangt ist.
Die Aufzeichnung liegt auf Ihrer Maschine, außer Reichweite der API, die die
Malware aufruft. Mit Tracing auf Activity only schreibt der Proxy eine
Metadatenzeile pro Anfrage, die die VM verlässt, ohne Bodies.
bromure-cli trace hostnames gibt jeden einzelnen Host aus, den der Workspace
kontaktiert hat, mit Zählern, und bromure-cli trace leaks nennt das Ziel nach
einem Kompromittierungsalarm. Ein Angreifer mit einem GitHub-Token leert eine
Workflow-Historie in ein paar API-Aufrufen. Diese Spur zu leeren hieße, an Ihren
Mac zu kommen.
Zwei Einstellungen, heute Nachmittag
Öffnen Sie den Supply Chain-Bereich des Workspace und bestätigen Sie, dass das Altersgatter mit einem Stichtag aktiv ist, mit dem Sie leben können. Zwei Tage sind der Standard, und es ist die billigste Kontrolle, die Sie gegen einen frisch veröffentlichten trojanisierten Fork haben. Öffnen Sie dann Prompt Injection und aktivieren Sie beide Detektoren; jeder lädt sein Modell einmal herunter, danach ist das Scannen lokal und kostenlos.
Eine Regel, die die Frage verkleinert
Setzen Sie in Guardrails Unmatched traffic auf Deny und listen Sie
auf, was der Job braucht: allow web api.github.com,
allow web registry.npmjs.org, default deny. Ein Dieb, der seinen
Command-Server nicht erreicht, ist eine Datei auf einer Platte, die Sie gleich
wegwerfen — und Speichern schiebt die Regel ohne Neustart in laufende
Sitzungen.
Abwesenheit schlägt Bewertung
Wir kommen immer wieder aus verschiedenen Richtungen am selben Punkt an. Ein Egress-Proxy, der einem Namen vertraute, den der Agent schreiben konnte. Ein Kommando-Wächter, der bash anders las als bash. Ein KI-Gateway, dessen fehlgeschlagene Schlüsselprüfung auf ein leeres Auth-Objekt durchfiel. In jedem Fall tat eine Komponente ehrlich ihre Arbeit, etwas zu bewerten, und die Bewertung ging kaputt.
DUSTMAKER schärft das Argument, denn es verlangt überhaupt keine kaputte Bewertung. Es verlangt, dass eine Bewertung über Inhalte stattfindet, die UNC6780 geschrieben hat. Geben Sie einem Leser eine Datei, und der Leser bildet sich eine Ansicht darüber; wer die Datei geliefert hat, entscheidet den Rest.
Bewertung ist ein schwächeres Primitiv als Abwesenheit, und wir übergeben der Bewertung ständig die Arbeit, die Abwesenheit umsonst erledigt. Mit einem Veröffentlichungszeitstempel lässt sich nicht diskutieren, und eine Wahrscheinlichkeit hat keine Bereitschaft, sich zurückzuziehen. Ein Zugangsdaten-Dieb, der mit vollen Rechten in einer wegwerfbaren VM läuft und jede Konfigurationsdatei durchgeht, die er kennt, kommt mit einer Handvoll Platzhalter heraus und mit einem Socket, um den er nicht herumkommt.
Ein Modell in Ihre Review-Pipeline zu setzen war die richtige Entscheidung. Sorgen Sie dafür, dass die Kontrollen, die Dinge stoppen, jene sind, mit denen nichts im Repository sprechen kann. Installieren Sie Bromure Agentic Coding und geben Sie Ihrem Agenten Prüfungen, die die Datei des Angreifers nie lesen müssen.