В современном мире разработки программного обеспечения обеспечение безопасности цепочки поставок программного обеспечения приобретает особенно важное значение. Недавний инцидент, связанный с компрометацией пакета eslint-config-prettier, широко используемого среди JavaScript-разработчиков, привлек внимание всей отрасли. eslint-config-prettier – это npm-пакет, который помогает интегрировать популярный инструмент автоматического форматирования кода Prettier с линтером ESLint, отключая правила, конфликтующие с форматированием. Внезапное обнаружение, что несколько последних версий этого пакета содержали вредоносный код, вызвало масштабные опасения и обеспокоенность среди разработчиков и компаний, использующих эти зависимости в своих проектах. Инцидент открыл новые грани сложности защиты цепочек поставок и показал, насколько человеческий фактор может стать уязвимостью в глобальной экосистеме open source.
Компрометация пакета eslint-config-prettier заключалась в публикации нескольких версий пакета – 8.10.1, 9.1.1, 10.
1.6 и 10.1.7 – содержащих вредоносный код, который активировался на платформе Windows. Атака была реализована через заражённый скрипт install.
js, который автоматически загружал и запускал вредоносный файл node-gyp.dll. Эта DLL выполняла скрытый вредоносный код, позволяющий злоумышленникам получить доступ к системе пользователя. По сообщениям, атака затронула и другие npm-пакеты, среди которых eslint-plugin-prettier, а также unrelated, но популярные пакеты, такие как ‘is’ и ‘got-fetch’. Расследование позволило выявить, что компрометация стала результатом фишингового письма, направленного на главного разработчика и мейнтейнера JounQin, в результате чего злоумышленники получили доступ к npm-токену и опубликовали заражённые версии.
Этот случай является классическим примером атаки на человеческий фактор в цепочке поставок ПО, подтверждая, что даже высококвалифицированные специалисты могут стать объектами целевых социнженерных кампаний. Национальная база уязвимостей (NVD) присвоила инциденту идентификатор CVE-2025-54313, описывая его как инъекцию вредоносного кода в популярные версии пакета. Помимо технических деталей вредоносного кода, стоит отметить распространённость этого пакета и широту его использования в различных проектах – от небольших библиотек до крупных корпоративных приложений. Автоматизированные инструменты для управления зависимостями, такие как Dependabot и Renovate, сыграли двоякую роль в этой истории. С одной стороны, они активно обновляли проекты, в том числе и до заражённых версий, что привело к распространению угрозы по множеству репозиториев.
С другой стороны, раннее обнаружение версии с вредоносным кодом позволило оперативно реагировать и выпускать патчи. Эксперты по безопасности настоятельно рекомендуют разработчикам и компаниям как можно скорее проверить используемые версии eslint-config-prettier и связанных с ним пакетов, исключив из своих проектов уязвимые релизы, а также наложить жёсткое ограничение на версии зависимостей для предотвращения автоматизированных и незапланированных обновлений в CI/CD процессах. Помимо замены и фиксации безопасных версий, необходимо внимательно проанализировать логи сборок и окружающую инфраструктуру на предмет аномалий, поскольку запуск вредоносного кода может повлечь долгосрочные последствия для безопасности. В рамках предпринятых действий мейнтейнер пакета инициировал удаление уязвимых версий из npm, их объявление deprecated и публикацию новых, чистых релизов. Этот случай напоминает всему сообществу о важности использования многофакторной аутентификации, защиты учетных записей и повышенного контроля за ключами доступа к инфраструктуре публикаций.
Помимо самой атаки, интересным аспектом является то, что злоумышленники пошли на расширение кампании, захватывая популярные пакеты «is» и «got-fetch», что свидетельствует о систематическом и целенаправленном характере атаки на npm-экосистему. Особенно опасным стал инструмент вредоносного ПО, внедрённый в got-fetch, который включал информациюшпион Pycoon и специфические атаки на системы Windows через загрузочную библиотеку crashreporter.dll. Данный инцидент отчасти иллюстрирует рост угроз безопасности в open source мире, где уязвимости в одном популярном компоненте могут привести к брешам безопасности тысяч проектов. Рассмотрение уроков, которые можно извлечь из этого случая, включает не только технические меры, но и организационные, такие как обучение разработчиков выявлять и противостоять социальному инжинирингу, мониторинг активности учетных записей и непрерывное улучшение практик DevSecOps.