Самораспространяющийся вредонос ChainDrop скомпрометировал более 1300 пакетов в официальном реестре npm. На эти библиотеки суммарно приходится около 2 миллиардов установок в месяц. Заражение затронуло такие популярные пакеты, как Keyv (кеширование), Cacheable (кеш-абстракция), flat-cache и file-entry-cache (кеш для файлов). Вредонос самостоятельно распространяется, заражая пакеты-зависимости и внедряя свой код в проекты разработчиков.
Как работает ChainDrop
ChainDrop — это цепной червь, который распространяется через цепочку зависимостей пакетов. Вредонос использует популярные библиотеки как трамплин для заражения других проектов.
Механизм распространения:
- Злоумышленник компрометирует одну из популярных библиотек (например, Keyv или Cacheable).
- В скомпрометированную версию пакета внедряется код, который при установке запускает вредоносный скрипт.
- Скрипт автоматически ищет другие пакеты в реестре npm, которые зависят от заражённой библиотеки.
- Вредонос заражает найденные пакеты, добавляя свой код в их исходники и перепубликуя их в npm.
- Цепь продолжается: каждый новый заражённый пакет становится источником распространения для следующих пакетов-зависимостей.
Таким образом, одно заражение порождает лавину инфекций, охватывая сотни и тысячи пакетов, связанных через граф зависимостей.
Что делает вредонос
ChainDrop выполняет несколько вредоносных действий:
- Кража данных. Собирает переменные окружения (в том числе API-ключи, токены доступа, учётные данные базы данных), файлы конфигурации и отправляет их на сервер злоумышленника.
- Модификация пакетов. Изменяет код других пакетов npm, добавляя в них вредоносный код. Это позволяет вредоносу распространяться дальше.
- Командное управление. Вредонос может получать команды с сервера командно-управляющего центра (C2) и выполнять их на заражённой системе.
- Установка backdoor. Оставляет лазейку для последующего беспрепятственного доступа.
- Загрузка вредоноса. Может скачивать и запускать другой вредонос на компьютере разработчика.
Наиболее опасен тот факт, что вредонос может получить доступ к учётным данным разработчиков в npm и использовать их для заражения большего количества пакетов, а также для масштабирования атаки на другие реестры (PyPI для Python, NuGet для .NET и т. д.).
Какие пакеты заражены
Официально подтверждено заражение следующих популярных пакетов:
- Keyv — библиотека для кеширования с поддержкой разных хранилищ (Redis, MongoDB, Memcached). Более 10 млн установок в неделю.
- Cacheable — абстракция для работы с кешем. Часто используется как зависимость других пакетов.
- flat-cache — кеш для файлов на диске. Популярна в инструментах линтирования (ESLint, CoffeeScript).
- file-entry-cache — кеширование содержимого файлов. Используется в build-tools и линтерах.
- Более 1296 других пакетов, которые зависят от перечисленных выше.
Полный список заражённых пакетов опубликован на сайте npm Security Advisory. Проверить, установлен ли у вас заражённый пакет, можно командой npm audit.
Потенциальный урон
2 миллиарда установок в месяц означают, что вредонос потенциально затронул сотни тысяч разработчиков и компаний. Но масштаб кражи данных зависит от нескольких факторов:
- Время обнаружения. Чем дольше заражённый пакет находился в открытом доступе, тем больше людей его установило.
- Версии пакетов. Заражены только последние версии. Если проект использует старую версию, он не затронут. Но npm установит последнюю версию по умолчанию, если зависимость указана без fixed версии.
- Окружение разработчика. Если разработчик установил пакет на ноутбуке с доступом к приватным ключам, учётным данным или важным данным, урон будет значительнее.
- Корпоративная среда. Заражение на рабочей машине разработчика в компании может привести к компрометированию корпоративной сети.
Вредонос может использовать украденные npm-токены для заражения большего количества пакетов, создав бесконечный цикл инфекции. Это может привести к компрометированию ещё большего количества пакетов и проектов.
Что делать пользователям npm
Если вы используете Node.js и npm, необходимо незамедлительно предпринять действия.
1. Проверить, установлен ли заражённый пакет
npm audit
Команда покажет все уязвимости в установленных пакетах, включая ChainDrop. Если вы видите advisory с названием ChainDrop — вы затронуты.
2. Обновить пакеты
npm audit fix
Команда автоматически обновит заражённые пакеты до версий без вредоноса. Если исправления несовместимы с вашим проектом, используйте:
npm update npm install
3. Проверить файл package-lock.json
Убедитесь, что версии в package-lock.json соответствуют исправленным версиям. Удалите node_modules и переустановите пакеты:
rm -rf node_modules package-lock.json npm install
4. Проверить переменные окружения и учётные данные
Если вы использовали заражённый пакет на машине с доступом к API-ключам, токенам или другим чувствительным данным, рекомендуется:
- Ротировать все API-ключи и токены доступа (AWS, Google Cloud, GitHub и т. д.).
- Изменить пароли в системах управления проектами (GitHub, GitLab, Bitbucket).
- Проверить логи доступа к системам на предмет подозрительной активности.
- Изменить пароль npm аккаунта.
- Проверить аккаунт на предмет несанкционированных действий (публикация пакетов, изменение владельца).
5. Проверить логи
Если у вас есть логи установки пакетов, проверьте временной период, когда мог быть установлен заражённый пакет. Обычно это последние 1–2 недели.
Что делать мейнтейнерам пакетов
Если вы разработчик пакета, который зависит от заражённых библиотек:
- Обновите пакеты до исправленных версий.
- Запустите npm audit и убедитесь, что advisory исчез.
- Перепубликуйте вашу библиотеку с новыми версиями зависимостей (bump patch или minor версию, в зависимости от типа изменений).
- Опубликуйте security advisory о том, что вы обновили зависимости в ответ на инцидент ChainDrop.
- Уведомите пользователей вашего пакета об обновлении.
Если вы мейнтейнер Keyv, Cacheable, flat-cache или file-entry-cache, убедитесь, что опубликованы исправленные версии и что заражённые версии помечены как deprecated в npm.
Профилактика
Этот инцидент ещё раз подчёркивает важность безопасности в цепочке поставок программного обеспечения (Supply Chain Security).
- Регулярно запускайте npm audit в проекте и исправляйте уязвимости как для직 пакетов, так и для зависимостей.
- Используйте npm audit —production для проверки только production-зависимостей, если dev-зависимости не критичны.
- Ограничивайте версии пакетов в package.json: используйте точные версии для критичных библиотек вместо ^, ~.
- Используйте npm ci вместо npm install в CI/CD pipelines для гарантии воспроизводимости.
- Настройте мониторинг безопасности в GitHub (Dependabot) или других сервисах для автоматического обнаружения уязвимостей.
- Используйте инструменты для анализа зависимостей (OWASP Dependency-Check, Snyk, WhiteSource).
- Не публикуйте приватные ключи, API-ключи и другие чувствительные данные в .env файлах в репозитории. Используйте переменные окружения и системы управления секретами.
Статус инцидента
npm Security Team активно работает над удалением заражённых пакетов из реестра. Мейнтейнерам затронутых пакетов отправлены уведомления, и от них требуется немедленно опубликовать исправленные версии.
npm рекомендует всем разработчикам как можно скорее обновить заражённые пакеты и проверить свои системы на предмет компрометирования.
Почему это произошло
Вероятные причины инцидента:
- Компрометированные учётные данные мейнтейнера одной из популярных библиотек. Пароль или npm token может быть украден через фишинг, утечку данных или другим способом.
- Уязвимость в самой библиотеке, которая позволила злоумышленнику выполнить код с привилегиями мейнтейнера.
- Социальная инженерия. Злоумышленник мог убедить одного из мейнтейнеров дать ему доступ или выдать npm token.
npm рекомендует всем мейнтейнерам пакетов немедленно ротировать npm tokens, включить двухфакторную аутентификацию и использовать максимально строгие правила доступа.
Выводы
ChainDrop — серьёзная угроза для экосистемы Node.js. Компрометирование более 1300 пакетов с 2 миллиардами установок в месяц показывает, насколько уязвима цепочка поставок в современной разработке.
Немедленно проверьте свои проекты командой npm audit и обновите заражённые пакеты. Если вы использовали зараженный пакет на машине с доступом к чувствительным данным, ротируйте все ключи и токены.
Для разработчиков и мейнтейнеров это дополнительное напоминание о важности безопасности в цепочке поставок: проверяйте зависимости, ограничивайте версии, используйте двухфакторную аутентификацию и не доверяйте слепо популярности пакета. Популярность — не гарантия безопасности.
