Атака на цепочку поставок npm (менеджер пакетов для среды Node.js) получила имя MALFEX. Пакеты публикует один оператор, первые из них появились в реестре в августе 2023 года. Всего он выложил двенадцать пакетов, восемь содержат вредоносный код. Три пакета оставались доступными для установки по состоянию на 29 сентября 2026 года: function-flag, function-color и cdn-img-fetch. Заражению подвержены только компьютеры под управлением Windows.
Описание
Суммарно вредоносные пакеты скачали 40 767 раз. На function-flag приходится 37 419 загрузок, он остаётся вредоносным с июля 2025 года. За последнюю неделю зафиксировано 3 017 загрузок. Цифры отражают интерес к пакетам в реестре, а не число заражённых машин: скачивание не означает установку. Отдельная проблема - неполные предупреждения об угрозе. Для function-flag и function-color их нет вовсе, а опубликованное описание для cdn-img-fetch охватывает лишь две из четырёх вредоносных версий. Средства защиты, которые полагаются только на такие рассылки, эти сборки пропустят.
Название кампании взято у самого оператора. Оно встречается в пяти учётных записях, с которых шли публикации, и в описании одного из пакетов. Кроме восьми вредоносных сборок, он выложил четыре пакета без вредоносного кода. Они служат прикрытием и создают видимость обычной активности разработчика.
{По данным анализа}, кампания опирается на три независимых пути доставки. Инфраструктуру они почти не делят, поэтому блокировка одного канала не мешает двум другим. Первый путь - три пакета-загрузчика: tlxbnhd, tldriver и mxdriver. Они ставят программу удалённого доступа (троян) Overlord. Исполняемый файл для Windows сервер отдаёт под видом изображения. Внутри - подписанный интерпретатор AutoIt, служебная программа для выполнения сценариев, и зашифрованный сценарий. После нескольких слоёв расшифровки он разворачивает троян и внедряет его в доверенный системный процесс.
Второй путь ведёт к похитителю данных movinlike. Цепочку образуют пакеты cdn-img-fetch и img-to-native вместе с обёрткой native-runner. Ни у одного из них нет скрипта установки. Код срабатывает в момент загрузки пакета, поэтому запрет на выполнение установочных сценариев здесь бесполезен. Один из пакетов ждёт до двух минут, пока с внешнего ресурса придёт картинка, и ищет данные, дописанные после её конца. Расшифрованный файл запускает загрузчик, который скачивает программу размером около 64 МБ. Похититель собирает данные авторизации восьми клиентов Discord, сохранённые логины браузеров, сессии Telegram и содержимое криптовалютных кошельков. Собранное архивируется, делится на части по 25 МБ и уходит через вебхук (адрес для автоматической отправки сообщений) в Discord.
Третий путь - пакет function-flag, самая долгоживущая часть кампании. Скрипт, который запускается при установке, вызывает функцию рисования картинки из символов с определённым шрифтом. Это значение запускает скрытую процедуру: она скачивает исполняемый файл в служебную папку пользователя и запускает его без видимого окна. Каждая вредоносная версия тянет нагрузку с нового адреса, и адреса эти менялись восемь раз. После публикации версии 4.0.0 оператор выпустил более новую сборку под меньшим номером 1.7.3, чтобы обойти сравнение версий. Строки кода сдвинуты пробелами за пределы видимой области редактора, а ошибки загрузки глушатся пустой обработкой исключений. Установка завершается молча, даже когда сервер недоступен.
Закрепление в системе обходит привычные проверки. Загрузчик Overlord копирует файлы в каталог несуществующей компании ScopeSmart Technologies Inc и создаёт задачу в планировщике под названием Maiden. Задача повторяется каждые пять минут, а её дата создания отнесена к 2020 году, чтобы она не выглядела новой. Ключи автозапуска в реестре не используются, поэтому просмотр списка автозагрузки ничего не покажет. Адрес командно-контрольного сервера (C2-сервера) троян читает из блокчейна Solana. Смена сервера сводится к новой записи в сети, и отключение узла не лишает троян связи. Возможности Overlord - снимки экрана, перехват нажатий клавиш и содержимого буфера обмена, поиск файлов, удалённая оболочка и скрытый рабочий стол, невидимый для пользователя.
Опасность распределена неравномерно. Ни один распространённый пакет не зависит от сборок оператора, поэтому риск ограничен теми, кто установил их напрямую. Географической или отраслевой избирательности нет: целью становится любой, кто запустил похититель. Часть упомянутых адресов на момент проверки не отвечала. При этом установочный скрипт function-flag по-прежнему пытается скачать нагрузку при каждой установке, и сервер может снова начать её отдавать.
Проверить себя стоит по дереву зависимостей, включая транзитивные, и по файлам блокировки версий. Вредоносная сборка может остаться в них даже после удаления пакета из реестра. Блокировать нужно все восемь пакетов вместе с обёртками, иначе обход остаётся открытым. На заражённой машине её изолируют от сети, удаляют задачу планировщика и служебные каталоги, а пароли меняют с заведомо чистого компьютера. Сессии Telegram завершают, средства переводят в новые криптовалютные кошельки, платежи в Discord проверяют. Копии пакетов во внутренних реестрах, прокси и кешах удаляют отдельно: изъятие из публичного реестра их не затрагивает. Отдельного внимания требует проверка зависимостей удалённого пакета - cdn-img-fetch оставался доступным и после того, как изъяли img-to-native, от которого он зависит.
Общая картина проста. Один человек три года поддерживает кампанию, меняет серверы, добавляет обёртки и публикует обновления под старыми номерами версий. Пока предупреждения об угрозе отстают от публикаций, реестр пакетов остаётся рабочим каналом доставки вредоносного кода.