Berechtigungsschein: npm-Paket verbirgt Cloud- und Systembedrohungen

Berechtigungsschein: Eine npm-„Autorisierte Forschung“-Targeting-Geschichte, die Cloud-Metadaten-Sonden und SYSTEM-Persistenz verbirgt

TL; DR

Zwischen dem 15.06.2026 und dem 16.06.2026 hat ein einzelner npm-Publisher … sechs Pakete – insgesamt 26 Versionen — die bei jedem Installationsvorgang ein Installationsskript ausführen npm installJedes Paket enthält eine README-Datei, in der es als „harmloses“ HackerOne / GitHub Bug Bounty-Forschungsartefakt deklariert wird, das „niemals“ Anmeldeinformationen verändert und „keine Persistenz“ vornimmt. Der Code stimmt nicht mit dem Haftungsausschluss überein. Auf Linux-CI-Runnern erstellt der Installations-Hook einen Fingerabdruck der Umgebung und prüft einen Metadaten-Endpunkt einer Cloud-Instanz; unter Windows fordert er erhöhte Rechte an und wird als SYSTEMund öffnet einen Befehlskanal zu einem externen Host. Der einzige Indikator, nach dem man jetzt suchen sollte, ist der C2-Host. 173.255.233[.]239Schweregrad: HighsBetroffenes Ökosystem: npm. Namen verschmelzen mit dem Rauschen der Abhängigkeiten bei kontinuierlicher Integration (metrics-pipeline-d8k2, event-metrics-q3x7, pkg-telemetry-r4f9(und drei Geschwister).

Der Angriff: Wie er funktioniert

Alle Pakete im Cluster werden auf die gleiche Weise erstellt. paket.json Verdrahtet denselben Befehl in zwei Lebenszyklen hooks:

{   "scripts": {     "preinstall": "node run.js",     "postinstall": "node run.js"   } }

Läuft auf beiden Vorinstallation und Nachinstallation bedeutet, dass die Nutzlast unabhängig davon ausgelöst wird, ob spätere Installationsschritte fehlschlagen oder nicht. run.js Es handelt sich selbst um einen zehnzeiligen Plattformdisponenten:

// Platform dispatcher — runs beaconNN.js on Windows, beacon_linux.js on Linux. // GitHub Bug Bounty authorized research. Contact: nicholas@curran.tech 'use strict'; const { execFileSync } = require('child_process'); const path = require('path'); const node = process.execPath; const script = process.platform === 'win32'   ? path.join(__dirname, 'beacon34.js')   : path.join(__dirname, 'beacon_linux.js'); try { execFileSync(node, [script], { stdio: 'inherit', timeout: 90000 }); } catch (e) {}

Das Verhalten variiert dann je nach Betriebssystem. Alle sechs Pakete enthalten die gleichen zwei Bestandteile – run.js Die Plattform-Beacons dienen also als austauschbare Dropper und nicht als sechs verschiedene Tools. Der einzige wesentliche Unterschied liegt im Veröffentlichungsrhythmus: Vier Versionen wurden einmalig veröffentlicht, während zwei über Stunden alle 30–60 Minuten neu freigegeben wurden. Dadurch steht Installern und Resolvern stets eine aktuelle Version zur Verfügung, selbst wenn ältere Versionen entfernt werden.

Unter Linux (beacon_linux.jsDas Skript erstellt Profile, in denen es ausgeführt wird. Es listet die Namen von Umgebungsvariablen auf und liest Dateien unter / proc, prüft auf docker.sockund läuft hostname und whoamiAnschließend wird eine HTTP-Anfrage an den AWS-Containerinstanz-Metadatenendpunkt gesendet. 169.254.170[.]2 — die Link-Local-Adresse, die ein ECS-Task abfragt, um seine eigene Konfiguration und kurzlebige Rollenanmeldeinformationen (IMDS, der Instanzmetadatendienst) zu erhalten. Die Ergebnisse werden per POST an den Collector der Kampagne gesendet. 173.255.233[.]239.

Unter Windows (beacon34.js / beacon18.jsDas Paket leistet deutlich mehr als nur die Profilerstellung für seinen Host. Der markierte Code fügt einen Registrierungsschlüssel unter dem MS-Einstellungen Handler mit einem DelegateExecute Wert – eine bekannte Umgehung der Benutzerkontensteuerung, die es einem gestarteten Prozess ermöglicht, ohne Aufforderung mit erhöhten Rechten ausgeführt zu werden. Es ruft PowerShell mit folgendem Befehl auf: -ExecutionPolicy Bypass und Aufruf-Ausdruck, wird ausgeführt in NT-AUTORITÄT\SYSTEM Der Windows-Befehlskanal läuft über einen Kontext und fragt einen externen Host nach Befehlen ab. Cloudflare-Tunnel, diameter-coins-limitations-parents.trycloudflare[.]com:443zurückfallen auf 173.255.233[.]239:443unter Verwendung von drei Endpunkten: /c2/poll einen Befehl abrufen, /c2/out um eine Ausgabe zurückzugeben /c2/eof schließen.

Neu ist hier: der Haftungsausschluss als Tarnung

Das Neue ist nicht die eigentliche Nutzlast – die Aufklärung über Installations-Hooks und die Windows-Rechteerweiterung sind beide gut dokumentiert. Es ist die Tarnung. Jedes Paket enthält eine README-Datei, die sich wie ein Dokument zur verantwortungsvollen Offenlegung liest:

# @ncurran/sandbox-recon-880538 — authorized npm-sandbox security research

This is a gutartig Das Paket wurde im Rahmen eines Projekts unter dem Benutzerkonto `@ncurran` des Autors veröffentlicht. Autorisierte Teilnahme am HackerOne / GitHub Bug Bounty-Programm (npm ist Teil des Programms).

Bei der Installation wird Folgendes überprüft: seine eigene Ausführungsumgebung … Umgebungsvariable

Nur Schlüsselnamen … prüft, ob bekannt Cloud-Metadaten-Endpunkte Diese erreichbar … Es meldet nur Statuscodes, Antwortlängen und Hashes — niemals Es werden weder Anmeldeinformationen, Tokenwerte noch Daten von Drittanbietern verarbeitet. Es führt keine Operationen durch. Beharrlichkeit, keine seitliche Bewegung und keine destruktive Wirkung.

Drei Behauptungen in diesem Text werden durch den ausgelieferten Code widerlegt. Die README-Datei gibt „keine Persistenz“ an, aber der Windows-Beacon schreibt einen Registrierungsschlüssel mit erhöhten Rechten. Es heißt „niemals Anmeldeinformationen oder Tokenwerte“, aber der Windows-Pfad führt beliebige abgerufene Befehle aus. SYSTEM, das keine solche Beschränkung für das, was gelesen oder zurückgegeben wird, vorsieht. Es nennt sogar ein Paket – @ncurran/sandbox-recon-880538 Das ist nicht die Version, in der das Paket ausgeliefert wird. Das deutet darauf hin, dass die README-Datei eine wiederverwendete Vorlage ist und nicht die eigentliche Software beschreibt. Ein Einwilligungshinweis in einem Paket, dessen Installation das Opfer nie zugestimmt hat, stellt keine Einwilligung dar. Die Einstufung ist hier unabhängig vom Wortlaut schädlich. Der Hinweis hat auch ein subtileres Ziel: Ein automatisierter Prüfschritt, der den Pakettext nach beruhigenden Hinweisen durchsucht – „harmlos“, „autorisiert“, ein namentlich genannter Programmname, eine Kontakt-E-Mail-Adresse –, kann durch Formulierungen, die dem Inhalt widersprechen, zu einem positiven Ergebnis verleitet werden. Die Lehre daraus gilt für menschliche und maschinelle Prüfer gleichermaßen: Bewerten Sie das Verhalten bei der Installation, nicht die Selbstbeschreibung in der README-Datei.

Geschichte

Alle Pakete erschienen innerhalb eines 24-Stunden-Fensters. Die vier Einzelversionen wurden zuerst veröffentlicht, gefolgt von zwei Paketen, die alle 30–60 Minuten neu aufgelegt wurden.

Datum (UTC) Event
2026-06-15 18:32 Erstes Paket veröffentlicht — npm:pkg-telemetry-r4f9@1.0.0
2026-06-15 19:50 npm:runtime-metrics-w7k2@1.0.0 veröffentlicht
2026-06-15 20:14 npm:build-tracker-n5p1@1.0.0 veröffentlicht
2026-06-15 20:35 npm:npm-sandbox-ping-r9t2@1.0.0 veröffentlicht
2026-06-15 21:09–22:42 npm:event-metrics-q3x7 veröffentlicht 1.0.0 → 1.0.8 (9 Versionen)
2026-06-15 23:40 → 2026-06-16 04:40 npm:metrics-pipeline-d8k2 veröffentlicht 1.0.0 → 1.0.10 (11 Versionen)
2026-06-16 Cluster identifiziert und als schädlich eingestuft; mehrere Tarballs liefern bereits einen 404-Fehler bei der Registry (laufend).

Die Kampagne ist noch jung und die Bekämpfung läuft noch: Zum Zeitpunkt der Analyse funktionierten einige Versionen in der Registry, andere nicht. Gehen Sie davon aus, dass alle 26 Versionen kompromittiert sind.

Kompromissindikatoren

Pakete

Ökosystem Verpackung Versionen Status
npm metrics-pipeline-d8k2 1.0.0 – 1.0.10 böswilligen
npm event-metrics-q3x7 1.0.0 – 1.0.8 böswilligen
npm runtime-metrics-w7k2 1.0.0 böswilligen
npm build-tracker-n5p1 1.0.0 böswilligen
npm npm-sandbox-ping-r9t2 1.0.0 böswilligen
npm pkg-telemetry-r4f9 1.0.0 böswilligen

Netzwerk

Typ Indikator Notizen
IP 173.255.233[.]239 C2-Kollektor; Linux-Recon-POST und Windows-Fallback :443
Domain diameter-coins-limitations-parents.trycloudflare[.]com Windows-Befehlskanal über einen Cloudflare-Tunnel, :443
URI-Pfad /c2/poll, /c2/out, /c2/eof Windows-Befehlsabfrage / -ausgabe / schließen
IP 169.254.170[.]2 Der AWS ECS-Instanzmetadaten-Endpunkt wurde vom Installations-Hook aus abgefragt.

Verhaltens-

Signal Beschreibung
Installieren hooks preinstall und postinstall beide laufen node run.js
Bahnsteigabfertigung run.js läuft beacon_linux.js unter Linux, beacon34.js / beacon18.js unter Windows
Linux-Recon Listet die Namen der Umgebungsvariablenschlüssel auf, liest sie /proc, Schecks docker.sockläuft hostname / whoami, Sonden IMDS
Fensterhöhe ms-settings DelegateExecute UAC-Umgehung der Registry; PowerShell -ExecutionPolicy Bypass + Invoke-Expression; läuft als SYSTEM
Verschleiern Die README-Datei behauptet, es handele sich um „gutartige“, „autorisierte“ Forschung und „keine Persistenz“; sie verweist auf einen Paketnamen, der nicht geliefert wird.

Attribution und beobachtetes Verhalten

Wir beschreiben den Herausgeber ausschließlich anhand seiner Signale und geben keine Auskunft über die Identität der Person hinter dem Account.

  • Signalkatalog. Alle sechs Pakete wurden vom selben npm-Konto veröffentlicht. npmresearch8847, mit der angegebenen E-Mail npmresearch8847@web-library.net (E-Mail und SCM Beide Verifizierungen fehlen; wir haben die Eigentumsverhältnisse nicht überprüft). Die READMEs werden unter einem @ncurran Umfang und Kontaktangaben nicholas@curran.tech und run.js verweist auf das Repository github.com/ncurran/npm-sandbox-research`. Die sechs Pakete teilen sich eine identische run.js Disponent, ein üblicher beacon_linux.js Aufklärungsphase und der einzelne Sammler-Host 173.255.233[.]239`. Das Benennungsschema ist konsistent: ein generischer CI-klingender Stamm (Metriken, Telemetrie, Build-Tracker, sandbox-ping) plus ein kurzes, zufälliges Suffix.
  • Vertrauen. Die sechs Pakete scheinen aufgrund des gemeinsamen Dispatchers, der Aufklärungsphase und des C2-Hosts Teil einer einzigen Kampagne zu sein. Die Darstellung als „autorisierte Forschung“ ist in allen sechs README-Dateien einheitlich. Wir konnten nicht bestätigen, dass diese Aktivität durch ein Bug-Bounty-Programm autorisiert wurde, und die Angaben im Haftungsausschluss stimmen nicht mit dem ausgelieferten Code überein.
  • Beobachtete Leistungsfähigkeit. Die Nutzlastausführercises vier Fähigkeitsklassen: Installations-Hook-Codeausführung auf beiden Vorinstallation und Nachinstallation; Erkundung des Hosts und der CI-Umgebung mit ausgehenden Daten an einen externen Collector; Prüfung der Erreichbarkeit von Cloud-Instanz-Metadaten aus dem Installationskontext; und unter Windows lokale Rechteausweitung, Ausführung als SYSTEMund einer Befehlsschleife, die Befehle über einen externen Kanal abruft und ausführt. Die Windows-Befehlsschleife ist eine Fernsteuerungsfunktion: Sie fragt Befehle ab und gibt deren Ausgabe zurück.

Auswirkungen

Die Gefährdung ist in automatisierten Build-Umgebungen am höchsten. Ein `npm install` in einer CI-Umgebung führt den Lebenszyklus aus. hooks mit der jeweiligen Identität des Runners; bei einem Cloud-Runner umfasst diese Identität häufig einen erreichbaren Metadaten-Endpunkt und eine Rollenberechtigung. Die Adresse der Linux-Beacon-Probes, 169.254.170[.]2Der AWS ECS-Task-Metadaten-Endpunkt ermöglicht es Tasks, ihre temporären Anmeldeinformationen über denselben Link-Local-Service abzurufen. Eine Erreichbarkeitsprüfung innerhalb eines Installationsskripts ist der Schritt vor dem Abrufen dieser Anmeldeinformationen. Daher sollte jeder Runner, der den Hook ausgeführt und den Endpunkt erreicht hat, so behandelt werden, als ob seine Taskrolle offengelegt worden wäre. Auf einem Windows-Entwicklungs- oder Build-Host fordert die Payload erhöhte Berechtigungen an und öffnet einen Befehlskanal. Dadurch wird die Offenlegung von einem einzelnen Profil und ausgehendem Zugriff auf interaktive Fernsteuerung erweitert.

Da wir vor der Entfernung der schädlichen Versionen keine verlässlichen Downloadzahlen ermitteln konnten, können wir die Anzahl der Betroffenen nicht schätzen. Die rasche Neuveröffentlichung zweier Pakete – elf bzw. neun Versionen innerhalb weniger Stunden – sorgte dafür, dass Installationsprogramme und Resolver stets über neue Versionen verfügten, während ältere Versionen entfernt wurden.

Neue Muster

Dieser Cluster ist ein Beispiel dafür, wie ein Label als Deckmantel missbraucht wird. Bezeichnungen wie „Autorisierte Forschung“, „Bug-Bounty“ und „Sandbox-Testing“ werden zunehmend für Pakete verwendet, deren Installationsskripte mehr tun, als nur ein Host-Profil zu erstellen. Diese Vorgehensweise nutzt die Zurückhaltung von Prüfern aus, gegen etwas vorzugehen, das sich als genehmigt ausgibt. Hinzu kommt eine zweite bekannte Taktik: Paketnamen, die internen CI-Tools ähneln, um bei einem flüchtigen Blick auf die Abhängigkeitsstruktur unbemerkt zu bleiben. Diese Kombination macht das Muster beobachtenswert: Ein Name, der nach Infrastruktur klingt, verpackt in eine Beschreibung, die einen genehmigten Test vortäuscht, und als Deckmantel für einen Installations-Hook, der auf einem Betriebssystem eskaliert und auf dem anderen Cloud-Zugangsdaten abfragt. Weder der Haftungsausschluss noch der unauffällige Name ändern etwas an der Funktion des Codes bei der Installation, und ein Triage-Prozess, der eines von beiden als mildernde Umstände wertet, wird zu einem falschen Urteil führen.

Was Verteidiger tun sollten

  • Durchsuchen Sie Sperrdateien und Installationsprotokolle nach den sechs Paketnamen; behandeln Sie jede Übereinstimmung als Vorfall und nicht als Warnung.
  • Ausgehenden Datenverkehr blockieren und Warnung ausgeben 173.255.233[.]239 und *.trycloudflare[.]com Hosts erstellen Infrastruktur.
  • Suche nach HTTP-Anfragen zur Installationszeit an Instanz-Metadatenadressen (169.254.170.2, 169.254.169.254) stammend von Paketmanagern in CI.
  • Alle Cloud-Rollen-Anmeldeinformationen und Tokens, die von einem Runner aus erreichbar waren, der eine betroffene Version installiert hat, müssen rotiert werden.
  • Audits Vorinstallation/Nachinstallation Skripte in Ihrem AbhängigkeitssatzEin Lifecycle-Hook, der eine zweite Skriptdatei ausführt, ist lesenswert.
  • Suchen Sie auf Windows-Endpunkten nach neuen DelegateExecute Werte, die unter dem MS-Einstellungen shell-handler key — das Elevation-Primitiv, das diese Payload verwendet, und ein zuverlässiges Signal, das unabhängig vom Paketnamen ist.
  • Sperrdateien anheften und überprüfen sowie Installationsskripte deaktivieren (npm install --ignore-scripts) in CI, wo Ihr Build sie nicht benötigt.
  • „Autorisierte Forschung“ oder „harmlose“ Haftungsausschlüsse innerhalb eines Installationsskripts sollten als nicht vertrauenswürdiger Text betrachtet werden und nicht als Grund, das Skript zuzulassen.

Ein Paket, das in Prosa gute Absichten verkündet und Bitten enthält SYSTEM Code sollte anhand des Codes beurteilt werden.

SCA-Tools-Software-Zusammensetzungs-Analyse-Tools
Priorisieren, beheben und sichern Sie Ihre Softwarerisiken
Sichern Sie sich Ihr kostenloses Konto.
Keine Kreditkarte erforderlich.

Sichern Sie Ihre Softwareentwicklung und -bereitstellung

mit der Xygeni-Produktsuite