С августа 2023 года один оператор публикует пакеты в npm - крупнейшем хранилище библиотек для JavaScript. За два года он выложил двенадцать пакетов, восемь из которых несут вредоносный код, а четыре служат прикрытием. Три пакета остаются доступными для установки, и к концу сентября 2026 года ни один из них не внесён в официальные базы уязвимостей.
Описание
Схема начинается с обычной установки. Разработчик подключает пакет, и вместе с ним автоматически запускается скрытый установочный скрипт. Дальше оператор ведёт жертву по одной из двух линий. Первая загружает файл, замаскированный под изображение, разворачивает его и запускает программу удалённого доступа. Вторая линия ждёт появления файла во временной папке, расшифровывает его и создаёт исполняемый файл в каталоге, название которого копирует структуру папок Microsoft.
Первая линия заканчивается загрузкой программы Overlord, которую в августе 2026 года подробно разобрали в Jamf Threat Labs. Тогда её доставляли через поддельный установщик Zoom, а способ распространения оставался неизвестным. Теперь ясно: тот же код приходит через пакеты npm. Кроме того, в изъятом образце впервые оказался включён механизм получения адреса управляющего сервера через блокчейн.
Механизм работает так. Оператор публикует в сети Solana короткое зашифрованное сообщение со своего кошелька. Программа читает его через публичный узел сети, расшифровывает и получает список адресов, куда отправлять данные. Смена адреса стоит одну транзакцию, а блокировка конкретного сервера ничего не меняет. Раньше этот приём описывали как отключённый. В новом образце он подключён и готов к работе.
Вторая линия ведёт к другой угрозе. Двухэтапный загрузчик собирает на компьютере жертвы крупный программный набор, который встраивается в клиенты Discord. Дальше он забирает токены авторизации, сведения о платежных источниках и подписках. Отдельно копируются файлы cookie семи браузеров, сохранённые логины и пароли, папка с сессией Telegram Desktop и данные криптовалютных кошельков. Собранное упаковывается в архив и отправляется частями на сервер оператора.
Отдельная история - пакет, который остаётся в реестре четырнадцать месяцев. Его установочный скрипт скачивает и запускает исполняемый файл, а сам вредоносный код сдвинут далеко вправо внутри файла. В редакторе кода он уходит за границу экрана, и разработчик видит только безобидные строки подключения библиотек и функцию вывода текста. Рядом живёт второй пакет, который подключает первый как зависимость. Установка любого из них даёт один результат. Ни автоматические сканеры, ни проверки реестра за это время ничего не нашли.
Ещё одна проблема касается того, как реестр реагирует на находки. Двадцать восьмого сентября npm изъял пакет-расшифровщик, но оставил в открытом доступе его зависимость - загрузчик полезной нагрузки. Две части работают только вместе, поэтому удаление одной не останавливает схему. Злоумышленнику достаточно опубликовать расшифровщик под новым именем. Цепочка снова соберётся за считанные часы.
Личность оператора прослеживается по косвенным признакам. Название группы зашито в ключ шифрования как строка malfexteam2027 и встречается в описании одного из пакетов. Восемь учётных записей в реестре, публичный профиль на GitHub с демонстрационными версиями тех же приёмов, португальский язык в описаниях репозиториев и общий адрес электронной почты указывают на одного человека. Его активность длится больше двух лет.
Риски затрагивают любую организацию, где разработчики ставят пакеты напрямую из реестра. На заражённой машине оператор получает доступ к переписке, платёжным данным, криптовалютным средствам и рабочим учётным записям. Программа удалённого доступа добавляет к этому скрытый рабочий стол, перехват нажатий клавиш, слежение за активным окном и поиск файлов по диску.
Защита строится на нескольких шагах. Начать можно с запрета установки трёх всё ещё активных пакетов на уровне корпоративного прокси. Полезно проверять каталоги приложений в профиле пользователя на предмет посторонних исполняемых файлов и скриптов. Стоит просматривать задачи планировщика, датированные задним числом, - оператор намеренно указывает в них 2020 год, чтобы они не попали в отчёты о недавних изменениях. Выгрузку данных он ведёт через сервис Discord, поэтому имеет смысл отслеживать обращения к внешним вебхукам (адресам, по которым программа отправляет собранную информацию), не блокируя сам сервис целиком. И наконец, при изъятии вредоносного пакета нужно проверять, что вместе с ним удалены все его зависимости.
Реестры пакетов по-прежнему позволяют вести длительные операции. Отдельные предупреждения описывают конкретные пакеты, но не самого оператора. Пока реестр и защитные решения оценивают пакеты по одному, автор вредоносного кода сохраняет присутствие годами и возвращается под новыми именами.