Схема атаки TeamPCP: npm install запускает lifecycle-скрипт, который разворачивает червя Shai-Hulud и крадет секреты CI

Атака TeamPCP: как npm install запускает червя и крадет секреты CI

ИИ-инструменты 12 июля 2026 г.

Что случилось

В июне 2025 года команда «TeamPCP»‑«Дюна» добавила вредоносный код под названием Shai‑Hulud в популярные пакеты Node.js. При обычном запуске команды npm install злоумышленники использовали скрипты жизненного цикла (lifecycle scripts), которые выполняются автоматически, чтобы развернуть червя на всех машинах, где устанавливался пакет. В итоге проект, который зависел от всего 5 пакетов, получил более 2000 зависимостей, и в них оказался вредоносный код.

Источник: Habr

Почему это важно сейчас

В большинстве проектов Node.js зависимость от сторонних пакетов считается «готовой» и безопасной. Однако каждая новая зависимость может скрывать тысячи собственных зависимостей, а скрипты, которые запускаются при установке, дают злоумышленнику полный контроль над средой. Если в CI‑процессе используются секреты GitHub и токены npm с обходом 2FA, то они могут быть раскрыты и использованы для дальнейших атак. В 2026 году, когда экосистема npm продолжает расти, а автоматизация CI/CD становится нормой, понимание механизмов таких атак критически важно для каждого разработчика.

Как работает атака

  1. Lifecycle‑скрипты
    В package.json можно задать команды preinstall, postinstall, prepare и др. Они выполняются автоматически. Хакеры вставили в эти скрипты вызов node shai-hulud.js, который скачивает и запускает вредоносный код.
  2. Секреты GitHub
    В CI‑пайплайнах секреты (пароли, токены) передаются как переменные окружения. В памяти раннера они видны в открытом виде, и злоумышленник может их перехватить.
  3. Токены npm с bypass_2fa
    Такие токены позволяют публиковать пакеты без двухфакторной аутентификации. Если токен помечен как bypass_2fa: true, его можно использовать для публикации вредоносных пакетов.

Как защититься: практические шаги

Шаг Что делаем Почему это важно
1 Отключить выполнение скриптов – запустить npm install --ignore-scripts в CI и при локальной сборке. Убирает возможность запуска вредоносных скриптов.
2 Проверять lockfile – использовать npm ci вместо npm install. Устанавливает строго фиксированные версии, исключая «потенциально новые» пакеты.
3 Аудит зависимостейnpm audit и npm audit fix. Выявляет известные уязвимости и автоматически их исправляет.
4 Сканировать секретыgit-secrets, truffleHog или GitHub Actions Secret Scanning. Предотвращает утечку токенов и паролей.
5 Проверять токены npm – убедиться, что в репозитории нет токенов с bypass_2fa: true. Убирает возможность публикации вредоносных пакетов через ваш аккаунт.
6 Разрешить только проверенные пакеты – хранить whitelist в package.json и проверять подписи (если поддерживается). Ограничивает доступ к непроверенным пакетам.

Что проверить сейчас: чеклист

  1. Есть ли в package.json скрипты preinstall, postinstall, prepare?
  2. Если да, просмотрите их содержимое.
  3. Запускаете ли вы npm install без флага --ignore-scripts?
  4. Если да, добавьте этот флаг в CI‑конфигурацию.
  5. Используете ли вы npm ci?
  6. Если нет, переключитесь на него для чистой установки.
  7. Проведён ли аудит зависимостей (npm audit)?
  8. Если нет, запустите его и исправьте найденные проблемы.
  9. Проверены ли секреты GitHub на утечки?
  10. Используйте встроенный сканер секретов или сторонние инструменты.
  11. В репозитории нет ли токенов npm с bypass_2fa: true?
  12. Удалите их и замените безопасными токенами.

Итоги и дальнейшие действия

Атака TeamPCP, произошедшая в 2025 году, показала, как легко можно внедрить вредоносный код через обычные инструменты npm. Следуя простым правилам: отключать скрипты, использовать lockfile, проводить аудит и проверять секреты, вы можете защитить свой проект от подобных угроз. Начните с проверки чеклиста уже сегодня – это займет не более 15 минут и даст вам уверенность, что ваши зависимости безопасны.

Источники

Что почитать дальше

Теги