В реестре npm с 19 по 22 октября 2026 года появились 15 пакетов, имена которых заканчиваются на testmetest. Опубликовали их две учётные записи. В боевых версиях загрузка похищает учётные данные, переносится на другие пакеты и репозитории, а также ставит компонент, удаляющий домашний каталог после отзыва украденного токена GitHub. Вся наблюдавшаяся активность шла с тестовых учётных записей оператора. Сторонних скомпрометированных пакетов и пострадавших на 22 октября 2026 года не выявлено.
Описание
Публикация каждого пакета шла в три шага. Сначала появлялась заготовка с версией 0.0.0-stage, затем безвредная приманка 1.0.0, а после неё боевая патч-версия, например 0.0.1, которая становится последней. По данным SafeDep четыре пакета остаются в реестре, и активную часть червя несёт один из них; остальные одиннадцать сняты 21 октября. Та же учётная запись держит на GitHub тестовые репозитории, и в большинстве из них уже лежат файлы червя.
Установочных скриптов в пакетах нет. Запуск опирается на файл конфигурации сборки: при его наличии npm запускает node-gyp rebuild, а директива источников внутри файла выполняет node с загрузчиком и скрывает вывод. Загрузчик занимает 14,8 КБ и расшифровывает загрузочный модуль для среды выполнения Bun. Тот расшифровывает блок данных размером 320 КБ во временный каталог, запускает его через bun и удаляет за собой. Для сравнения, в июньской сборке Miasma, известной как Phantom Gyp, корневой загрузчик занимал более 4 МБ.
Перед основной работой нагрузка проверяет окружение и прекращает работу на русской и других локалях стран СНГ (Содружества Независимых Государств), а также в известных изолированных средах для анализа. В GitHub Actions она пытается отключить агент защиты StepSecurity Harden-Runner через сокет Docker и перенаправить его домен на локальный адрес, а при неудаче завершается. Нагрузка собирает ключи SSH, доступы к npm, PyPI и Git, файлы переменных окружения и сохранённые входы в браузерах. Отдельно она забирает ключи AI-инструментов Claude, Codex, Gemini и Copilot. Из памяти процесса, обслуживающего задания GitHub Actions, извлекаются секреты этих заданий, а также секреты AWS, GCP, Azure, Vault и Kubernetes.
Вывод данных идёт двумя путями. Первый - новый публичный репозиторий project-utils в аккаунте жертвы, где сообщение коммита начинается с фиксированного префикса и несёт токен GitHub, зашифрованный встроенным ключом. Другие заражения ищут такие коммиты, чтобы повторно использовать токены, а при недоступности GitHub данные уходят на резервный внешний адрес. Распространение идёт по нескольким каналам сразу. В каждый пакет npm заражённого сопровождающего добавляется загрузчик, после чего публикуется новая патч-версия; те же версии уходят в PyPI, RubyGems и JFrog.
В репозитории GitHub и GitLab нагрузка записывает фиктивный рабочий процесс CodeQL и файлы конфигурации AI-агентов и задач редактора. При этом она копирует автора и текст сообщения у последнего настоящего коммита в ветке, а по SSH переносит себя на узлы из списка известных хостов пользователя. Закрепление держится на двух компонентах. Первый опрашивает похищенный токен каждые 45 секунд в течение 48 часов и при ошибке авторизации удаляет домашний каталог и каталог документов. Второй раз в час ищет в коммитах GitHub строковый маркер, затем скачивает и запускает скрипт Python, подписанный ключом RSA атакующего.
Подтверждено, что удаление срабатывает именно при отзыве токена; сведений о том, что до этой стадии дошёл сторонний пользователь, нет. Механизм удаления взят из сборки Mini Shai-Hulud, а команды приходят по подписанному каналу вместо фиксированного поиска в коммитах. Предположительно вариант собрал подражатель на основе исходного кода Shai-Hulud, опубликованного авторами в мае 2026 года; к операторам исходного Miasma его не относят. Роль части версий, снятых из реестра 21 октября, не установлена, поскольку их содержимое не проверено. Описанные признаки дают ложные срабатывания: файл конфигурации сборки с командой в директиве источников встречается и в обычных пакетах, а метка 0.0.x, выставленная последней после 1.0.0, бывает и у нормальных релизов. Сами по себе эти признаки показывают сходство с вариантом, но не подтверждают заражение.