Почти семь лет пакет не получал обновлений - а потом выпустил девять версий за полтора часа. 4 мая 2025 года в 20:15 по UTC в реестре пакетов npm вышла itsa-utils 1.4.2, и к 21:45 того же вечера появились ещё восемь версий других пакетов того же автора. В четырёх сборках, которые удалось восстановить, обнаружилась полезная нагрузка: программа удалённого доступа и похититель учётных данных.
Описание
При этом совпадений с известной кампанией оказалось больше, чем различий. Восемь из девяти признаков совпали с PolinRider в описании OpenSourceMalware: тот же ключ расшифровки, тот же командно-контрольный сервер и те же пути на нём. Девятый признак, распространение через принудительную перезапись истории в Git, в майской выборке не встречается. Записи в блокчейне BNB Smart Chain и Ethereum, где лежала полезная нагрузка, датированы 7 февраля 2025 года - за 86 дней до первой публикации. Получается, у PolinRider первые подтверждённые пострадавшие появились только в январе 2026 года, а этот образец старше их на восемь месяцев.
Дальше в цепочке работает загрузчик: он читает данные из транзакций в блокчейне и передаёт управление следующему этапу. Точка входа - обычный импорт пакета: установочных хуков нет, но запутанный код дописан в конец главного файла и срабатывает, как только приложение подключает библиотеку. Расшифровав первую часть, загрузчик запускает новый процесс Node.js и получает вторую часть уже с Ethereum. После этого на машине оказывается программа удалённого доступа. Она подключается к командно-контрольному серверу через Socket.IO, представляется именем хоста и пользователя и ждёт команд: выполнить команду оболочки, сменить каталог, выгрузить файл или целый каталог. При проверке адреса через сторонний сервис геолокации загрузчик завершает работу, если адрес принадлежит России.
В результате один импорт даёт атакующему интерактивный доступ к машине и выгрузку данных. Похититель работает на Windows, Linux и macOS и снимает пароли, файлы cookie и данные карт из Chrome, Firefox, Edge и ещё шести браузеров. Отдельно он перебирает больше 80 расширений для криптокошельков, среди них MetaMask и Phantom. Там же учётные данные Git, токены GitHub CLI, данные 1Password и Dashlane и содержимое облачных хранилищ. Собранное пакуется в зашифрованные архивы и уходит на сервер; если не вышло, в дело идёт Telegram-бот, токен которого оставался рабочим в октябре 2026 года. Закрепления при этом нет: ни автозапуска, ни задачи в планировщике, ни службы, поэтому после перезагрузки ничего не остаётся.
После этого, на следующее утро с 10:07 до 11:18 по UTC, автор выпустил семь чистых версий, включая itsa-utils 1.4.3. {Как показало исследование}, заражённые сборки при этом остались в реестре: новые версии сдвинули метку последней, но любой, кто фиксирует версию в зависимостях, по-прежнему мог поставить вредоносную. Позже шесть из девяти версий из реестра исчезли - две в 2025 году и четыре в октябре 2026-го; кто их удалил, не установлено. Данных о том, что кто-то установил заражённые версии и потерял данные, в отчёте нет. Обходных мер автор не публиковал: исправление здесь только одно - чистые версии пакетов.
Позже, с января по июль 2026 года, та же активность проявилась в четырёх репозиториях автора на GitHub. Код дописывали в конец конфигурационного файла и принудительно перезаписывали историю ветки, подставляя более ранние даты правок. Ни одна из этих версий до npm не дошла, потому что автор не выпускал релиз, пока заражение оставалось в репозитории. Из этого следует, что майская серия 2025 года - ранняя часть той же кампании: полезная нагрузка, блокчейн-доставка и дописывание кода в конец файла уже есть, а самовоспроизведения ещё нет.