За год обнаружены десятки тысяч вредоносных пакетов в npm и PyPI

information security

С мая 2025 года по июнь 2026 года в публичных реестрах npm и PyPI выявлены десятки тысяч вредоносных пакетов. Выборка, охватывающая сотни тысяч единиц, показала, что злоумышленники используют типовые приёмы, позволяющие маскировать вредоносный код под легитимные библиотеки, консольные утилиты и плагины. Часть пакетов ловит опечатки в названиях известных проектов, часть проникает в дерево зависимостей транзитивно, а наиболее опасные случаи представляют собой скомпрометированные версии реально существующих пакетов - через взлом аккаунтов разработчиков или токенов CI/CD.

Описание

Самая распространённая техника - исполнение кода в момент установки пакета. В npm это реализуется через скрипты жизненного цикла (lifecycle scripts), которые запускаются до, во время или после установки. В PyPI аналогичный эффект достигается через файл setup.py, переопределение команд установки или вызов модуля, исполняющегося до начала нормального использования библиотеки. По результатам анализа, 63,8% вредоносных пакетов содержат скрипт установки в npm, а 5,2% - подмену команд установки в Python.

В 28,4% случаев обнаружены подозрительные внешние ссылки, а 25% пакетов прямо собирают и отправляют чувствительные данные. Почти каждая пятая вредоносная программа выполняет эксфильтрацию данных через postinstall-скрипт. Около 7% пакетов используют динамическое исполнение кода, 5,7% - обфускацию JavaScript. Примерно 10% всей выборки составляют пакеты, которые отправляют украденные данные через вебхуки Discord или Telegram, причём эти каналы нередко маскируются под легитимные уведомления.

Как показало исследование, отдельные признаки по отдельности могут быть ложноположительными - скрипт установки бывает легитимным, а внешний URL может вести на документацию. Но комбинация установочного хука, сетевого кода, сбора системных переменных и обфускации почти всегда указывает на атаку.

Типичные сценарии атак в примерах

Один из самых простых вариантов - "минимальный стилер". Он собирает имя пользователя, hostname, версию Python и текущую директорию, после чего отправляет эти данные в формате JSON на внешний сервер. Код не зашифрован, не обфусцирован и легко распознаётся даже при беглом просмотре.

Более сложные пакеты дополнительно вычитывают переменные окружения, включая секреты, смонтированные в контейнерах Kubernetes. Злоумышленники интересуются содержимым каталогов /var/run/secrets и /run/secrets - там хранятся токены сервисных аккаунтов, сертификаты и учётные данные для внешних систем. Собранная информация уходит на внешний HTTP-эндпоинт.

Ещё один распространённый приём - сериализация локальных данных в JSON и отправка на специализированный домен, зарегистрированный злоумышленниками. При этом в запрос включаются имя пакета, каталог установки, домашняя директория пользователя, содержимое файлов /etc/passwd и /etc/hosts. Таким образом атакующий оценивает успешность своей публикации и получает карту целевой инфраструктуры.

Некоторые пакеты выполняют разведку на уровне Linux: запускают shell-команду, собирающую hostname, текущую директорию, имя пользователя и внешний IP-адрес через curl или аналогичные утилиты. Результат кодируется и отправляется на хост, управляемый злоумышленником. Такие "маяки" (beacons) помогают определить, что пакет был установлен в реальной среде, а не в изолированном аналитическом окружении.

Использование мессенджеров и DNS для скрытого управления

Примерно каждый десятый вредоносный пакет использует Discord в качестве канала доставки украденных данных. Пакет извлекает токены Discord из пользовательских директорий, проверяет их через API Discord и отправляет результаты на заданный вебхук. Аналогично применяется Telegram: после тройного декодирования Base64 раскрываются токен бота и идентификатор чата, после чего пакет начинает проверять учётные данные для социальных сетей и красть пароли.

Оригинальный приём - эксфильтрация через DNS-запросы. Вместо прямого HTTP-вызова код конструирует доменное имя, в котором закодированы имя пользователя и hostname. Даже если резолвинг завершится ошибкой, сам запрос уходит на авторитативные DNS-серверы, которые находятся под контролем атакующего. В корпоративных сетях DNS-трафик часто фильтруется слабее, чем веб-запросы, что делает этот метод более живучим.

Многоступенчатые атаки на цепочку поставок

Наиболее опасные инциденты связаны с компрометацией легитимных пакетов. Например, в конце ноября 2025 года злоумышленники, получив доступ к аккаунтам мейнтейнеров, опубликовали троянизированную версию пакета @posthog/cli (экосистема PostHog). Вредоносное изменение заключалось в добавлении скрипта preinstall, который проверяет наличие runtime Bun - и если его нет, скачивает и устанавливает его. Затем Bun запускает сильно обфусцированный файл bun_environment.js размером в мегабайты.

Расшифрованный код собирает токены GitHub и npm, переменные окружения, системную информацию, секреты AWS, GCP и Azure. Для каждого найденного токена он пытается записать украденные данные через GitHub API. Если токены не найдены, на Unix-системах запускается команда, которая безвозвратно уничтожает все доступные пользовательские файлы с помощью shred и удаляет пустые директории.

Такой сценарий принципиально отличается от массовых одноразовых пакетов-опечаток. Атакующий не просто публикует случайный мусор, а встраивается в доверенный канал распространения. Supply-chain-атаки через скомпрометированные пакеты становятся масштабной проблемой, требующей отдельной экспертизы и постоянного мониторинга.

Выводы и меры защиты

По итогам анализа картина оказалась прагматичной: большинство атак устроены просто. Злоумышленники эксплуатируют доверие к процессу установки, полагаются на привычные сетевые API и массово размножают похожие пакеты. Наиболее надёжные сигналы для обнаружения возникают из комбинации признаков: выполнение кода при установке, сбор локальных данных, обращение к внешнему эндпоинту и попытка замаскировать полезную нагрузку.

Для снижения рисков рекомендуется вести внутренний проверенный реестр зависимостей, не допуская прямых запросов к публичным npm и PyPI. Следует закреплять версии и хеши пакетов, прошедших аудит, и отдельно анализировать каждое обновление. Threat intelligence по реестрам пакетов - фиды с индикаторами компрометации и контекстом кампаний - помогает быстрее блокировать supply-chain-атаки до того, как они затронут конечные проекты.

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

IPv4

  • 147.45.124.42
  • 49.232.169.67
  • 54.242.228.151

Domain

  • 3vz70udxj4igjcfhpjsmuyzsnjtah15q.oastify.com
  • 7nv0bfnhimpr5lrd9fuw8t0wvn1ep9dy.oastify.com
  • a.stratfordhospital5050.com
  • kotko.me
  • x0.at
  • Xghfyxdvb7rz4exwnbj51fm2etkk8awz.oastify.com

URL

  • http://49.232.169.67:8084/slt
  • http://54.242.228.151:8090/debug-21f53
  • https://3vz70udxj4igjcfhpjsmuyzsnjtah15q.oastify.com/exfil
  • https://canary.discord.com/api/webhooks/1438273237867036682/y-jlMJWQRYZlxmYEAzEKNQLMRG3GTh7ZcVryf-CpYulJymcNV_rXJMFtvIDke7E7w5HW
  • https://discord.com/api/webhooks/1509929656651092121/FW2hgh6GfYlssDRVLbB02432AXZAfEjIjszM6kOBrEv1VG_HYwS08BObsOGH55IG9hjL
  • https://kotko.me/analyze.php?procoder
  • https://x0.at/P685.txt

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