Инциденты

В npm, PyPI и Crates.io нашли 34 вредоносных пакета TrapDoor: под ударом разработчики, криптокошельки и AI-проекты

Маша Даровская
By Маша Даровская , IT-редактор и автор
В npm, PyPI и Crates.io нашли 34 вредоносных пакета TrapDoor: под ударом разработчики, криптокошельки и AI-проекты
Обложка © Anonhaven

Исследователи Socket обнаружили крупную кампанию в открытых пакетных репозиториях npm, PyPI и Crates.io. Кампания получила название TrapDoor. Злоумышленники опубликовали более 34 вредоносных пакетов и свыше 384 связанных версий и артефактов. Цель — разработчики из крипто, DeFi, Solana, Sui, Move и AI-сообществ. Некоторые из пакетов уже удалены, а другие все еще активны на момент написания статьи.

Атака построена вокруг привычного рабочего процесса. Человек устанавливает пакет, импортирует библиотеку или собирает проект, а вредоносный код запускается после установки, при импорте или во время компиляции. Именно это делает supply chain-атаки такими опасными. Разработчик не открывает подозрительный файл из письма и не запускает неизвестный установщик. Он делает обычную вещь — ставит зависимость.

Первым замеченным компонентом кампании стал PyPI-пакет eth-security-auditor версии 0.1.0, опубликованный 22 мая 2026 года. После этого пакеты начали появляться волнами сразу в нескольких экосистемах. Названия подбирались так, чтобы выглядеть полезными: сканеры безопасности, инструменты для проверки кошельков, помощники для Solidity, загрузчики окружения, утилиты для AI-разработки и средства настройки рабочих пространств.

В npm были замечены пакеты с названиями вроде prompt-engineering-toolkit, llm-context-compressor, wallet-security-checker, web3-secrets-detector, solidity-deploy-guard, deployment-key-auditor и dev-env-bootstrapper. В PyPI — cryptowallet-safety, defi-risk-scanner, env-loader-cli, git-config-sync, solidity-build-guard. В Crates.io — пакеты, имитирующие инструменты для Sui и Move-разработки: move-project-builder, sui-framework-helpers, sui-sdk-build-utils и другие.

Такая маскировка рассчитана на доверие. Разработчик криптопроекта может действительно искать инструмент для проверки кошелька или конфигурации. AI-разработчик — пакет для работы с контекстом модели или промпт инженеринга. Solidity-разработчик — помощник для деплоя. Так вредоносный пакет прячется за задачей, которая выглядит полезной для конкретной аудитории.

TrapDoor крадет широкий набор данных: SSH-ключи, AWS-учётные данные, GitHub-токены, API-ключи, переменные окружения, браузерные профили, базы логинов, данные расширений криптокошельков, локальные конфигурационные файлы, keystore-файлы Sui, Solana и Aptos. Такой набор открывает путь к репозиториям, CI/CD, облакам, внутренним серверам и другим системам, куда разработчик имеет доступ.

Самая развитая часть кампании связана с npm. Там вредоносные пакеты используют postinstall-хуки — скрипты, которые запускаются автоматически после установки зависимости. После запуска они подгружают общий payload trap-core.js. Это крупный модуль для сбора секретов, проверки украденных токенов и закрепления в окружении.

trap-core.js ищет чувствительные данные, проверяет AWS- и GitHub-токены через API, пытается использовать найденные SSH-ключи для дальнейшего перемещения и создаёт механизмы сохранения доступа. Среди способов закрепления упоминаются Git hooks, shell hooks, cron-задачи, systemd-сервисы, SSH-распространение, а также файлы .cursorrules и CLAUDE.md, которые всё чаще используются в проектах с AI-ассистентами.

PyPI-пакеты работают иначе. Они запускаются при импорте, скачивают JavaScript с инфраструктуры злоумышленника и выполняют его через node -e. Такой подход даёт атакующему гибкость: поведение можно менять на внешнем сервере без публикации новой версии пакета. Разработчик видит обычный Python-пакет, но реальная логика скрыта.

В Crates.io вредоносные Rust-пакеты используют build.rs. Этот файл выполняется во время сборки проекта. Для Rust-разработчиков это привычный механизм, но именно поэтому он опасен в чужом пакете. Код может запуститься еще до того, как разработчик начнет использовать библиотеку напрямую. В TrapDoor такие скрипты искали локальные keystore-файлы Sui и Move-разработчиков, шифровали данные простым XOR-ключом и отправляли их через GitHub Gists.

Отдельная часть кампании связана с AI-ассистентами для разработки. Злоумышленники модифицировали .cursorrules и CLAUDE.md, добавляя инструкции, которые могли влиять на поведение AI-инструментов в проекте. Такие файлы обычно используются для подсказок модели: как писать код, какие правила соблюдать, как работать с репозиторием. В TrapDoor этот механизм пытались использовать против самого разработчика — как способ скрыто подтолкнуть AI-ассистента к действиям, выгодным атакующему.

Инфраструктура кампании указывает на подготовку, а не на случайную публикацию пары пакетов. Socket связывает активность с GitHub-аккаунтом ddjidd564, GitHub Pages-доменом и общими маркерами в payload. В репозиториях злоумышленника находились не только полезные нагрузки, но и материалы, похожие на операционный playbook: описание сбора данных, маскировки под аудит безопасности, работы с AI-агентами и эксфильтрации.

Атакующий также открывал pull request в проекты, связанные с AI и developer tooling. Среди упомянутых целей — LangChain, Langflow, LlamaIndex, MetaGPT, OpenHands и другие. Это доказывает направление интереса: злоумышленник пытался приблизиться к инструментам, через которые работают разработчики и AI-агенты.

Socket быстро классифицировал пакеты как вредоносные и сообщил о них в затронутые реестры. Исследователи указывают, что часть пакетов уже была удалена, часть оставалась активной на момент анализа. Это типичная проблема открытых репозиториев: даже быстро удаленный пакет может попасть в кеши, зеркала, lockfile, артефакты сборки или локальные окружения разработчиков.

Разработчикам стоит проверить зависимости package-lock.json, yarn.lock, pnpm-lock.yaml, requirements.txt, poetry.lock, Cargo.lock и историю установок. Если среди них есть подозрительные пакеты из кампании или похожие «аудиторы», «сканеры» и «помощники», проект нужно разбирать как возможный инцидент.

Также стоит проверить секреты. После запуска вредоносного пакета безопаснее перевыпустить GitHub-токены, SSH-ключи, cloud credentials, API-ключи, seed-фразы и ключи кошельков. Простое удаление пакета не отменяет факт возможной кражи.

В AI-конфигурацииях нужно проверить .cursorrules, CLAUDE.md, системные подсказки, Git hooks и project-level инструкции для AI-инструментов. В таких файлах не должно быть скрытых команд, странных правил, невидимых Unicode-символов и инструкций на сбор или передачу секретов.

В CI/CD установку зависимостей лучше запускать в изолированной среде с минимальными правами. Сборочный контейнер не должен иметь доступ ко всем секретам компании по умолчанию.

Также для npm стоит ограничивать postinstall, для Rust — внимательно смотреть build.rs, для Python — проверять код, который выполняется при импорте. Автоматический запуск кода из новой зависимости — один из главных каналов таких атак.

Есть новость? Станьте автором.

Мы сотрудничаем с независимыми исследователями и специалистами по кибербезопасности. Отправьте нам новость или предложите статью на рассмотрение редакции.