Реестр npm переживает масштабную атаку самовоспроизводящегося червя: по данным StepSecurity, вредоносный код уже обнаружен в 444 пакетах и 2212 версиях от более чем десятка издателей, а суммарно затронутые пакеты скачиваются более двух миллиардов раз в месяц. Кампанию назвали ChainDrop — в отличие от прежних вариантов червя Shai-Hulud, новая версия использует блокчейн Ethereum для управления (техника EtherHiding).
С чего началось
Всё началось с компрометации GitHub-аккаунта Джареда Урэя — мейнтейнера пакета Keyv (свыше 150 миллионов еженедельных загрузок), который даёт единый интерфейс для работы с key-value хранилищами. Версия 6.0.0, опубликованная около 9:00 UTC, содержала свежую модификацию вредоноса. Под тем же аккаунтом вышли отравленные версии и других популярных пакетов: cacheable, flat-cache, file-entry-cache, cacheable-request, cache-manager, ecto. Позже атака перекинулась на пакеты других организаций — @deliveroo/reevent, @or-sdk/invitations, @picsart/ai-sdk, @qlik/embed-runtime, picasso.js.
Исследователи из Aikido Security отметили, что вредоносные файлы пушились прямо в основную ветку, после чего сразу срезался новый релиз, — то есть отравленные версии публиковались с валидной подписью, сгенерированной GitHub Actions. Урэй подтвердил, что использовал OpenID Connect для npm и одноразовые коды для GitHub, то есть не держал долгоживущих статических токенов; доступ к аккаунту он вернул около 20:00 UTC и заявил о полном аудите.
Что делает вредонос
В пакеты добавлялись файлы setup.mjs и Math_Symbol.js (в некоторых случаях переименованный в math_init.js). Их запускал preinstall-скрипт при установке пакета, после чего скачивался и исполнялся второй, обфусцированный payload размером 710 КБ. Дроппер предварительно скачивает легитимный JavaScript-рантайм Bun.
Червь ищет в окружении облачные учётные данные, секреты инфраструктуры, токены разработчиков, конфигурационные файлы ИИ и криптовалютные кошельки, а также сканирует память CI/CD-раннеров в поисках временных секретов. По данным Wiz, список целей вырос почти на 70% и теперь включает хранилища учётных данных ИИ-агентов (Claude, OpenAI, Codex, Cursor, Gemini), криптокошельки Foundry, Solana и Monero, секреты самохостинговых CI (включая master.key Jenkins, Argo CD, Harbor), конфигурации Alibaba Cloud и Tencent Cloud, а также системные файлы вроде /etc/shadow. Новинкой стали механизмы персистентности внутри редакторов: через tasks.json в VS Code и hooks в Claude Code.
Как защититься
StepSecurity советует рассматривать любую рабочую станцию или раннер, где выполнялась заражённая версия, как скомпрометированные: ротировать npm-токены автоматизации, GitHub-токены PAT и SSH-ключи, облачные учётные данные (~/.aws, ~/.config/gcloud, Azure), сервисные аккаунты Kubernetes и секреты из переменных окружения и .env. Мейнтейнерам стоит считать свои publish-токены скомпрометированными: вторая волна кампании показала, что дополнительные аккаунты мейнтейнеров публиковали идентичный payload в течение того же часа.
В CI полезен флаг npm --ignore-scripts — он игнорирует preinstall-скрипт. Менеджеры пакетов (npm, pnpm, Yarn, Bun) поддерживают политику минимального возраста релиза: настройка от 3 до 7 дней даст запас времени, если новая версия окажется отравленной. npm начал удалять вредоносные версии в течение двух часов, но, поскольку это червь, атака продолжает распространяться через новые скомпрометированные аккаунты.
Источник: csoonline.com