Атака на библиотеку node-ipc: три вредоносные версии похищают учётные данные разработчиков

security

14 мая 2026 года злоумышленники одновременно опубликовали три заражённые версии популярной библиотеки node-ipc в официальном реестре пакетов npm. Эта библиотека используется для межпроцессного взаимодействия в среде Node.js, а еженедельное число её загрузок превышает десять миллионов. Вредоносные сборки несли в себе скрытый модуль кражи учётных данных размером около 80 килобайт. Инцидент выявили специалисты компании StepSecurity с помощью своего инструмента анализа на базе искусственного интеллекта.

Описание

Атака оказалась тщательно спланированной. Версии 9.1.6, 9.2.3 и 12.0.1 были опубликованы с аккаунта atiertant, который ранее не участвовал в сопровождении этого пакета. При этом версии линейки 9.x никогда не существовали в официальных релизах - злоумышленник создал их с нуля, скопировав структуру из 12.x и вставив вредоносный код. Такая стратегия позволила охватить максимальное число проектов: пользователи, закрепившие зависимости на диапазоны ~9.1.x, ~9.2.x, ^9 или ^12, при следующей установке или обновлении блокировки получали скомпрометированные пакеты автоматически.

Вредоносный код был внедрён в CommonJS-сборку библиотеки (файл node-ipc.cjs). После того как приложение вызывает require('node-ipc'), срабатывает немедленно вызываемое функциональное выражение (IIFE). Оно не использует установочные скрипты, поэтому стандартные анализаторы, проверяющие только хуки preinstall и postinstall, не замечают угрозы. Модуль начинает сбор информации сразу после загрузки - никаких дополнительных условий для активации не требуется.

Payload (полезная нагрузка) собирает учётные данные из более чем 90 категорий. В их числе ключи доступа к облачным платформам AWS, Azure, Google Cloud, SSH-ключи, токены Kubernetes, конфигурации GitHub CLI, настройки инструментов искусственного интеллекта (Claude AI, Kiro IDE), файлы Terraform, пароли баз данных и история команд оболочки. Вся добыча упаковывается в сжатый архив и отправляется на командно-контрольный сервер (C2), замаскированный под инфраструктуру Azure. Примечательно, что версия 12.0.1 содержит дополнительный механизм прицельной проверки: она вычисляет SHA-256 хеш пути к загружаемому модулю и сравнивает его с заранее заданным значением. Если хеш не совпадает, payload не активируется. Таким образом злоумышленники могли нацелиться на конкретного разработчика или проект. Версии 9.x, напротив, срабатывают на любой системе без всяких условий.

Специалисты StepSecurity в своём отчёте подробно разобрали технику обфускации, применённую в атаке. Код был обработан инструментом javascript-obfuscator с четырьмя уровнями защиты: перемешивание строковой таблицы, уплощение потока управления, внедрение мёртвого кода и нестандартное кодирование. Наиболее интересным оказалось собственное основание 16 с перевёрнутым порядком нибблов. Вместо привычных символов a-f использовались заглавные буквы G, H, J, K, M, P, а байты собирались не со старшего, а с младшего ниббла. Это означало, что любой, кто просто распознает алфавит, всё равно получит бессмысленные данные - нужно было ещё переставить половинки байт. Такой приём почти не встречается в публичных атаках и значительно усложняет обратную разработку.

После сбора данных payload пытается передать их по двум независимым каналам одновременно. Первый канал - HTTPS-запрос на домен sh.azurestaticprovider.net, замаскированный под сервис Azure. Второй канал использует DNS-запросы типа TXT, направленные напрямую на IP-адрес C2-сервера, минуя публичные DNS-резолверы. Это делает атаку невидимой для большинства систем корпоративного мониторинга, которые полагаются на логи корпоративных DNS-серверов. Кроме того, перед отправкой злонамеренный модуль принудительно меняет системный DNS на 8.8.8.8, чтобы обойти локальные фильтры.

Важно отметить, что этот инцидент не связан с известной атакой peacenotwar, произошедшей в 2022 году с той же библиотекой. Тогда автор node-ipc по фамилии Миллер встроил в пакет вредоносный код с политической подоплёкой, который уничтожал файлы. Нынешняя атака совершена другим лицом и преследует исключительно финансовую цель - кражу учётных данных для дальнейшего использования или продажи.

Разработчикам, которые использовали node-ipc в своих проектах, необходимо действовать незамедлительно. Если в окружении были установлены версии 9.1.6, 9.2.3 или 12.0.1, следует считать все секреты, хранящиеся в этой среде, скомпрометированными. Рекомендуется откатить пакет до чистой версии (например, 11.1.0), а затем сменить все пароли, ключи и токены, к которым имел доступ процесс Node.js. Проверить наличие вредоносных версий можно через команду npm list node-ipc. Кроме того, стоит усилить мониторинг исходящих сетевых соединений и обратить внимание на необычные DNS-запросы к нестандартным доменам. Данная атака лишний раз напоминает о необходимости фиксации зависимостей по точным номерам версий и регулярной проверки целостности публикуемых пакетов.

Индикаторы компрометации

Хеши файлов

  • node-ipc.cjs SHA-256 (идентичен во всех трёх версиях): 96097e0612d9575cb133021017fb1a5c68a03b60f9f3d24ebdc0e628d9034144
  • node-ipc.cjs SHA-1 (идентичен во всех трёх версиях): ab7388363936bf527afd4173b5728c7cdbdd01ab
  • Внедрённый IIFE-блок SHA-256 (80 078 байт): b2001dc4e13d0244f96e70258346700109907b90e1d0b09522778829dcd5e4cf
  • Внедрённый IIFE-блок MD5: 9672e9fb93a457f1d359511b4e53490d
  • node-ipc-12.0.1.tgz SHA-1: fe5d107b9d285327af579259a32977c4f475fa26
  • node-ipc-12.0.1.tgz SHA-256: 78a82d93b4f580835f5823b85a3d9ee1f03a15ee6f0e01b4eac86252a7002981
  • node-ipc-9.2.3.tgz SHA-1: 58ae7338960ef525d7c655023d7c81e3ddb283d6
  • node-ipc-9.2.3.tgz SHA-256: c2f4dc64aec4631540a568e88932b61daebbfb7e8281b812fa01b7215f9be9ea
  • node-ipc-9.1.6.tgz SHA-1: f5974a9774a22a863728b960543f68e7009099ef
  • node-ipc-9.1.6.tgz SHA-256: 449e4265979b5fdb2d3446c021af437e815debd66de7da2fe54f1ad93cbcc75e

Сетевые индикаторы

  • Домен C2 (тайпсквоттинг Azure): sh.azurestaticprovider[.]net - НЕ является доменом Microsoft. Имитирует azurestaticapps.net и azurewebsites.net в логах.
  • Порт C2: 443 (HTTPS, предназначен для слияния с обычным TLS-трафиком)
  • IP-адрес C2: 37.16.75.69 - Блокировать на сетевом уровне
  • DNS-приёмник C2: 37.16.75.69 (UDP 53) - Сервер C2 также выступает DNS-приёмником; принимает прямые запросы эксфильтрации
  • Переопределение DNS-резолвера: 8.8.8.8 / 1.1.1.1 - Используется только для разрешения имени хоста C2, не для эксфильтрации
  • DNS-суффикс меток эксфильтрации: *.bt.node.js — Косметический суффикс в TXT-запросах эксфильтрации; никогда не появляется в публичном DNS

Идентификаторы встроенной полезной нагрузки

  • Жёстко заданный HMAC-ключ: qZ8pL3vNxR9wKmTyHbVcFgDsJaEoUi
  • Идентификатор модуля/запроса: bt.node.js
  • Целевой Хеш (12.0.1): bf9d8c0c3ed3ceaa831a13de27f1b1c7c7b7f01d2db4103bfdba4191940b0301
  • Промежуточный каталог: $TMPDIR/nt-<PID>/
  • Маркер окружения демона: __ntw=1
  • Расположение нагрузки: node-ipc.cjs строка 1271 (одна обфусцированная строка длиной 80 079 байт)
  • Цель перемешивания строкового массива обфускатора: 0xb5c88 (744 584 десятичное), 340 циклических сдвигов влево для 443 записей

Сигналы обнаружения

  • Наличие node-ipc@9.1.6, @9.2.3 или @12.0.1 в файлах блокировки или node_modules
  • Аномалия размера файла node-ipc.cjs: 117 КБ против 37 КБ у чистых версий
  • Исходящий HTTPS-трафик на sh.azurestaticprovider.net или 37.16.75.69:443
  • Неожиданный исходящий трафик UDP/53 на 37.16.75.69 от процессов приложений
  • Каталоги, соответствующие $TMPDIR/nt-*, в файловой системе
  • Процессы с __ntw=1 в окружении

Комментарии: 0