Широко използван npm пакет се превърна в канал за доставяне и кражба на идентификационни данни, след като атакуващи внедриха саморазпространяващ се зловреден код Shai-Hulud в неговите версии.
Засегнатият пакет @7nohe/openapi-react-query-codegen, който генерира TanStack Query код, има над 150 000 изтегляния седмично.
Злонамерените версии могат да се изпълнят, докато разработчик инсталира зависимости или когато npm обработва специално създаден конфигурационен файл за компилация. Това дава възможност на зловредния софтуер да проникне в работни станции и автоматизирани среди за компилация, където често са налични идентификационни данни за публикуване, облачни услуги и изходен код.
Изследователи от JFrog идентифицираха активността като нова вълна на Mini Shai-Hulud, наречена Trinitite, появила се на 28 август. Десет версии бяха публикувани за около 20 минути, което илюстрира колко бързо компрометирането на един доверен пакет може да достигне до проекти по веригата.
В доклад, споделен с Cyber Security News (CSN), JFrog посочва, че инцидентът е сериозен, тъй като червеят краде токени и се опитва да публикува променени пакети навсякъде, където жертвата има права. Тази обратна връзка превръща една отровена зависимост в по-широк проблем по веригата за доставки.
Атакуващите изглежда са злоупотребили с работния процес за публикуване на проекта, а не със самия npm. Анализът показва, че всеки коментар към заявка за изтегляне (pull request), съдържащ точния тригер за публикуване, е можел да стартира процес, който изтегля кода на заявката и използва GitHub Actions OpenID Connect (OIDC) за получаване на доверен токен за публикуване. Липсата на проверка на поддържащия кода е позволила на потребител в GitHub да отваря заявки за изтегляне, да задейства процеса по издаване и да изпраща пакети с валиден произход (provenance).
Произходът потвърждава, че задачата по публикуване е изпълнена в хранилището, но не гарантира, че публикуваният код е безопасен.
Две първоначални предварителни версии са съдържали внедрен компонент за инсталиране, но не и пълния червей. Осем по-късни стабилни версии са съдържали зловредния код. Четири от тях са разчитали на модифициран файл binding.gyp, докато четири по-късни версии са добавили и кука за предварителна инсталация (preinstall hook).
Зареждащата програма е силно маскирана. Тя може да изтегли средата Bun, ако липсва, да декриптира зловредния софтуер, да го изпълни от временна директория и след това да изтрие този файл. Пропускането на скриптовете от жизнения цикъл на npm само по себе си може да не спре тази заплаха, тъй като node-gyp може да обработи binding.gyp по време на инсталация. Засегнатите версии на пакета трябва да се третират като компрометиране на хоста.
Докладът не приписва категорично дейността на конкретна група, въпреки че отбелязва, че пакетът се е появил около ден след ареста на заподозрени членове на TeamPCP в Австралия.
Кражба на идентификационни данни и стъпки за възстановяване
Веднъж активиран, Trinitite търси идентификационни данни, свързани с GitHub, npm, PyPI, RubyGems, облачни услуги, HashiCorp Vault и Kubernetes. Той също така е насочен към тайни от среди за непрекъсната интеграция (CI) и данни в инструменти за разработка на изкуствен интелект (AI).
Откраднатите данни се шифроват и изпращат към публични хранилища чрез GitHub токена на жертвата. Зловредният софтуер може да използва възстановения достъп за публикуване, за да променя и препубликува пакети. Той също така добавя работен процес (workflow), предназначен да събира тайни от хранилището.
Изследователите откриха също компоненти за поддържане на присъствие (persistence) за Linux и macOS, както и модул, който следи GitHub токена. Ако установи, че даден токен е анулиран, той може да задейства деструктивна процедура по почистване. Поради тази причина редът на реагиране е критичен: първо трябва да се изолира засегнатата машина преди да се анулират идентификационните данни.
Екипите, които са инсталирали засегната версия, трябва да изолират устройството или CI средата, да спрат идентифицираните потребителски услуги и да премахнат временните файлове. Те трябва да премахнат зависимостта, да фиксират известни безопасни версии, да генерират наново lock файловете и да проверят хранилищата и хронологията на версиите за неоторизирани промени.
Едва след премахването на следящия модул трябва да се извърши ротация на идентификационните данни за GitHub, npm, PyPI, RubyGems, облачни услуги, SSH и CI от чиста система.