NPM взломали массово: keyv, flat-cache, 400+ пакетов. 2 млрд установок в месяц
4 августа взломали GitHub мейнтейнера keyv (127 млн загрузок/неделю). Внедрили червя в flat-cache, file-entry-cache, cacheable и ещё 434 пакета. При npm install автоматически запускается дроппер, скачивает Bun Runtime и выполняет шпионский модуль. Ворует npm-токены, GitHub-токены, AWS-ключи, Kubernetes-секреты, Vault, Stripe, Slack. Ввсё шифрует и выгружает в публичные GitHub-репозитории.
Как это работает?
В package.json добавили "preinstall": "node setup.mjs". Файл setup.mjs — обфусцированный дроппер. Он тихо качает Bun с GitHub Releases и запускает через него Math_Symbol.js (728 КБ):
execFileSync(<bun binary>, ['<script_dir>/Math_Symbol.js'], {
stdio: 'inherit',
cwd: <script_dir>
})
Почему Bun? Standalone runtime, не требует node_modules, многие сканеры его не ловят.
Что крадёт?
npm-токены — из ~/.npmrc, всех .npmrc на диске, проверяет живые через registry.npmjs.org/-/whoami
GitHub-токены — ghp_, gho_, ghs_, JWT OIDC. На Actions-раннерах читает память процесса напрямую
AWS — ~/.aws/credentials, env-переменные, EC2/ECS metadata, все секреты из AWS Secrets Manager
Kubernetes — service account token, CA, namespace, затем все секреты через API
HashiCorp Vault — токены из 6 источников, затем все KV-секреты
Stripe/Slack — sk_, pk_, xox...
Файловая система — .env, *.pem, id_rsa, *.tfvars, docker/config.json, *.kdbx, .vscode/tasks.json и ~200 других паттернов
Всё шифруется RSA и улетает в публичные GitHub-репозитории с описанием "Shai-Hulud: Here We Go Again" (уже ~1300 таких репо). Fallback: npm-cache[.]com:443/router.
Индикаторы заражения: бегом проверять!
Файлы:
setup.mjs — 54dc7ea54a1317cca0e890a2770630cf7fa6c97813e0cb9d2caa93012b350668
setup.mjs (community-версия) — fd3ca4007b225fdf8de7af4345a19179d5efa8c4bb9205f88cda806e5684b1eb
Math_Symbol.js / math_init.js — 9fc2570b7cef51c1b8df116d144d11ff4096357be7d2c4c6367cfc2509cf1bcc
Сеть: npm-cache[.]com:443/router
GitHub: любой публичный репозиторий с "Shai-Hulud: Here We Go Again" в описании
Что делать?
Проверь package-lock.json / yarn.lock на версии из списка. Если нашёл- откати.
Поищи в node_modules файлы setup.mjs и Math_Symbol.js в пакетах keyv, flat-cache, file-entry-cache, cacheable.
Смени все токены с машины, где ставился npm install — npm, GitHub, AWS, Vault, Slack, Stripe.
В CI/CD используй npm ci вместо npm install, локально — npm install --ignore-scripts.
Источник: Aikido Security
Всем добра!
















