Само една инсталация на обичайна JavaScript библиотека е могла да предостави на злонамерени лица достъп до облачната инфраструктура, хранилищата и вътрешните услуги на компаниите. Червеят Shai-Hulud проникна в популярни npm-пакети, които с общо 2 млрд. месечни изтегляния, а след това започна да се разпространява. Броят на заразените бързо нарастваше и според последните оценки на изследователите надхвърли 1000.

Атаката започна на 4 август след пробива в GitHub акаунта на разработчика Джаред Рей, който поддържа библиотеката keyv и няколко популярни инструмента за кеширане. Хакерите добавиха злонамерени файлове директно в основния клон на проектите, след което пуснаха нови версии чрез стандартния механизъм GitHub Actions. В резултат на това заразените версии получиха валидни npm подписи и информация за произхода на пакета, поради което външно изглеждаха като легитимни актуализации.

Под удара попаднаха keyv, flat-cache, file-entry-cache, cacheable, cache-manager и други библиотеки, които често се интегрират в приложенията не директно, а чрез вериги от зависимости.

Първите заразени пакети набираха стотици милиони изтегляния седмично. Изследователите откриха също така злонамерени версии на компоненти, свързани с Deliveroo, OneReach, Picsart, Qlik и други компании. Общите показатели за изтеглянията не съответстват на броя на заразените устройства, тъй като едни и същи проекти могат да изтеглят няколко свързани библиотеки. Всяка заразена версия съдържаше файловете setup.mjs и Math_Symbol.js, както и командата preinstall в package.json. При стартиране на npm install злонамереният код се изпълняваше автоматично още преди приключването на инсталацията. Зареждащият модул незабележимо изтегляше средата за изпълнение Bun, след което стартираше основния файл с размер около 728KB.

Зловредната програма търсеше токени за npm и GitHub, ключове за AWS, тайни за Kubernetes, данни за достъп до Docker, токени за HashiCorp Vault, Slack и Stripe. Скенер проверяваше също така .env файлове, VPN конфигурации, KeePass бази данни, Terraform състояния, настройки на среди за разработка, частни SSH ключове и редове за свързване с бази данни. На компютри с macOS и Linux програмата използваше около 200 шаблона за търсене и четеше едновременно до 64 файла.

Събраната информация се криптираше и се изпращаше в публични хранилища в GitHub с описание „Shai-Hulud: Here We Go Again“. Изследователите откриха около 1300 такива хранилища. При неуспешно качване през GitHub зловредната програма се обръщаше към домейна npm-cache.com, регистриран през май. Откраднатите токени позволяваха на червея да публикува заразени версии на пакети от името на нови разработчици. По този начин атаката преминаваше от един проект към друг, без да се налага ръчно проникване във всеки акаунт. Специалистите от Endor Labs смятат, че в много случаи престъпниците са получавали токени за публикуване от сървърите за съставяне, на които по-рано са инсталирали заразена зависимост.

На разработчиците се препоръчва да проверят lock файловете, логовете на CI/CD и всички зависимости, включително devDependencies. Екипите, които са инсталирали засегнатите версии след началото на атаката, трябва да заменят токените за npm и GitHub, облачните ключове, тайните на CI и данните за достъп до Vault. За да се намали рискът, специалистите съветват да се фиксират сигурни версии на библиотеките, да се използват overrides в npm, yarn или pnpm и да се стартира инсталацията в системите за събиране с параметъра –ignore-scripts, когато инсталационните скриптове не са необходими.