4 августа 2026 года злоумышленники взломали GitHub-аккаунт мейнтейнера keyv — библиотеки для хранения ключей и значений с примерно 127 миллионами еженедельных загрузок npm. Тот же мейнтейнер владеет пакетами cacheable, flat-cache, file-entry-cache и другими популярными кэширующими утилитами, поэтому атака затронула всю семью пакетов. Вредоносные файлы попали прямо в main-ветку, после чего сразу были выпущены новые версии. При этом они опубликованы в npm с валидной подписью provenance от GitHub Actions.
Среди скомпрометированных пакетов — keyv 6.0.0 (604 млн загрузок в месяц), flat-cache 6.1.24 (580 млн), file-entry-cache 11.1.6 (571 млн), cacheable-request 13.0.20 (137 млн), cacheable 2.5.1, cache-manager 7.2.10 и другие. Червь быстро распространился на чужие пакеты, включая @deliveroo/reevent, @or-sdk/invitations, @picsart/ai-sdk, @qlik/embed-runtime, picasso.js. На момент написания статьи скомпрометировано минимум 434 пакета (1381 версия) с суммарным числом установок свыше 2 миллиардов в месяц.
Каждый заражённый пакет получил два файла — setup.mjs и Math_Symbol.js, а в package.json добавилась запись "preinstall": "node setup.mjs". При запуске npm install setup.mjs автоматически выполнялся до завершения установки. Это обфусцированный дроппер: он скачивает Bun JavaScript runtime с GitHub и запускает через него настоящий payload — Math_Symbol.js.
Math_Symbol.js — обфусцированный файл на 728 КБ. Он содержит набор креденшел-стилеров. Среди целей — npm-токены (читает .npmrc, проверяет их через registry.npmjs.org), GitHub-токены разных форматов (включая чтение памяти GitHub Actions runner и кражу OIDC-токенов), AWS credentials (из файлов, переменных окружения, IMDSv2/IMDSv1 и AWS Secrets Manager), секреты Kubernetes (через service account token и Kubernetes API), токены HashiCorp Vault (из шести источников, включая env и Kubernetes auth), ключи Stripe и Slack. Плюс файловый сканер по ~200 glob-паттернам: .env, приватные ключи, SSH-конфиги, Terraform state, docker/config.json, KeePass-базы, VPN-конфиги, IDE-конфиги и другое. Файлы больше 5 МБ пропускаются.
Собранные данные шифруются RSA-ключом, так что расшифровать их может только атакующий. Экфильтрация идёт в публичные GitHub-репозитории с описанием "Shai-Hulud: Here We Go Again" — таких репозиториев около 1300. Если загрузка в GitHub не удаётся, данные уходят на https://npm-cache[.]com:443/router.
Aikido, компания, описавшая атаку, рекомендует пользователям проверить центральный фид и отфильтровать malware-проблемы. Их бесплатный план покрывает детект. Также предлагается Aikido Safe Chain — open-source инструмент, который перехватывает npm, npx, yarn, pnpm и проверяет пакеты через Aikido Intel до установки. В статье приведены индикаторы компрометации: хеши setup.mjs, Math_Symbol.js, URL экфильтрации и признак заражения — публичные GitHub-репозитории с описанием "Shai-Hulud: Here We Go Again".