Масштабная атака на цепочку поставок TrapDoor: вредоносные пакеты в npm, PyPI и Crates.io нацелены на разработчиков криптовалют и AI

information security

Исследователи информационной безопасности из компании Socket обнаружили скоординированную кампанию по внедрению вредоносного кода сразу в три крупнейших реестра открытого программного обеспечения: npm (менеджер пакетов для JavaScript), PyPI (репозиторий пакетов для Python) и Crates.io (репозиторий для языка Rust). Кампания, получившая кодовое название TrapDoor, направлена на кражу ключей доступа к криптокошелькам, учётных данных облачных платформ, токенов GitHub и ключей SSH у разработчиков в сфере блокчейна, децентрализованных финансов (DeFi) и искусственного интеллекта. Это не просто очередной случай вредоносного пакета, а системная угроза для всей экосистемы разработки, которая использует разные техники закрепления и латерального перемещения внутри инфраструктуры жертвы.

Описание

Согласно данным, опубликованным Socket, кампания началась 22 мая 2026 года с публикации на PyPI пакета "eth-security-auditor" версии 0.1.0. В течение нескольких дней злоумышленники выгружали версии вредоносных пакетов волнами, используя несколько учётных записей. Всего исследователи выявили более 34 уникальных названий пакетов и свыше 384 их версий и связанных артефактов. Часть из них уже удалена из реестров, однако некоторые оставались активными на момент написания материала. Кампания получила название TrapDoor, и её ключевой особенностью стало то, что пакеты маскировались под обычные инструменты разработчика - утилиты помощи, сборщики проектов, сканеры безопасности и аудиторы кода. Исследователям удалось связать активность в разных реестрах, когда они заметили, что Rust-пакеты для разработчиков Sui и Move (язык смарт-контрактов в блокчейне Sui) используют ту же инфраструктуру, что и npm- и PyPI-пакеты.

Исследователи Socket обнаружили эту связь благодаря анализу поведенческих паттернов и пересечению инфраструктуры. Оказалось, что атакующий использует единый центр управления - аккаунт на GitHub под именем "ddjidd564". С его же страницы на GitHub Pages ("ddjidd564.github.io/defi-security-best-practices/") загружаются конфигурации и дополнительные скрипты. Вредоносные пакеты нацелены на кражу ключей SSH, данных кошельков Sui, Solana и Aptos, учётных данных AWS, токенов GitHub, а также файлов браузера, переменных окружения и API-ключей. Особую опасность представляет способность украденных SSH-ключей быть использованными для латерального перемещения внутри корпоративной сети, что позволяет злоумышленнику проникать на другие серверы и красть данные из CI/CD-систем.

Наибольшее количество пакетов кампания затронула в реестре npm. Для них используется механизм postinstall (скрипт, выполняемый автоматически после установки пакета). После установки запускается общая полезная нагрузка - файл "trap-core.js" объёмом 1149 строк кода. Этот скрипт сканирует систему на наличие учётных данных, проверяет их валидность через API AWS и GitHub, а затем предпринимает меры для закрепления в системе. Среди механизмов закрепления - прописывание в файлы ".cursorrules" и "CLAUDE.md" (конфигурационные файлы для AI-ассистентов в редакторах кода), установка Git-хуков, добавление в cron (планировщик задач Linux) и systemd (система инициализации), а также использование SSH-ключей для заражения соседних машин. Один из пакетов, "dev-env-bootstrapper", выполняет двойную функцию: он и сам ворует данные, и распространяет вредоносную конфигурацию в окружение разработчика.

Для пользователей Rust в реестре Crates.io были найдены шесть пакетов с вредоносными скриптами "build.rs". Эти скрипты выполняются автоматически во время компиляции пакета, ещё до того, как разработчик запустит какую-либо команду из самого пакета. "build.rs" ищет локальные хранилища ключей (keystores) криптокошельков, шифрует их с помощью жёстко заданного XOR-ключа "cargo-build-helper-2026" и отправляет в GitHub Gists. Такая атака особенно опасна для разработчиков, работающих с платформами Sui и Move, поскольку позволяет похищать seed-фразы и приватные ключи прямо в процессе сборки проекта.

Пакеты на PyPI используют другой вектор. Они автоматически выполняют код при импорте модуля в Python-скрипт. Вредоносные пакеты загружают JavaScript-скрипт с контролируемого злоумышленником домена GitHub Pages и запускают его через команду "node -e". Это даёт атакующему возможность обновлять поведение полезной нагрузки без публикации новой версии в PyPI - достаточно изменить файлы на GitHub Pages.

Примечательно, что кампания активно экспериментирует с атаками на AI-ассистентов разработчиков. В файлах ".cursorrules" и "CLAUDE.md" вставляются скрытые инструкции с использованием нулевой ширины Unicode-символов. Эти инструкции могут побудить AI-инструменты выполнить "проверку безопасности", которая на самом деле запускает сбор и отправку данных. Кроме того, злоумышленник открыл несколько пул-реквестов (pull requests) в популярные open source проекты, такие как "browser-use/browser-use", "langchain-ai/langchain" и "run-llama/llama_index", с предложением добавить файлы ".cursorrules" или "CLAUDE.md". Некоторые из этих PR были оформлены как "документация по стандартам разработки" и содержали ссылку на ту же подконтрольную страницу GitHub Pages.

Атакующий не просто публиковал вредоносные пакеты, но и создал целый набор репозиториев-приманок с названиями вроде "defi-profit-scanner", "smart-contract-audit-toolkit", "web3-dev-toolkit-2026". Эти проекты выглядят как легитимные инструменты и привлекают внимание разработчиков, которые затем могут довериться и другим пакетам атакующего. Документ "AUDIT-MATRIX.md", найденный в репозитории злоумышленника, описывает задумку атаки как "универсальный фреймворк извлечения данных через AI-агентов" и содержит такие техники, как сканирование файловой системы, сбор переменных окружения, кредитных идентификаторов и маскировка под задачи безопасности.

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

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

Domains and infrastructure

  • ddjidd564.github.io
  • ddjidd564.github.io/defi-security-best-practices/
  • GitHub account: ddjidd564

Campaign markers and files

  • P-2024-001
  • trap-core.js
  • trap-core.js size: 48485 bytes
  • XOR key: cargo-build-helper-2026
  • Конфигурация веб-перехватчика исходного контента GitHub, получение данных

Persistence and propagation paths

  • .cursorrules
  • CLAUDE.md
  • Git hooks
  • Shell hooks
  • systemd
  • cron
  • SSH

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