Исследователи Checkmarx обнаружили npm-пакет indexed-btree, который выдаёт себя за легитимную библиотеку sorted-btree и набрал 2 миллиона загрузок в неделю. В отличие от типичных атак на цепочку поставок, вредоносный код здесь не помещён в скрипты установки — он спрятан в обычном методе библиотеки, который выполняется уже во время работы приложения. Из-за этого установка пакета выглядит чистой и не запускает механизм одобрения npm v12защитный механизм npm, который требует явного подтверждения перед выполнением скриптов жизненного цикла зависимостей, таких как preinstall, install и postinstall.
Вместе с 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 или перечисленные связанные пакеты, следует сменить все секреты и восстановить среду разработки из безопасной резервной копии.
Ограничения и открытые вопросы
Исследователи не формулируют ограничений своих выводов и не перечисляют открытых вопросов о поведении пакетов.