В репозитории npm - крупнейшем каталоге программных библиотек для языка JavaScript - обнаружена серия вредоносных пакетов. Совокупное число скачиваний превысило 1600. Вредоносный код маскировался под обычные обновления популярных библиотек, что делает атаку особенно опасной для разработчиков веб-приложений и серверных решений. Пострадать могли также проекты, использующие эти библиотеки в качестве зависимостей, поскольку вредоносный код получает доступ к среде сборки и системе разработчика.
Описание
Подобные инциденты относятся к категории атак на цепочку поставок программного обеспечения. Вместо прямого нападения на конкретную компанию злоумышленник внедряет вредоносный код в инструменты, которыми пользуются сотни или тысячи разработчиков. Это позволяет охватить сразу множество целей. npm используется миллионами программистов по всему миру, и библиотеки из этого реестра входят в состав практически любого современного проекта на JavaScript. Именно поэтому даже один вредоносный пакет способен нанести значительный ущерб.
В данном случае использовалась многоступенчатая стратегия. Сначала в реестр попадала чистая версия пакета, обычно с номером 9.9.0. Через несколько дней публиковалось "обновление" с нежелательным функционалом. Такая тактика вводила в заблуждение пользователей, которые привыкли доверять обновлениям уже проверенных пакетов. Кроме того, схема затрудняет обнаружение вредоносной активности автоматическими средствами, поскольку первичная версия легитимна и не содержит подозрительного кода.
По данным Positive Technologies, все обнаруженные пакеты используют схожие методы сокрытия. Вредоносная логика свёрнута в одну строку, а строковые константы хранятся в виде числовых кодов символов. Сами вредоносные скрипты компактны - каждый занимает не больше килобайта. Такой минимализм позволяет обходить многие сигнатурные детекторы, которые ищут характерные фрагменты кода. В то же время, если разработчик просматривает код вручную, он может заметить странные конструкции, однако на это уходит время и внимание.
Вредоносная логика активируется в момент установки пакета. Сразу после установки запускается основной скрипт, который передаёт управление дополнительному модулю. Этот модуль собирает базовую информацию о системе: тип операционной системы, сетевые параметры и сведения о запущенном процессе. Затем данные отправляются на сервер злоумышленников. Интересно, что имя кампании злоумышленники оставили в открытом виде - закодировать его они не потрудились.
В числе затронутых пакетов оказались библиотеки, чьи названия имитируют компоненты для аналитики, платежных сервисов, пользовательских интерфейсов и даже генерации QR-кодов. Такое разнообразие позволяет предположить, что злоумышленники стремились охватить максимально широкую аудиторию разработчиков. Некоторые из этих пакетов, судя по названиям, могли быть рассчитаны на конкретные компании или внутренние проекты.
Атаки на цепочку поставок становятся всё более распространённым явлением. Злоумышленники понимают, что проще скомпрометировать один популярный пакет, чем взламывать отдельные компании. По этой причине исследовательские компании постоянно мониторят состояние реестров пакетов и сообщают администрации о подозрительных публикациях. Однако полностью предотвратить такие инциденты невозможно, поэтому ключевая роль остаётся за самими разработчиками.
Для конечного пользователя атака происходит незаметно. Достаточно ввести стандартную команду обновления пакета, и вредоносный код получает контроль. Жертва не видит никаких предупреждений, а после установки пакет продолжает работать как обычная библиотека. Подозрения могут не возникнуть никогда, поскольку внешне пакет ведёт себя нормально и выполняет ожидаемые функции.
На первый взгляд нагрузка выглядит безобидной. Злоумышленник получает лишь базовое представление о пользователе и его окружении. Однако именно такая информация часто становится первым этапом более сложной атаки. Собранные данные могут использоваться для целевого фишинга, подбора паролей или поиска уязвимостей в конкретной системе. Например, узнав тип операционной системы и сетевые параметры, атакующий может подобрать подходящую уязвимость или сымитировать легитимное сетевое взаимодействие с целью дальнейшего проникновения.
Помимо технической стороны, важно отметить политику сервиса. В npm такие действия рассматриваются как размещение вредоносного контента. Речь идёт о программах, которые собирают данные без ведома пользователя, а также о бэкдорах и шпионском программном обеспечении. Правила npm прямо запрещают публикацию подобного кода, даже в исследовательских целях. Именно поэтому исследователи Positive Technologies уведомили администрацию реестра об обнаруженных пакетах сразу после выявления.
Впрочем, как показывает практика, удаление вредоносных пакетов из npm не всегда происходит мгновенно. Некоторые пакеты могут оставаться доступными для скачивания в течение нескольких дней после сообщения. За это время они могут попасть в зависимости десятков или даже сотен проектов. Разработчику, который установил такой пакет, следует проверить свои проекты на наличие подозрительных зависимостей и удалить их при обнаружении.
Разработчикам стоит внимательно относиться к обновлениям зависимостей. Перед установкой новой версии пакета полезно проверить её автора, дату публикации и историю изменений. Если пакет долго не обновлялся, а затем внезапно получил новую версию с изменённым кодом, это повод насторожиться. Регулярный аудит используемых библиотек и автоматические инструменты проверки безопасности помогут снизить риск проникновения вредоносного кода. Особенно внимательными следует быть при использовании пакетов с большим количеством загрузок, поскольку они привлекают внимание злоумышленников.
Ещё одна полезная практика - следить за тем, какие файлы выполняются при установке. В экосистеме npm существуют специальные механизмы, которые позволяют пакету выполнить произвольную команду. Если такая команда обращается к внешним ресурсам или собирает системные данные, это повод насторожиться. Компании, которые разрабатывают собственные библиотеки, могут настроить внутренний прокси-репозиторий и проверять все пакеты перед тем, как они попадут в разработку. Такой подход позволяет отсечь значительную часть вредоносного кода ещё до того, как он окажется в рабочем проекте.
Пока неизвестно, кто стоит за этой кампанией. Однако массовое размещение похожих пакетов с одинаковой схемой указывает на организованный характер атаки. Подобные инциденты напоминают, что даже официальные реестры пакетов не застрахованы от злоупотреблений. Внимательность и проверка источников остаются основными инструментами защиты. Разработчикам важно помнить, что вредоносный код может быть незаметен на первый взгляд и не проявлять себя сразу после установки, а значит, ложное чувство безопасности здесь недопустимо. В конечном счёте, именно действия разработчиков определяют, насколько безопасной будет экосистема.
Индикаторы компрометации
Package
- @phonos/types
- @structureit/ir-dealapi-js
- @wame/ngx-adfs
- @wame/ngx-frf-utilities
- cclr-component-resources
- compliancepolicyserv
- connectedmerchantsserv
- ftapi-core
- lakk-analytics
- meshim-frontend-config
- nms-dashboard-js
- oc-aa-module-client
- oc-ccp-module-client
- oc-navbar-module-client
- qr-code-styling-temp
- uploader-frontend
- uploader-frontend-legacy