TL, д-р
Один-единственный издатель npm, deadcode09284814развернул кампанию по использованию Typosquat против законных пользователей. axios и chalk-template посылки с середины мая 2026 года.
Кампания началась как обычная кража учетных данных и электронных кошельков с целью похищения данных. Туннель HTTPS Serveo.
On 2026-05-17, где axois-utils:1.0.9Оператор полностью заменил полезную нагрузку: та же самая структура тройного хука установки, тот же издатель, то же имя пакета.
Но теперь скрипт установки представляет собой кроссплатформенный ботнет для DDoS-атак.
Полезная нагрузка говорит о localhost.run Он создает туннель и принимает команды флуда, превращая зараженные среды в часть ботнета, способного совершать DDoS-атаки.
Оператор даже отправил исполняемый файл сервера C2 Внутри архива tarball наблюдается явная эскалация от кражи учетных данных к активной ботнет-инфраструктуре.
Два пакета, четыре версии которых все еще активны в реестре, и один оператор, который сейчас запускает оба модуля параллельно.
Степень тяжести: высокая.
Атака: как она работает
Кампания построена на намеренно скучной схеме доставки: два названия пакетов, написанные с опечаткой, на одну букву отличающиеся от названий пакетов с сотнями миллионов еженедельных загрузок.Вардар, меловой шаблон), и тройная установка hooks которые гарантируют выполнение. Интересно то, что представляет собой каркас. осуществляет — и тот факт, что оператор изменил груз, не изменив ничего другого.
Общий каркас
В каждой опубликованной версии обоих пакетов указан один и тот же трехэтапный жизненный цикл. hooks in пакет.json:
Перечисление полезной нагрузки по всем трем параметрам. hooks это перебор — послеустановка В одиночку будет работать по умолчанию. Установка npmВыбор имеет значение: npm install –ignore-scripts пропускает скрипты, но поддерживает несколько распространенных рабочих процессов (восстановление кэша CI, которое повторно запускает жизненный цикл). hooks выборочно, или разработчики, которые проводят только аудит. послеустановка) сделать тройное избыточное заявление — это самый безопасный вариант для нападающего.
меловой шаблон добавляет второй механизм: он объявляет axois-utils:^1.0.7 в качестве среды выполнения зависимостьУстановка опечатки меловой шаблон Таким образом, он также включает в себя соседний пакет typosquat, и оба пакета выполняются. Эти два пакета представляют собой скоординированную пару, а не независимые элементы.
Этап А — кража учетных данных/кошелька (15.05.2026 → настоящее время)
Фаза А — это исходная полезная нагрузка. Загрузчик представляет собой короткий postinstall.js который указывает на обратный туннель HTTPS от Serveo:
Поддомен Serveo кодирует целевой IP-адрес (80.200.28.28) непосредственно в имени хоста — это общепринятая практика для данной службы. Оператор меняет случайный префикс поддомена между версиями, чтобы обойти наивные списки блокировки доменов, но базовый IP-адрес никогда не меняется.chalk-tempalte:1.0.14 использовал 8a3e818ea8f11186-80-200-28-28…; 1.0.16 / 1.0.19 / 1.0.20 использовать f04a273bd84c0622-….)
postinstall.js руки прочь phantom.js, модуль-«коллектор», состоящий из 7,667 строк. phantom.js выводит хозяина на прогулку для:
Закрытые ключи SSH (~/.ssh/*) |
.npmrc содержимое и любые npm_* токены окружения |
| Файлы учетных данных AWS, GCP и Azure |
GitHub personal-access-token regex (ghp_*, gho_*, ghu_*, ghs_*) |
| Инструменты для создания криптокошельков Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash. |
Рекурсивный .env* прохождение ~/projects, ~/dev, ~/code, ~/workspaceи текущий рабочий каталог установки |
История компании Shell и полная информация process.env |
Пакет данных отправляется методом POST в туннель Serveo по адресу / собиратьЗдесь нет обфускации, нет логики, препятствующей работе виртуальных машин, нет подготовки — оператор делает ставку на объем и скорость.
Этап B — Привлечение DDoS-атак с помощью PhantomBot (17.05.2026, только для axois-utils:1.0.9)
На этапе B файлы phantom.js и postinstall.js заменяются одним файлом с именем distrobe.js (опечатка в операторе). Структура тройного хука в package.json остается неизменной; пакет сохраняет то же имя, область видимости и схему обновления версии. С виду axois-utils:1.0.9 выглядит как незначительное продолжение 1.0.6. Внутри же это другое семейство вредоносных программ.
distube.js Открывается блок конфигурации, в котором указывается фирменный стиль оператора:
// axois-utils-1.0.9/distrube.js:11-15 |
// Use your localhost.run HTTPS URL (the tunnel handles HTTP internally) |
const C2_HOST = 'b94b6bcfa27554.lhr.life'; // Your localhost.run tunnel |
const C2_PORT = 443; // HTTPS port - tunnel handles SSL |
const BOT_ID = `${os.hostname()}_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`; |
Комментарии адресованы будущему оператору, запускающему этот набор инструментов («Используйте свой URL-адрес localhost.run по протоколу HTTPS»). Это, а также то, что поставляется вместе с клиентским приложением бота, указывает на то, что это не просто полезная нагрузка для жертвы — это и есть сам набор инструментов.
Поток:
- Настойчивость Сначала запускается скрипт. Скрипт устанавливается тремя разными способами в зависимости от операционной системы (через реестр). Run + Папка автозагрузки + Schtasks в Windows; crontab + phantom-bot.service systemd unit + .bashrc/.zshrc добавить + /etc/rc.local на Linux; LaunchAgent com.phantom.bot.plist (в macOS). Имя службы постоянного хранения и метка LaunchAgent — это одновременно и имя службы постоянного хранения, и метка LaunchAgent. фантом-бот / com.phantom.botИменно отсюда и происходит название кампании.
- Извлечение системной информации Запускается один раз — одноразовая POST-запрос с отпечатком пальца на адрес b94b6bcfa27554.lhr.life:443/collect, содержащий имя хоста, платформу, архитектуру, имя пользователя, процессор/ОЗУ, сетевые интерфейсы, process.env, текущий рабочий каталог, домашний каталог, версию Node и публичный IP-адрес. Это гораздо менее агрессивный подход, чем на этапе A: нет SSH, нет кошельков, нет рекурсии в .env. Задача бота — зарегистрировать, а не украсть.
- Цикл сердцебиения Открывается HTTPS POST-запрос каждые 30 секунд к адресу b94b6bcfa27554.lhr.life:443/. User-Agent — PhantomBot/1.0. Проверка TLS явно отключена (rejectUnauthorized: false). Ответ C2 анализируется как JSON в формате {type, target, port, duration, threads, method} и отправляется.
- Арсенал противопаводковых средств подключен к шести командам:
| Тип команды | Модули | Заметки |
|---|---|---|
| пинг | Ответ Liveness | Бот идентифицирует себя |
| HTTP | HTTP-флуд | Поток запросов уровня 7 |
| протокол HTTPS | HTTPS-флуд | Аналогично HTTP, обернуто в TLS. |
| TCP | TCP флуд | 65 КБ случайной полезной нагрузки спама |
| UDP | UDP флуд | UDP-пакеты размером 65 507 байт |
| быстро | HTTP/2 быстрая перезагрузка DoS | Техника 2023 CVE-2023-44487 |
Все пять модулей защиты от наводнений имеют значение. цель, порт, продолжительность и темы Аргумент — бот представляет собой обычный наёмный флуд-агрегатор, не нацеленный на какую-либо конкретную жертву. Список жертв оператора хранится на C2, а не в самом пакете.
Что нового — поставляемый бинарный файл C2.
Фаза А имеет знакомую форму: кража учетных данных, установка системы, туннелирование C2 через поставщика. Фаза B — это причислены Знакомая форма — ботнеты для DDoS-атак уже много лет являются неотъемлемой частью вредоносных пакетов npm. Необычно то, что оператор выпустил этот пакет. серверная сторона из комплекта, находящегося внутри архива npm:
- c2 — скомпилированный исполняемый файл Go ELF размером 4 мегабайта
- c2.go — Исходный код на языке Go, состоящий из 426 строк, для этого бинарного файла.
Ни один из этих файлов не вызывается никаким хуком установки. Они не являются частью полезной нагрузки жертвы. Они находятся в каталоге пакета так же, как и файл документации. Наиболее правдоподобное объяснение заключается в том, что оператор загрузил свою рабочую ветку разработки в npm, не проверив список файлов — настоящая ошибка в области операционной безопасности — и в результате был отправлен полный двусторонний комплект: клиент, который запускает жертва, и сервер, который запускает оператор.
Именно эта часть истории оправдывает концепцию «готового к использованию ботнет-комплекта». Любой, кто скачал его, может это сделать. axois-utils:1.0.9 Перед удалением у них есть не только образец жертвы, но и работающий сервер управления и контроля.
Поворотный момент, в одном предложении
Тот же издатель, те же названия пакетов, та же структура с тремя крючками, тот же «фантомный» брендинг — но Модель монетизации полезной нагрузки изменилась в одночасье.от «секретов сбора урожая, которые я могу перепродать» до «возможностей для сдачи в аренду». Тактика, тактика и методы, которые должны отслеживать защитники на этапе установки, практически идентичны на обоих этапах; защита на основе сигнатур, привязанная к цепочкам транзакций кошелька на этапе А или к phantom.jsСборщик данных, состоящий из 7,667 строк, полностью пропустил бы фазу B.
| Дата (UTC) | События |
|---|---|
| 2026-05-15 | Первая публикация: axois-utils:1.0.4 (Тестовая сборка по локальной сети, рабочая станция для разработчиков находится по адресу 192.168.129.19) |
| 2026-05-15 | axois-utils:1.0.6 опубликовано — Фаза A C2 заменена на 80.200.28.28 через туннель Serveo; комментарий источника // Change to '80.200.28.28' for public подтверждает замену среды разработки на производственную. |
| 2026-05-16 | chalk-tempalte:1.0.14 и 1.0.16 опубликовано — погрузчик с цепной передачей заявляет axois-utils:^1.0.7 в качестве зависимости во время выполнения; поддомен Serveo был повернут. |
| 2026-05-16 | Кампания фазы А обнаружена в ходе планового сканирования npm; подтверждены вредоносные действия. |
| 2026-05-17 | axois-utils:1.0.9 опубликовано — изменение структуры полезной нагрузки: привлечение DDoS-атак PhantomBot через туннель localhost.run; на стороне оператора c2 двоичный и c2.go исходный код поставляется в архиве tarball. |
| 2026-05-17 | chalk-tempalte:1.0.19 и 1.0.20 Опубликовано — по-прежнему фаза А (похититель); оператор теперь запускает оба модуля параллельно. |
| 2026-05-17 | Обнаружение фазы B в ходе стандартного сканирования; выводы были применены ко всем образцам. 2026-05-17 версии |
| (В настоящее время) | Отчеты об удалении ожидают обработки; все четыре опубликованных пакета остаются доступными в реестре на момент написания статьи. |
Показатели компромисса
Packages
| Экосистема | Упаковка | Версии |
|---|---|---|
| НПМ | axois-utils (typosquat of xios) | 1.0.4, 1.0.6, 1.0.9 |
| НПМ | chalk-tempalte (типоскват мелового шаблона) | 1.0.14, 1.0.16, 1.0.19, 1.0.20 |
личность автора
| Поиск | Значение |
|---|---|
| издатель npm | deadcode09284814 |
| Электронное письмо издателя | phantomdeadcode@tutamail.com |
| SCM проверка | нет |
Командование и контроль
| Фаза | Конечная точка | Транспорт |
|---|---|---|
| A | f04a273bd84c0622-80-200-28-28.serveousercontent.com:443/collect | Туннель HTTPS Serveo |
| A | 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect | Туннель Serveo HTTPS (более ранняя версия) |
| A | 80.200.28.28:443/collect | Базовая конечная точка VPS |
| B | b94b6bcfa27554.lhr.life:443/ | localhost.run HTTPS обратный туннель |
Хеш-функции файлов (SHA-256)
| Файл | SHA-256 | Заметки |
|---|---|---|
c2 (Go ELF, 4 МБ) | 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 | Сервер управления и контроля на стороне оператора, поставляемый в комплекте с оборудованием. axois-utils:1.0.9 |
c2.go (426 строк) | 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 | Исходный код Go для бинарного файла C2 |
distrube.js | 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 | Клиент бота фазы B |
phantom.js (chalk-tempalte:1.0.19) | 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 | Сборщик учетных данных/кошельков фазы А |
phantom.js (chalk-tempalte:1.0.20) | d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 | Коллектор фазы А (вариант 1.0.20) |
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) | ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 | Загрузчик фазы А, байтово идентичный в обеих версиях. |
Атрибуция и мотивация
Мы отслеживаем эту кампанию следующим образом: ФантомБотзаимствуя фирменный стиль оператора. User-Agent: PhantomBot/1.0 заголовок "пульс", phantom-bot.service модуль systemd, com.phantom.bot метка LaunchAgent и phantomdeadcode@ Адрес электронной почты. Оператор использует это имя последовательно как минимум в четырех документах.
Каталог сигналов
- Издатель - deadcode09284814 на npm. Однопользовательская учетная запись, одноразовый адрес электронной почты Tutamail, нет SCM Проверка. Ранее никаких публикаций, кроме этой кампании, не было.
- Повторное использование фирменной символики — Слово «фантом» появляется в электронном письме издателя в имени файла сборщика данных фазы А (phantom.js), в имени службы сохранения данных на этапе B (phantom-bot.service), в метке LaunchAgent (com.phantom.bot), а также в User-Agent бота (PhantomBot/1.0).
- Инфраструктура — Один VPS по адресу 80.200.28.28 Фаза А начинается с ротации поддоменов Serveo; фаза В переходит к localhost.run обратный туннель (b94b6bcfa27554.lhr.lifeОба сервиса от разных поставщиков бесплатны и требуют только исходящего SSH-соединения на стороне оператора, что соответствует бюджетным решениям с низким уровнем операционной безопасности.
- Кодовый стиль — Весь код написан на чистом JavaScript; без обфускации, без кодирования строк, без проверок на виртуальную машину. Имена переменных являются описательными (stealSystemInfo, выполнитьКоманду, httpНаводнениеКомментарии в distube.js Это напрямую обращается к будущему оператору («Используйте свой URL-адрес localhost.run по протоколу HTTPS»), предполагая, что файл предназначался для распространения в виде набора инструментов, а не для использования одним злоумышленником.
- OpSec slip — В архиве Phase B содержатся как клиентское ПО для бота, так и сервер управления и контроля (C2) на стороне оператора.c2 ЭЛФ + c2.go (источник). Это соответствует ситуации, когда оператор загрузил свою рабочую ветку в npm, не проверив список файлов. Либо оператор неопытен, либо комплект неисправен. означает, Предназначен для публичного распространения, а исполняемый файл C2 является частью продукта.
- Самоподтверждение - axois-utils:1.0.4 содержит исходный комментарий // Изменить на '80.200.28.28' для публичного доступа в строке 12 подтверждается последовательность этапов разработки/тестирования/производства, которую операторы обычно отрицают.
мотивация
Полезная нагрузка фазы А — это прямое финансовое воровство: учетные данные, облачные ключи, токены GitHub и криптовалютные кошельки — все это имеет ликвидные рынки перепродажи. Фаза B также финансовая, но косвенная: сервисы DDoS-атак («бутер») арендуют мощности поминутно, и боты, подобные тому, что поставляется здесь, — это тот самый инвентарь, на котором работают эти сервисы. 30-секундный пульс, стандартный цель/порт/продолжительность Схема управления и арсенал из пяти протоколов для рассылки спама представляют собой standard продукт оператора бутербродов.
Запуск обоих модулей параллельно — chalk-tempalte:1.0.19 и 1.0.20 продолжать отправку вора, пока axois-utils:1.0.9 Отправка бота — это говорит о том, что оператор хеджирует потоки доходов, а не отказывается от Фазы А. Этот поворот — это дополнение, не замена.
То, что мы не заявляем
Нам не удалось подтвердить реальную личность человека, стоящего за этим. deadcode09284814 Мы не связываем эту кампанию ни с каким конкретным субъектом угроз, группой или страной. «Фантомная» маркировка достаточно последовательна во всех артефактах, чтобы предполагать причастность одного оператора, но распространение бинарного файла C2 в виде комплекта оставляет открытой возможность того, что будущие пакеты от несвязанных субъектов будут использовать тот же код.
Влияние, тенденции и что должны делать защитники.
Влияние
Законные цели для сквотов Вардар и меловой шаблон В экосистеме JavaScript от них широко полагаются; Вардар Один только этот пакет входит в тридцать самых скачиваемых пакетов npm. Названия, набранные с помощью typosquat, отличаются от настоящих всего одним нажатием клавиши.аксоида ↔ Вардар, шаблон ↔ шаблон), и оба варианта являются лингвистически правдоподобными орфографическими ошибками.
Нам не удалось получить достоверную статистику загрузок вредоносных версий до их удаления — npm не сохраняет количество загрузок для каждой версии после снятия пакета с публикации, и npms.ioПрокси-серверы такого масштаба создают много шума. Любая организация, чей файл блокировки разрешается в пакет с именем аксиос-утилиты or меловой шаблон от издателя deadcode09284814 Следует рассматривать это как скомпрометированное: необходимо менять все имеющиеся учетные данные. процесс.env На затронутом хосте проведите аудит векторов сохранения данных для каждой операционной системы (см. раздел «Что должны делать специалисты по защите» ниже) и удалите зависимость.
Новые модели
Эта кампания иллюстрирует сдвиг, который мы наблюдали в нескольких недавних инцидентах с npm: Монтажные крюковые строительные леса — это долговечное изделие.Полезная нагрузка является сменной.Тот же издатель, та же упаковка, тот же предустановка / устанавливать / послеустановка утроенный, и даже тот же самый ритм обновления версий — единственное, что изменилось между axois-utils:1.0.6 и axois-utils:1.0.9 был ли это файл hooks запуск. Обнаружение на основе сигнатур, привязанное к полезной нагрузке фазы А (строки путей к кошельку, phantom.jsСборщик данных (7,667-строчный, хост Serveo C2) выявил бы первые три версии и полностью пропустил бы фазу B.
Аналогичная картина наблюдается и в других кампаниях 2026 года, которые мы отслеживали: один оператор со стабильной базой, переключающийся между кражей учетных данных, клиентами для списывания на экзаменах, извлечением данных из Telegram-ботов и теперь уже вербовкой DDoS-атак. Защитники, полагающиеся на сигнатуры полезной нагрузки, будут проигрывать второй раунд каждой кампании.
Из этого следует, что Методы и стратегии установки (TTP) — это более точный сигнал.Тройное объявление install-hook, скрипты установки, которые импортируют протокол HTTPS or дочерний_процессустановить скрипты, которые записывают данные в папки автозагрузки пользователя, и установить скрипты, которые разрешают имена хостов в бесплатных службах обратного туннелирования (Serveo, localhost.run(например, ngrok, cloudflared) — все эти пакеты редко встречаются в легитимных программах и часто — во вредоносных.
Что должны делать защитники
- аудит файла блокировки. Обыскать все Пакет-lock.json / пряжа.замок / pnpm-lock.yaml в вашей организации для получения точных строк аксиос-утилиты и меловой шаблонРассматривайте любой матч как компромисс.
- Поворачивайте секреты на пораженных хозяевах. Этап А: массовый сбор учетных данных SSH, облачных сервисов, GitHub, npm и кошелька. Предполагается использование всех когда-либо присутствовавших учетных данных. процесс.env, ~ / .ssh, ~/.aws, ~ / .npmrc, ~ / .configИли любой .env* Файл на затронутом хосте находится в открытом доступе.
- Устранение проблем с сохранением данных (фаза B). В Windows удалите HKCU\Software\Microsoft\Windows\CurrentVersion\Run\SystemUpdate, Удалить %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\system-update.bat и schtasks /delete /tn SystemUpdate /fВ Linux, кронтаб -e и удалите @reboot node …, systemctl –user disable –now phantom-bot.service затем удалите ~/.config/systemd/user/phantom-bot.service, скраб .bashrc / .zshrc / /etc/rc.localНа macOS, launchctl unload ~/Library/LaunchAgents/com.phantom.bot.plist затем удалите файл plist.
- Заблокируйте хосты управления и контроля (C2). Добавьте четыре конечные точки C2 из таблицы IOC в список заблокированных исходящих соединений. *.serveousercontent.com и *.lhr.life Обратное туннелирование может быть полностью заблокировано, если в вашей среде нет законных оснований для его использования.
- Поиск по TTP во время установкиа не полезная нагрузка. Записи в файле блокировки инвентаризации, чьи пакет.json заявляет, предустановка, устанавливать и послеустановка Все они указывают на один и тот же скрипт. Проверьте его на соответствие возрасту пакета и статусу подтверждения издателя. Этот шаблон редко встречается в легитимных пакетах и является единственным наиболее надежным сигналом, который повторно использует PhantomBot.
- Проверка исполняемого файла C2. Все, кто скачал axois-utils:1.0.9 имеет сервер управления и контроля оператора (c2 ELF, sha256 165fa92d…) на диске. Сканирует кэши и хранилища артефактов CI. Сам по себе бинарный файл находится в спящем режиме, но его наличие на рабочей станции является однозначным доказательством того, что пакет был установлен.
Линия закрытия
Один и тот же оператор, один и тот же пакет и один и тот же установочный хук могут представлять совершенно разные угрозы в течение 48 часов. Следите за структурой, а не за полезной нагрузкой.





