Зловреден npm пакет, който изглеждал като обикновен инструмент за индексиране на данни, разкри слабост в защитите на веригата за доставки на софтуер.
Пакетът indexed-btree копирал идентичността на легитимната библиотека sorted-btree и регистрирал почти два милиона седмични изтегляния. Кампанията е забележителна с това, че зловредният код не е необходимо да се изпълнява, докато разработчикът го инсталира.
Вместо това той чака в нормалния код на приложението и се активира при използване на библиотеката, превръщайки доверената зависимост във входна точка за профилиране на хоста, кражба на данни и доставяне на последващ зловреден код. Изследователи от Checkmarx идентифицираха тази активност.
От Checkmarx заявяват в доклад, споделен с Cyber Security News (CSN), че операцията показва защо проверките, фокусирани само върху инсталационните скриптове, могат да пропуснат заплахи, които се изпълняват на по-късен етап.
Мащабът създава риск за организации, чиито проекти може да са изтеглили пакета в системи за компилиране, среди за тестване или производствени услуги.
Атакуващите са създали и убедително хранилище и история на акаунта, добавяйки достоверност към пакет, проектиран да се слива с рутинната работа по разработка.
Зловреден npm пакет с 2 милиона изтегляния
Indexed-btree няма preinstall или postinstall команди в конфигурацията на пакета, така че самата инсталация не задейства зловредната рутина. Тази липса може да накара даден пакет да изглежда безопасен по време на бърз преглед.
Зареждащият модул (loader) е поставен в BTree.prototype.set, основен метод, който е вероятно да бъде извикан при запазване на данни от приложението. Когато необходимото условие е изпълнено, този код стартира обфускиран компонент от първи етап, което позволява на заплахата да се изпълни по време на нормалната работа на програмата, а не по време на по-внимателно наблюдавания етап на инсталация.
Този дизайн променя въпроса за защита от това дали даден пакет има рисков инсталатор към това какво прави той след импортиране и използване. По-ранни доклади за злоупотреба с огледални копия на зловредни пакети показват, че атакуващите продължават да адаптират доверените канали за разработка за целите на доставяне на заплахи.
Първият етап събира информация за архитектурата на операционната система, името на хоста, процесора, паметта и времето на работа на системата (uptime). Той изпраща тази информация към контролирани от атакуващите дестинации, след което се консултира със смарт договор в тестовата мрежа Ethereum Sepolia вместо с конвенционален команден сървър.
Този дизайн, базиран на блокчейн, може да затрудни прекъсването на кампанията, тъй като смарт договорът може да насочи зловредния код към нов адрес, ако предишната дестинация бъде блокирана.
След това кодът използва криптографски обмен на ключове, за да изведе ключ за декриптиране и да комбинира криптирани данни от договора в зловреден код от втори етап, според изследването.
Пакетът съдържа и функции, предназначени за премахване на файловете на зловредния код и заличаване на задвижващия механизъм от прототипния метод. Почистването би могло да ограничи доказателствата, след като приложението използва библиотеката за първи път.
Защитата на веригата за доставки се нуждае от проверки по време на изпълнение (runtime)
Кампанията илюстрира празнина, когато екипите по сигурност третират липсата на скриптове от жизнения цикъл като доказателство, че даден npm пакет е безвреден. Тази контрола не проверява зловредно поведение, внедрено директно в основните JavaScript функции на пакета.
Организациите трябва да идентифицират дали засегнатите имена или версии на пакети присъстват в изходните кодове, lockfile файловете, изображенията за компилиране, работните станции на разработчиците и системите за непрекъсната интеграция (CI).
Екипите трябва да ги премахнат, да променят потенциално изложените тайни (secrets) и да инспектират логовете за индикаторите, изброени по-долу. Прегледът на зависимостите трябва да включва собственост, история на версиите, консистентност на хранилището и код, разпространяван чрез регистъра.

Скорошен доклад за компрометиране на npm пакети също показва как доверените зависимости могат да се превърнат в директен път към средите за разработка и CI средите.
За по-сигурно покритие екипите трябва да стартират съмнителни пакети в изолирани среди и да наблюдават дъщерните процеси, променитевъв файловата система, мрежовите извиквания и поведението след извикване на често използвани методи. Това може да разкрие зловредни пътища по време на изпълнение, които статичните сканирания пропускат.
Разработчиците трябва да фиксират (pin) прегледаните версии на зависимостите, да поддържат актуални спецификациите на софтуерните компоненти (SBOM) и да налагат одобрение за нови или внезапно променени пакети.
По-широкият модел включва вълни от npm пакети със задна врата (backdoor) и злоупотреба с конфигурацията на свързване, подсилвайки необходимостта от наблюдение както на инсталацията, така и на изпълнението.
За екипите за реагиране приоритет е да определят дали библиотеката е била само изтеглена, или действително използвана в работещ процес. Доказателствата по време на изпълнение, записите на процесите и мрежовата телеметрия могат да предоставят най-ясен отговор, докато кампанията остава активна.
Индикатори за компрометиране (IoCs):-
| Тип | Индикатор | Описание |
|---|---|---|
| Зловреден npm пакет | indexed-btree | Основен зловреден пакет, представящ се за sorted-btree |
| Зловреден npm пакет | ordered-kv-index | Впоследствие премахнат свързан пакет |
| Зловреден npm пакет | btree-leaderboard | Впоследствие премахнат свързан пакет |
| Зловреден npm пакет | priority-slot-queue | Впоследствие премахнат свързан пакет |
| Зловреден npm пакет | btree-range-store | Впоследствие премахнат свързан пакет |
| Зловреден npm пакет | btree-core | Впоследствие премахнат свързан пакет |
| Зловреден npm пакет | btree-time-index | Впоследствие премахнат свързан пакет |
| Зловреден npm пакет | btree-lru-cache | Впоследствие премахнат свързан пакет |
| Зловреден npm пакет | neighbor-key-map | Впоследствие премахнат свързан пакет |
| Зловреден npm пакет | sliding-score-window | Впоследствие премахнат свързан пакет |
| Свързан npm пакет | mutex-forge | По-ранен пакет, свързан със същия смарт договор |
| Име на файл | sharedLoad.min.js | Обфускиран компонент от първи етап на зловредния код |
| GitHub хранилище | https://github.com/INDEXED-BTREE/indexed-btree/commits/main/ | Хранилище, използвано за придаване на легитимен вид на пакета |
| Ethereum Sepolia договор | 0xE390863Dac96a7118C71227C2b099B50cF602D31 | Смарт договор, използван като C2 канал за командване и управление |
| RPC крайна точка | https://eth-sepolia.g.alchemy.com/v2/D2-TbkB2m05WXSnSDOCDI | Ethereum Sepolia RPC крайна точка |
| RPC крайна точка | https://sepolia.infura.io/v3/dc7257d09fab42eca2c354c32fec1938 | Ethereum Sepolia RPC крайна точка |
| Telegram bot токен | 8961878831:AAG4WTbRUcbXI5UCaN4VXK8k57ghqqkg_qI | Telegram бот токен за извличане на данни |
| Telegram chat ID | -1003952553968 | Дестинация в Telegram за извличане на данни |
| Slack bot токен | xoxb-11307403103236-11289767127959-U58yt3zLurAvVoZOf0OBtxCW | Slack бот токен за извличане на данни |
| Slack channel ID | C0B8XPGCKQS | Дестинация в Slack за извличане на данни |
| X25519 публичен ключ | bad013df6eec5d686f4cc8551e0a5c87a0135164bdd1dafb1c75141d1b526702 | Твърдо кодиран SPKI/DER публичен ключ в шестнадесетичен формат |
Забележка: IP адресите и домейните са нарочно неутрализирани (напр. [.]), за да се предотврати случайно разрешаване на имена или хипервръзки. Възстановете ги само в контролирани платформи за разузнаване на заплахи като MISP, VirusTotal или вашата SIEM система.