Назад к блогу

Вредоносный npm-пакет спрятал загрузчик в runtime-методе библиотеки

Вредоносный npm-пакет спрятал загрузчик в runtime-методе библиотеки

Исследователи Checkmarx выявили семейство npm-пакетов, маскирующихся под популярные библиотеки и заражающих приложения не на этапе установки, а во время выполнения — вредоносный загрузчик спрятан в обычном runtime-методе. Схема обходит встроенные защиты npm от вредоносных скриптов, из-за чего стандартные сканеры и проверки установки оказываются бесполезны. Этот случай показывает, что привычные меры безопасности цепочки поставок перестают работать, когда атака переносится в код, исполняемый уже после запуска приложения.

Исследователи Checkmarx обнаружили npm-пакет indexed-btree, который выдаёт себя за легитимную библиотеку sorted-btree и набрал 2 миллиона загрузок в неделю. В отличие от типичных атак на цепочку поставок, вредоносный код здесь не помещён в скрипты установки — он спрятан в обычном методе библиотеки, который выполняется уже во время работы приложения. Из-за этого установка пакета выглядит чистой и не запускает механизм одобрения npm v12.

Вместе с indexed-btree Checkmarx нашла девять связанных пакетов, которые также удалены с npm: ordered-kv-index, btree-leaderboard, priority-slot-queue, btree-range-store, btree-core, btree-time-index, btree-lru-cache, neighbor-key-map и sliding-score-window.

Что именно изменилось

Загрузчик вредоносного кода спрятан в основной функции библиотеки, которую вызывают постоянно. Он срабатывает во время работы приложения при обычном вызове этой функции. При срабатывании запускается обфусцированная первая стадия вредоносной программы — скрытый начальный этап, который затем разворачивает вторую стадию, зашифрованную и хранящуюся отдельно.

Дальше вредоносный код собирает сведения о системе: архитектуру, имя хоста, процессор, память и время работы. Эти данные передаются через жёстко заданные каналы Slack и Telegram. Для управления используется смарт-контракт Ethereum в тестовой сети Sepolia: вредоносный код опрашивает его для получения команд, а обмен ключами X25519 применяется для вывода ключа AES и расшифровки второй стадии. Когда операторы решают завершить атаку, вредоносный код может удалить свои файлы и убрать вредоносный триггер из кода пакета.

Как это обходит защиту на этапе установки

Ключевая мера защиты npm — блокировка lifecycle-скриптов зависимостей, таких как preinstall, install и postinstall, если они не одобрены явно. Отдельные меры не дают npm автоматически получать зависимости из Git-репозиториев или удалённых URL без разрешения.

indexed-btree обходит эти защиты, вообще не используя установочные скрипты. Установка выглядит чистой и не задействует механизмы одобрения npm v12. Поскольку вредоносный код проявляется только в рантайме, он обходит стандартные инструменты taint-анализа и большинство статических сканеров.

Порядок стадий жизненного цикла задан префиксами: pre<event> выполняется до <event>, а post<event> — после. В примере с make сначала идёт "preinstall": "./configure", затем "install": "make && make install". Но описанная кампания эти стадии не использует.

Предыстория

С конца 2025 года атаки на цепочку поставок неоднократно затрагивали экосистемы открытого исходного кода. В июне 2026 года GitHub анонсировал набор мер безопасности npm, призванных предотвратить такие атаки. Нынешний случай отличается тем, что вредоносный код не находится в установочных скриптах, а спрятан в runtime-методе библиотеки.

Злоумышленники приложили большие усилия, чтобы проект выглядел легитимным: создали похожий на настоящий репозиторий GitHub, наполнили историю коммитов и оформили аккаунт разработчика. Среди связанных пакетов были и с большим числом загрузок — например, btree-core (1 951 274 загрузки) и btree-leaderboard (493 685 загрузок).

Почему это сделали

Атака эксплуатирует то, что защита npm сосредоточена на этапе установки. Меры блокируют скрипты жизненного цикла зависимостей без явного одобрения, но не проверяют поведение библиотеки после того, как она попала в приложение. Перенос загрузчика в обычный метод, который вызывается постоянно, позволяет пройти мимо этих проверок: установка чистая, а вредоносный код срабатывает позже.

Кампания, возможно, принесла значительную прибыль: по данным Checkmarx, используется кошелёк со 109 ETH.

Что это меняет на практике

Отключение или блокировка lifecycle-скриптов установки (preinstall, install, postinstall) больше не гарантирует безопасность: вредоносный код может срабатывать при обычном вызове функций библиотеки. Разработчикам советуют не полагаться только на сканирование во время установки, а применять анализ поведения во время выполнения (runtime behavioral analysis).

Тем, кто установил indexed-btree или перечисленные связанные пакеты, следует сменить все секреты и восстановить среду разработки из безопасной резервной копии.

Ограничения и открытые вопросы

Исследователи не формулируют ограничений своих выводов и не перечисляют открытых вопросов о поведении пакетов.

Источники

Похожее