Mini Shai-Hulud, пов’язаний із групою TeamPCP, перетворився на одного з найнебезпечніших червів в екосистемах npm і PyPI: він скомпрометував пакети TanStack, UiPath, Mistral AI, OpenSearch і Guardrails AI, публікуючи шкідливі версії через легітимні GitHub Actions із валідним підписом SLSA і потім автоматично поширюючись на інші пакети того самого мейнтейнера; розробникам і компаніям, які використовують ці екосистеми, необхідно негайно переглянути використовувані версії, відкликати токени npm/GitHub і перевірити інфраструктуру CI/CD на ознаки компрометації.
Технічні деталі атаки Mini Shai-Hulud
Основний вектор в екосистемі TanStack — ланцюжок атак на GitHub Actions. За даними команди TanStack, зловмисники використали три ключові елементи: тригер pull_request_target, отруєння кешу GitHub Actions і витяг токена OIDC з пам’яті процесу раннера на етапі виконання (postmortem TanStack; дослідження щодо кешу GitHub Actions — Adnan Khan).
Подальші кроки атаки на TanStack виглядали так:
- підготовка шкідливого payload у форку проєкту на GitHub;
- ін’єкція шкідливих файлів у публіковані tarball npm-пакетів;
- захоплення легітимного workflow TanStack/router через викрадений OIDC-токен і випуск скомпрометованих версій через офіційний конвеєр релізів.
У результаті були опубліковані шкідливі версії 42 пакетів (84 версії) в екосистемі TanStack; інциденту присвоєно ідентифікатор CVE-2026-45321 з оцінкою CVSS 9.6, що відображено в advisory проєкту на GitHub (GitHub Security Advisory) і в базі NVD (NVD CVE-2026-45321).
Ключовий компонент шкідливого коду в npm-пакетах — обфускований JavaScript-файл router_init.js, який:
- профілює середовище виконання (операційна система, контекст запуску, інструменти розробки);
- запускає багатофункціональний викрадач облікових даних, націлений на хмарних провайдерів, криптовалютні гаманці, інструменти роботи з AI, месенджери та системи CI, зокрема GitHub Actions;
- ексфільтрує дані на домен filev2.getsession[.]org, що належить до децентралізованого месенджера Session, що знижує ймовірність блокування трафіку в корпоративних мережах;
- як резервний канал, комітить зашифровані дані в репозиторії під контролем атакувальників через GitHub GraphQL API, використовуючи викрадені токени GitHub; автор комітів маскується під
[email protected].
Для закріплення в системі шкідливе ПЗ впроваджує персистентність в IDE Claude Code і Visual Studio Code, щоб викрадач облікових даних запускався під час кожного старту середовища розробки. Додатково встановлюється сервіс gh-token-monitor для моніторингу та повторної ексфільтрації токенів GitHub, а також додаються два шкідливі workflow GitHub Actions, які серіалізують секрети репозиторію в JSON і надсилають їх на сервер api.masscan[.]cloud.
Особливість черв’яка — здатність самостійного поширення в екосистемі npm. Шкідливий код:
- шукає публікаційний токен npm із прапорцем bypass_2fa=true;
- перелічує всі пакети, опубліковані тим самим мейнтейнери;
- через викрадений OIDC-токен GitHub отримує індивідуальні токени публікації для кожного пакета, оминаючи традиційні механізми автентифікації.
Скомпрометовані npm-пакети поширюються з валідними атестаціями SLSA Build Level 3, тобто атака вперше продемонструвала можливість випуску шкідливих, але формально «доказово відтворюваних» збірок через довірений конвеєр (аналіз StepSecurity).
Розширення кампанії за межі TanStack
Черв’як Mini Shai-Hulud вийшов за рамки TanStack і зачепив інші проєкти та екосистеми, зокрема PyPI. Підтверджені такі скомпрометовані пакети й версії:
- [email protected] (PyPI)
- [email protected] (PyPI)
- @opensearch-project/opensearch: 3.5.3, 3.6.2, 3.7.0, 3.8.0
- @squawk/[email protected]
- @squawk/[email protected]
- @squawk/[email protected]
- @tallyui/connector-medusa: 1.0.1, 1.0.2, 1.0.3
- @tallyui/connector-vendure: 1.0.1, 1.0.2, 1.0.3
Аналіз Microsoft щодо шкідливого пакета [email protected] показує, що він завантажує викрадач облікових даних із хоста 83.142.209[.]194 і містить логіку, залежну від країни та мови системи: шкідливий код уникає російськомовних середовищ і має «географічно обмежену деструктивну гілку» з імовірністю 1 до 6 виконати rm -rf /, коли система, на його думку, перебуває в Ізраїлі або Ірані (аналіз Microsoft Threat Intelligence).
Компрометація [email protected] особливо небезпечна, оскільки шкідливий код виконується вже під час імпорту модуля. Згідно з аналізом Socket (розбір Socket), пакет:
- перевіряє, що виконується в Linux;
- завантажує артефакт за адресою https://git-tanstack.com/transformers.pyz;
- записує його в
/tmp/transformers.pyzі запускає за допомогоюpython3без будь-якої перевірки цілісності.
Контекст і особливості загрози
Щонайменше три аспекти роблять Mini Shai-Hulud якісно новим рівнем загрози для ланцюга постачання програмного забезпечення:
- Саморозповсюджуваний черв’як в екосистемі npm. Шкідливе ПЗ не просто одноразово компрометує пакет, а активно шукає й заражає інші пакети того самого мейнтейнера, використовуючи особливості керування токенами npm та інтеграції з GitHub OIDC.
- Зловживання довіреними механізмами — SLSA і OIDC. Організації, які покладалися на SLSA Build Level 3 і «безсекретні» конвеєри з OIDC як на гарантію довіри, отримали наочний приклад того, що компрометація раннера й workflow здатна перетворити ці механізми на канал доставки шкідливого коду.
- Евристичне ухилення й нетривіальна деструктивність. Використання інфраструктури Session (домен getsession[.]org) знижує ймовірність мережевої блокади, а геозалежна логіка у версії для mistralai створює комбіновану загрозу шпигунства й цільового знищення даних.
Атака демонструє зріле розуміння зловмисниками внутрішніх механізмів GitHub Actions і керування кешем, як це раніше докладно описано в дослідженні щодо отруєння кешу (аналіз кешу GitHub Actions), і показує, що навіть «інфраструктурний» код CI/CD слід розглядати як пріоритетний об’єкт захисту.
Оцінка впливу
Найбільшому ризику піддаються:
- команди розробки, які використовують TanStack і перелічені вище пакети npm/PyPI безпосередньо або транзитивно (через залежності);
- організації, де GitHub Actions має широкі повноваження (write до репозиторіїв, керування релізами, видача токенів OIDC в хмарні акаунти);
- компанії, що активно використовують AI-інструменти та бібліотеки (Mistral, Guardrails, AI-плагіни) і CI/CD-інфраструктуру на базі GitHub Actions.
Потенційні наслідки за відсутності реакції включають:
- компрометацію ланцюга постачання ПЗ: випуск шкідливих версій внутрішніх бібліотек та застосунків через легітимні конвеєри збірки;
- витік секретів (токени, паролі, API-ключі) з GitHub, CI/CD і хмарних середовищ через впроваджені workflow і сервіс gh-token-monitor;
- пряму шкоду інфраструктурі — від несанкціонованого доступу до репозиторіїв і хмарних ресурсів до потенційного стирання файлової системи на окремих цільових хостах;
- репутаційні та регуляторні ризики, якщо через заражені ланцюги постачання постраждають клієнти або партнери.
З огляду на характер черв’яка та критичний бал CVSS 9.6 для CVE-2026-45321, інцидент слід розглядати як інцидент найвищого пріоритету для всіх організацій, що покладаються на GitHub Actions і публічні реєстри залежностей.
Практичні рекомендації
1. Інвентаризація та очищення залежностей
- Негайно перевірити, чи використовувалися в проєктах такі версії:
- усі зачеплені пакети TanStack за advisory GHSA-g7cv-rxg3-hmpx;
guardrails-ai==0.10.1,mistralai==2.4.6(PyPI);@opensearch-project/opensearchверсій 3.5.3, 3.6.2, 3.7.0, 3.8.0;@squawk/[email protected],@squawk/[email protected],@squawk/[email protected];@tallyui/connector-medusaі@tallyui/connector-vendureверсій 1.0.1–1.0.3.
- Перевірити файли блокувань (package-lock.json, pnpm-lock.yaml, poetry.lock, requirements.txt) і журнали збірок CI, а не лише поточну конфігурацію залежностей.
- Для виявлених шкідливих версій:
- негайно оновитися до виправлених версій або відкотитися до відомих безпечних релізів;
- перезібрати й повторно задеплоїти зачеплені застосунки.
2. Перевірка ознак компрометації
- За журналами мережі й проксі: пошук звернень до
filev2.getsession[.]org,api.masscan[.]cloud,83.142.209[.]194,git-tanstack.com/transformers.pyz.
- У файловій системі машин розробників і CI-раннерів:
- наявність
router_init.jsпоза очікуваним контекстом; - сліди
/tmp/transformers.pyzта його запусківpython3 /tmp/transformers.pyzу журналах shell.
- наявність
- У GitHub:
- пошук комітів з автором
[email protected]:
git log --author="[email protected]"; - аудит каталогу
.github/workflowsна предмет нещодавно доданих або змінених workflow, особливо тих, що містять серіалізацію секретів і мережеві звернення до зовнішніх хостів; - перевірка встановлених і оновлених розширень для VS Code і Claude Code, що з’явилися синхронно з використанням скомпрометованих пакетів.
- пошук комітів з автором
3. Керування токенами npm/GitHub і OIDC
- Відreкликати й перевипустити:
- токени публікації npm, особливо з прапорцем
bypass_2fa; - персональні токени доступу GitHub і секрети, що використовуються в GitHub Actions;
- ролі й довірчі політики, пов’язані з OIDC-токенами GitHub у хмарних акаунтах.
- токени публікації npm, особливо з прапорцем
- Обмежити використання тригера
pull_request_targetлише випадками, де він об’єктивно необхідний; розглянути перенесення чутливих workflow наpull_requestбез підвищених прав. - Посилити політику прав для GitHub Actions:
- мінімально необхідні дозволи (principle of least privilege) для
GITHUB_TOKENі окремих workflow; - заборону на запис у репозиторій із workflow, пов’язаних з обробкою зовнішніх pull request, без додаткової валідації.
- мінімально необхідні дозволи (principle of least privilege) для
4. Політика довіри до SLSA й артефактів збірки
- Переглянути внутрішні політики, які автоматично довіряють пакетам із «високим рівнем» SLSA чи іншими атестаціями provenance: атестація джерела збірки не скасовує необхідності аналізу вмісту.
- Увімкнути в pipeline:
- статичний і динамічний аналіз залежностей;
- перевірку на відомі IOC і домени керування;
- окремий контроль безпеки для артефактів, що надходять із fork-репозиторіїв або від зовнішніх контриб’юторів.
Ключовий висновок для команд розробки й безпеки: Mini Shai-Hulud показав, що самих лише довірених конвеєрів збірки, атестацій SLSA й механізму OIDC недостатньо — необхідно негайно провести аудит залежностей на наявність зачеплених версій, відкликати й перевипустити всі токени npm/GitHub, пов’язані зі скомпрометованими проєктами й раннерами, а також посилити конфігурацію GitHub Actions (обмежити pull_request_target і права workflow), щоб закрити вектори поширення, продемонстровані в цій кампанії.