15 сентября произошла масштабная атака на репозиторий npm, используемый для хранения JavaScript-библиотек. Злоумышленники внедрили вредоносный код в популярные модули с миллионами еженедельных установок. Вирусная нагрузка собирала данные аутентификации, включая токены и криптографические ключи, а также автоматически распространялась на другие пакеты. Среди жертв — популярная библиотека @ctrl/tinycolor. Согласно данным Aikido Security, было затронуто около 150 модулей, включая продукты Crowdstrike.
Механизм заражения и действия вредоноса
Первоисточник атаки пока не установлен. Стиль исполнения напоминает недавний инцидент s1ngularity, что предполагает использование фишинга. Процесс распространения включает:
- Инъекцию вредоносного скрипта bundle.js в пост-установочный хук пакетов. При установке модуля код активируется, работая во всех ОС, включая Windows и UNIX-системы.
- Загрузку адаптированной под платформу версии утилиты TruffleHog для сканирования файловых систем и репозиториев на наличие высокоэнтропийных строк (API-ключей, токенов доступа).
- Парсинг переменных окружения (GITHUB_TOKEN, NPM_TOKEN и др.) с последующей проверкой их валидности через запросы к API npm и GitHub.
- Автоматическое обновление версий доступных жертве пакетов: скрипт скачивает текущую версию модуля, инкрементирует номер подверсии, добавляет ссылку на bundle.js и публикует модифицированный код в npm.
- Перевод приватных репозиториев разработчиков в публичный статус для упрощения доступа к данным.
Эксплуатация украденной информации
Утечка конфиденциальных данных реализована двумя путями:
Использование GitHub-репозитория. С использованием скомпрометированного токена создается публичное хранилище Shai-Hulud, куда помещается JSON-файл с собранными секретами и метаданными системы.
Применение GitHub Actions. Запускается автоматизированный процесс (github/workflows/shai-hulud-workflow.yml), который кодирует украденные данные и отправляет их через вебхук на контролируемый злоумышленниками домен webhook[.]site.
Меры по устранению последствий
Информация о заражении tinycolor и других пакетов появилась в ночь на 16 сентября. К утру npm начал удаление вредоносных версий, восстановив исходный код модулей. В официальной истории пакетов следы атаки отсутствуют, но факт компрометации подтверждён уведомлениями GitHub. После 5 часов отсутствия новых инцидентов угроза считалась нейтрализованной. Однако из-за червячной природы атаки возможны повторные взломы, если npm не запретит использование опасных файлов.
Для пострадавших рекомендованы следующие действия:
- восстановление предыдущих версий пакетов и очистка npm-кэша;
- проверка инфраструктуры CI/CD и рабочих станций на признаки вмешательства;
- мониторинг логов на предмет подозрительных операций npm publish;
- смена всех критических токенов и ключей (npm, GitHub, AWS, GCP, Azure), которые могли быть раскрыты.
Продукты «Лаборатории Касперского» классифицируют угрозу как Worm.Script.Shulud.*. Полный список заражённых модулей доступен на GitHub.



