Новая волна атак на PyPI: злоумышленники осваивают нативные расширения и разделённые загрузчики

security

Исследователи из Socket Threat Research зафиксировали свежую волну вредоносных пакетов в репозитории PyPI (главный каталог пакетов для языка Python). Кампания продолжает серию атак на цепочки поставок, известную под кодовыми названиями Mini Shai‑Hulud, Miasma и Hades. На этот раз обнаружено 23 новых артефакта - версий пакетов с вредоносным кодом. Они дополняют 37 ранее выявленных вредоносных пакетов PyPI, о которых сообщалось на прошлой неделе.

Описание

Новая волна отличается от предыдущей не только количеством, но и методами доставки полезной нагрузки. Если раньше злоумышленники полагались на исполняемые хуки в файлах .pth (точки входа Python, запускающиеся при старте интерпретатора), то теперь они используют как минимум три различных механизма. Это говорит о том, что угроза быстро эволюционирует, а операторы кампании активно ищут способы обхода традиционных средств защиты.

В состав новых артефактов входят шесть пакетов, связанных с биоинформатикой, несколько пакетов, имитирующих названия популярных библиотек вроде "rsquests" (похожий на "requests"), "tlask" и "rlask" (вариации Flask), а также ряд пакетов на тему искусственного интеллекта и протокола MCP (Model Context Protocol). Особого внимания заслуживает вариант "langchain-core-mcp". В отличие от предыдущих образцов, этот пакет не содержит внутри файл "_index.js". Вместо этого его хук .pth ищет полезную нагрузку в пути поиска модулей Python ("sys.path") и запускает её с помощью runtime‑среды Bun.

Специалисты Socket Threat Research обнаружили все 23 новых артефакта и добавили их на специализированную страницу отслеживания кампании. На данный момент в базу внесено 471 поражённый артефакт в экосистемах npm и PyPI: 411 артефактов в 106 пакетах npm и 60 артефактов в 37 пакетах PyPI. Страница будет обновляться по мере выявления новых инцидентов.

Три ветви атаки

Первая ветвь - уже знакомый нам паттерн с файлом .pth. Вредоносный пакет содержит "*-setup.pth" и встроенный "_index.js". Когда Python загружает модуль, хук запускается, при необходимости загружает Bun из репозитория GitHub и исполняет JavaScript‑похититель. Этот метод был характерен для волны выходных.

Вторая ветвь - использование скомпрометированных нативных расширений. Она обнаружена в биоинформатических пакетах. Вредоносный код спрятан внутри скомпилированного расширения ".abi3.so". При импорте пакета Python загружает расширение через "dlopen()", и в момент инициализации модуля выполняется функция, запускающая "_index.js". Поскольку исходный код на Python может выглядеть абсолютно легитимным, а само расширение типично для вычислительных и научных библиотек, такой приём сложнее выявить при ручной проверке исходников.

Третья ветвь - вариант "langchain-core-mcp". Его хук .pth не включает файл "_index.js" в состав пакета. Вместо этого он сканирует каждую директорию из "sys.path" в поисках полезной нагрузки - сначала прямо, затем на один уровень вложенности. Если файл найден, он запускается через Bun. Это означает, что загрузчик и полезная нагрузка могут быть установлены из разных пакетов, что усложняет обнаружение для сканеров, ожидающих найти обе части в одном артефакте.

Полезная нагрузка и методы обмана

Независимо от способа доставки, исполняемый код остаётся прежним - сильно обфусцированный JavaScript‑похититель, относящийся к семейству Hades. В начале файла "_index.js" размещён большой блок комментариев, имитирующий системные инструкции и политики. Этот блок не влияет на исполнение кода, но предназначен для срыва автоматического анализа на основе больших языковых моделей. Если триажер или анализатор копирует начало файла как запрос к нейросети, тот может выдать отказ или неверную классификацию, не дойдя до настоящего вредоносного кода.

Как только похититель активируется, он собирает данные с рабочей станции разработчика или из среды непрерывной интеграции и поставки (CI/CD). Целью становятся учётные данные для GitHub, npm, PyPI, RubyGems, JFrog, облачные провайдеры, ключи Kubernetes и SSH, конфигурации Docker, истории команд, переменные окружения (файлы ".env"), токены реестров пакетов и конфигурация инструментов разработчика на базе искусственного интеллекта.

Последствия и защитные меры

Такая атака особенно опасна для сред сборки и релизов. Единственная скомпрометированная учётная запись позволяет злоумышленникам публиковать новые вредоносные пакеты, изменять рабочие процессы или получать доступ к инфраструктуре, граничащей с продуктивной.

Для защиты специалистам по информационной безопасности стоит в первую очередь обратить внимание на точки входа и возможное раскрытие учётных данных. Рекомендуется проверить используемые версии пакетов, при возможности сохранить криминалистические артефакты перед удалением, а также ротировать любые токены, которые могли попасть в руки злоумышленников. Стоит просканировать окружения Python на наличие исполняемых файлов ".pth", неожиданных файлов "_index.js", логики загрузки Bun и недавно появившихся расширений ".abi3.so". В средах CI/CD необходимо проверить конвейеры на предмет необычных изменений, злоупотребления сокетами Docker, изменённых файлов "/etc/hosts", неожиданных привилегированных контейнеров и доступа к учётным данным для публикации пакетов.

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

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

Malicious PyPI

  • dreamgen@1.8.1
  • embiggen@0.11.97
  • ensmallen@0.8.101
  • gpsea@0.9.14
  • instructor-mcp@1.15.2
  • instructor-mcp@1.15.3
  • langchain-core-mcp@1.4.2
  • langchain-core-mcp@1.4.3
  • mem8@6.0.1
  • mflux-streamlit@0.0.3
  • mflux-streamlit@0.0.4
  • openai-mcp@2.41.1
  • openai-mcp@2.41.2
  • orchestr8-platform@3.3.2
  • phenopacket-store-toolkit@0.1.7
  • ppkt2synergy@0.1.1
  • pyphetools@0.9.120
  • ray-mcp-server@0.2.1
  • rlask@3.1.7
  • rsquests@2.34.3
  • tiktoken-mcp@0.13.1
  • tiktoken-mcp@0.13.2
  • tlask@3.1.4

Newer Loader and Delivery Indicators

  • langchain_core-setup.pth — malicious Python startup hook observed in langchain-core-mcp
  • langchain-core-mcp@1.4.2#py3-none-any-whl — affected wheel artifact
  • langchain-core-mcp@1.4.3#py3-none-any-whl — affected wheel artifact
  • os.path.join(d,"_index.js") — payload discovery logic used to search sys.path
  • _s.run([_b,"run",_j],check=False) — Bun-based execution of discovered _index.js
  • Bun/1.3.14 — observed PyPI upload User-Agent for langchain-core-mcp; not malicious by itself, but notable in this context

Native Extension Import-Time Execution Indicators

  • ensmallen_haswell.abi3.so — trojanized native extension reported in the newer bioinformatics cluster
  • ensmallen_core2.abi3.so — trojanized native extension reported in the newer bioinformatics cluster
  • .abi3.so paired with _index.js — suspicious package layout requiring review

Notable Hashes From Newly Analyzed Artifacts

  • langchain_core_mcp-1.4.2-py3-none-any.whl
  • SHA256: 6d332f814f15f19758d65026bbfd0a8c49671b319ec77b8fa1b27fc48afff7d9
  • langchain_core-setup.pth
  • SHA256: 6506d31707a39949f89534bf9705bcf889f1ecae3dbc6f4ff88d67a8be3d01b2

Additional Hunting Strings and Host Indicators

  • thebeautifulmarchoftime — fallback C2 discovery string
  • thebeautifulsnadsoftime — fallback C2 discovery string
  • /tmp/.sshu-setup.js — SSH propagation file path
  • /var/run/docker.sock — legitimate Docker socket targeted for abuse when accessible
  • harden-runner — legitimate StepSecurity defensive tooling targeted by the malware
  • step-security — legitimate StepSecurity identifier targeted by the malware
  • stepsecurity — legitimate StepSecurity identifier targeted by the malware
  • agent.stepsecurity.io — legitimate StepSecurity telemetry domain reportedly blocked by the malware
  • api.stepsecurity.io — legitimate StepSecurity API domain reportedly blocked by the malware
  • app.stepsecurity.io — legitimate Step Security application domain reportedly blocked by the malware

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