6 кроків: Захистіть підприємство від хробака Shai-Hulud та вразливості npm вже сьогодні

6 кроків: Захистіть підприємство від хробака Shai-Hulud та вразливості npm вже сьогодні 1

Будь-яке середовище розробки, яке встановило або імпортувало один зі 172 скомпрометованих пакетів npm або PyPI, опублікованих після 11 травня, слід вважати потенційно ураженим. На уражених робочих станціях розробників цей черв’як збирає облікові дані з понад 100 шляхів до файлів: ключі AWS, приватні ключі SSH, токени npm, GitHub PAT, токени HashiCorp Vault, сервісні облікові записи Kubernetes, конфігурації Docker, історію командного рядка та гаманці криптовалют. Вперше в кампанії TeamPCP він націлений на менеджери паролів, включаючи 1Password та Bitwarden, за даними SecurityWeek.

Він викрадає конфігурації агентів ШІ Claude та Kiro, включаючи токени автентифікації сервера MCP для всіх зовнішніх сервісів, до яких підключається агент. І він не зникає після видалення пакета.

Черв’як встановлює стійкість у Claude Code (.claude/settings.json) та VS Code (.vscode/tasks.json із runOn: folderOpen), які повторно виконуються при кожному відкритті проєкту, плюс системний демон (macOS LaunchAgent / Linux systemd), який переживає перезавантаження. Ці елементи розміщуються у дереві проєкту, а не в node_modules. Видалення пакета їх не усуває. На CI-раннерах черв’як читає пам’ять процесу раннера безпосередньо через /proc/pid/mem для вилучення секретів, включаючи приховані, на Linux-раннерах. Якщо ви відкликаєте токени перед ізоляцією машини, аналіз Wiz виявив, що деструктивний демон знищує вашу домашню директорію.

Між 19:20 та 19:26 UTC 11 травня черв’як Mini Shai-Hulud опублікував 84 шкідливі версії у 42 npm-пакетах @tanstack/*. Протягом 48 годин кампанія поширилася на 172 пакети з 403 шкідливими версіями, що охоплюють npm та PyPI, за даними Mend. Лише @tanstack/react-router отримує 12,7 мільйонів завантажень на тиждень. CVE-2026-45321, CVSS 9.6. OX Security повідомив про 518 мільйонів сукупних уражених завантажень. Кожна шкідлива версія мала дійсне підтвердження походження SLSA Build Level 3. Походження було справжнім. Пакети були отруєні.

«TanStack мав правильне налаштування на папері: довірений публікаційний процес OIDC, підписане походження, 2FA для кожного облікового запису розробника. Атака все одно спрацювала», — розповів Пейтон Кеннеді, старший дослідник безпеки в Endor Labs, в ексклюзивному інтерв’ю VentureBeat. «Техніка занедбаних комітів показує, що обсяг OIDC є справжнім контролем, який має значення, а не походження, не 2FA. Якщо ваш конвеєр публікації довіряє всьому репозиторію, а не конкретному робочому процесу в конкретній гілці, коміт без історії батьківських елементів і без прив’язки до гілки достатній для отримання дійсного токена публікації. Це виправлення конфігурації в один рядок.»

Три вразливості об’єднані в один черв’як з підтвердженим походженням

Розбір ситуації TanStack викладає ланцюжок атак. 10 травня зловмисник форкнув TanStack/router під ім’ям zblgg/configuration, обраним, щоб уникнути пошуку списків форків, згідно з аналізом Snyk. Запит на злиття (pull request) запустив робочий процес pull_request_target, який отримав код форку та виконав збірку, надавши зловмиснику можливість виконання коду на раннері TanStack. Зловмисник отруїв кеш GitHub Actions. Коли легітимний розробник злив зміни до основної гілки, робочий процес випуску відновив отруєний кеш. Бінарні файли зловмисника читали /proc/pid/mem, вилучали OIDC-токен і відправляли запит безпосередньо на registry.npmjs.org. Тести провалилися. Публікацію було пропущено. 84 підписані пакети все ж досягли реєстру.

«Кожна вразливість долає межу довіри, яку припускали інші», — йдеться у звіті. Торгові методи, опубліковані після компрометації tj-actions/changed-files у березні 2025 року, були перекомбіновані в новому контексті.

Черв’як перетнув з npm в PyPI за лічені години

Microsoft Threat Intelligence підтвердив, що пакет mistralai PyPI v2.4.6 виконується при імпорті (не при встановленні), завантажуючи пейлоад, замаскований під Hugging Face Transformers. Заходи для npm (примусове виконання lockfile, –ignore-scripts) не охоплюють виконання під час імпорту Python.

Mistral AI опублікувала попередження безпеки, підтверджуючи вплив. Уражені npm-пакети були доступні з 22:45 UTC 11 травня до 01:53 UTC 12 травня (приблизно три години). Випуск PyPI mistralai==2.4.6 знаходиться на карантині. Mistral заявив, що був залучений уражений пристрій розробника, але жодна інфраструктура Mistral не була скомпрометована. SafeDep підтвердив, що Mistral ніколи не випускав v2.4.6; 11 травня коміти не надходили, і тег не існує.

Wiz задокументував повний масштаб ураження: 65 пакетів UiPath, SDK Mistral AI, OpenSearch, Guardrails AI, 20 пакетів Squawk. StepSecurity приписує кампанію TeamPCP, базуючись на перетині інструментарію з попередніми хвилями Shai-Hulud та компрометації Bitwarden CLI/Trivy. Черв’як працює під Bun, а не Node.js, щоб уникнути моніторингу безпеки Node.js.

Зловмисник розглядав агенти кодування ШІ як частину довіреного середовища виконання

Технічний аналіз Socket пейлоаду router_init.js обсягом 2,3 МБ виявляє десять класів збору облікових даних, що працюють паралельно. Черв’як записує стійкість у директорії .claude/ та .vscode/, перехоплюючи конфігурацію SessionStart Claude Code та тригер робочого процесу folderOpen VS Code. Деобфускація StepSecurity підтвердила, що черв’як також викрадає конфігурації серверів MCP Claude та Kiro (~/.claude.json, ~/.claude/mcp.json, ~/.kiro/settings/mcp.json), які зберігають ключі API та токени автентифікації для зовнішніх сервісів. Це ранній, але підтверджений випадок зловмисного програмного забезпечення в ланцюжку поставок, яке розглядає конфігурації агентів ШІ як цілі з високою цінністю облікових даних. Опис токена npm, який встановлює черв’як, говорить: “Якщо ви відкличете цей токен, він знищить комп’ютер власника”. Це не блеф.

«Що мене вразило в цьому пейлоаді, так це те, де він закріпився після запуску», — сказав Кеннеді VentureBeat. «Він вписав хуки стійкості в конфігурацію SessionStart Claude Code та тригер робочого процесу folderOpen VS Code, щоб він повторно виконувався щоразу, коли розробник відкривав проєкт, навіть після видалення npm-пакета. Зловмисник розглядав агент кодування ШІ як частину довіреного середовища виконання, чим він і є. Ці інструменти читають ваш репозиторій, виконують команди оболонки та мають доступ до тих самих секретів, що й розробник. Безпека середовища розробки тепер означає необхідність враховувати агентів, а не лише пакети.»

Сітка аудиту ланцюжка довіри CI/CD

Шість прогалин, які експлуатував Mini Shai-Hulud. Що робить ваш CI/CD сьогодні. Контроль, який закриває кожну з них.

Питання для аудиту

Що робить ваш CI/CD сьогодні

Прогалина

1. Прив’язати довірену публікацію OIDC до конкретного файлу робочого процесу в конкретній захищеній гілці. Обмежити id-token: write лише завданням публікації. Переконатися, що завдання виконується з чистого робочого простору без відновленого недовіреного кешу.

Більшість організацій надають довіру OIDC на рівні репозиторію. Будь-який робочий процес, запущений у репозиторії, може запросити токен публікації. id-token: write часто встановлюється на рівні робочого процесу, а не обмежується завданням публікації.

Черв’як досяг виконання коду всередині легітимного робочого процесу випуску через отруєння кешу, а потім витягнув OIDC-токен з пам’яті процесу раннера. Сама по собі прив’язка до гілки/робочого процесу не зупинила б цю атаку, оскільки шкідливий код вже виконувався в межах прив’язаного робочого процесу. Повне виправлення вимагає прив’язки ПЛЮС обмеження id-token: write лише для завдання публікації ПЛЮС забезпечення того, щоб це завдання використовувало чистий, незадіяний кеш.

2. Розглядати походження SLSA як необхідне, але недостатнє. Додати поведінковий аналіз під час встановлення.

Команди розглядають дійсний значок походження Sigstore як доказ безпеки пакета. npm audit signatures проходить. Значок зелений. Процеси закупівель та відповідності приймають походження як критерій.

Усі 84 шкідливі версії TanStack містять дійсні підтвердження походження SLSA Build Level 3. Перший широко повідомлений npm-черв’як з пакетами з дійсним підтвердженням. Походження підтверджує, де був побудований пакет, а не чи була збірка авторизована. Сканер ШІ Socket позначив усі 84 артефакти протягом шести хвилин після публікації. Походження не позначило жодного.

3. Ізолювати кеш GitHub Actions за межею довіри. Анулювати кеші після підозрілих PR. Ніколи не витягувати та не виконувати код форків у робочих процесах pull_request_target.

Робочі процеси, ініційовані форками, та робочі процеси випуску використовують однаковий простір імен кешу. Закриття або скасування шкідливого PR розглядається як відновлення чистого стану. pull_request_target широко використовується для бенчмаркінгу та аналізу розміру бандлів з витягуванням коду з форків PR.

Зловмисник отруїв pnpm store через pull_request_target, ініційований форком, який витягнув та виконав код форку на базовому раннері. Кеш пережив закриття PR. Наступний легітимний робочий процес випуску відновив отруєний кеш під час злиття. actions/cache@v5 використовує внутрішній токен раннера для збереження кешу, а не GITHUB_TOKEN робочого процесу, тому permissions: contents: read не запобігає модифікації. Кеннеді: «Правила захисту гілок не застосовуються до комітів, які не належать до жодної гілки, тому весь цей шар захисту не допоміг.»

4. Аудитувати optionalDependencies у lockfile та графах залежностей. Блокувати посилання github:, що вказують на коміти, які не є релізними.

Статичний аналіз та примусове виконання lockfile зосереджуються на dependencies та devDependencies. optionalDependencies із посиланнями на коміти github: не позначаються більшістю інструментів.

Черв’як вставив optionalDependencies, що вказують на коміт-сироту github: у форку зловмисника. Коли npm розпізнає залежність github:, він автоматично клонує вказаний коміт і виконує життєві цикли (включаючи prepare). Пейлоад виконувався до завершення власного кроку встановлення основного пакета. SafeDep підтвердив, що Mistral ніколи не випускав v2.4.6; коміти не надходили, і тег не існує.

5. Аудитувати імпорти залежностей Python окремо від npm-контролів. Охопити конвеєри AI/ML, що використовують guardrails-ai, mistralai, або будь-який скомпрометований пакет PyPI.

Заходи npm (примусове виконання lockfile, –ignore-scripts) застосовуються до стеку JavaScript. Python-пакети вважаються безпечними, якщо pip install завершується успішно. CI-конвеєри AI/ML розглядаються як внутрішня тестова інфраструктура, а не як цілі атаки на ланцюжок поставок.

Microsoft Threat Intelligence підтвердив, що mistralai PyPI v2.4.6 виконується при імпорті, а не при встановленні. Вставлений код у __init__.py завантажує пейлоад, замаскований під Hugging Face Transformers. –ignore-scripts не має значення для виконання під час імпорту Python. [email protected] також виконується при імпорті. Будь-який агентний репозиторій з GitHub Actions id-token: write піддається тій самій техніці вилучення OIDC. Ключі API LLM, облікові дані векторної бази даних та токени зовнішніх сервісів — все в зоні ураження.

6. Ізолювати та створити образ уражених машин перед відкликанням викрадених токенів. Не відкликати npm-токени доти, доки хост не буде збережено для криміналістичного аналізу.

Стандартна реакція на інциденти: спочатку відкликати скомпрометовані токени, потім розслідувати. Список npm-токенів та негайне відкликання — інстинктивний перший крок.

Черв’як встановлює постійний демон (macOS LaunchAgent / Linux systemd), який опитує GitHub кожні 60 секунд. При виявленні відкликання токена (помилка 40X) він запускає rm -rf ~, знищуючи домашню директорію. Опис npm-токена говорить: «Якщо ви відкличете цей токен, він знищить комп’ютер власника». Microsoft повідомила про географічно обмежену деструктивну поведінку: шанс 1 з 6 знищити / на системах, що знаходяться в Ізраїлі або Ірані. Кеннеді: «Навіть після видалення пакета, пейлоад може все ще перебувати в .claude/ з хуком SessionStart, що вказує на нього. rm -rf node_modules його не видаляє.»

Джерела: TanStack postmortem, StepSecurity, Socket, Snyk, Wiz, Microsoft Threat Intelligence, Mend, Endor Labs. 12 травня 2026 року.

План дій директора з безпеки

  • Сьогодні: «Найшвидша перевірка: знайдіть . -name ‘router_init.js’ -size +1M та grep -r ’79ac49eedf774dd4b0cfa308722bc463cfe5885c’ package-lock.json», — сказав Кеннеді. Якщо будь-яке з них дає збіг, негайно ізолюйте та створіть образ машини. Не відкликайте токени доти, доки хост не буде збережено для криміналістичного аналізу. Деструктивний демон черв’яка спрацьовує при відкликанні. Після ізоляції машини, обертайте облікові дані в такому порядку: спочатку npm-токени, потім GitHub PAT, потім ключі хмари. Шукайте артефакти стійкості .claude/settings.json та .vscode/tasks.json у кожному проєкті, який був відкритий на ураженій машині.

  • Цього тижня: Оберніть усі облікові дані, доступні з уражених хостів: npm-токени, GitHub PAT, ключі AWS, токени Vault, сервісні облікові записи K8s, SSH-ключі. Перевірте свої пакети на наявність несподіваних версій після 11 травня з комітами від [email protected]. Блокуйте filev2.getsession[.]org та git-tanstack[.]com.

  • Цього місяця: Аудитуйте кожен робочий процес GitHub Actions щодо шести виявлених прогалин. Прив’яжіть публікацію OIDC до конкретних робочих процесів у захищених гілках. Ізолюйте ключі кешу за межею довіри. Встановіть npm config set min-release-age=7d. Для команд AI/ML: перевірте guardrails-ai та mistralai на наявність уражених версій, аудитуйте CI-конвеєри на наявність доступу id-token: write та оберніть усі ключі API LLM та облікові дані векторних баз даних, доступні з CI.

  • Цього кварталу (на рівні ради директорів): Фінансуйте поведінковий аналіз на рівні реєстру пакетів. Перевірка походження сама по собі більше не є достатнім критерієм закупівлі для інструментів безпеки ланцюжка поставок. Вимагайте аудит безпеки CI/CD як частину оцінки ризиків постачальників для будь-якого інструменту, що має доступ до публікації у ваших реєстрах. Встановіть політику, згідно з якою жоден робочий процес з id-token: write не виконується з спільного кешу. Розглядайте конфігурації агентів кодування ШІ (.claude/, .kiro/, .vscode/) як сховища облікових даних, що підпадають під ті самі елементи контролю доступу, що й сховища ключів хмари.

Черв’як еволюціонує. Захисники також повинні

Це п’ята хвиля Shai-Hulud за вісім місяців. Чотири пакети SAP перетворилися на 84 пакети TanStack за два тижні. [email protected] було скомпрометовано через 29 годин, що підтверджує активне поширення через викрадену інфраструктуру CI/CD. Пізно увечері 12 травня колектив дослідників зловмисного програмного забезпечення vx-underground повідомив, що повністю озброєний код черв’яка Shai-Hulud було опубліковано у відкритому доступі. Якщо це буде підтверджено, це означає, що атака більше не обмежуватиметься TeamPCP. Будь-який зловмисник тепер може застосувати той самий ланцюжок публікації з отруєнням кешу, вилученням OIDC та підтвердженим походженням проти будь-якого npm або PyPI-пакета з неправильно налаштованим CI/CD-конвеєром.

«Ми відстежуємо цю сімейство кампаній з вересня 2025 року», — сказав Кеннеді. «Кожна хвиля обирала ціль з вищим завантаженням та вводила технічно цікавіший вектор доступу. Техніка комітів-сиріт тут справді нова. Правила захисту гілок не застосовуються до комітів, які не належать до жодної гілки. Простір безпеки ланцюжка поставок витратив багато зусиль на походження та довірену публікацію за останні два роки. Ця атака пройшла прямо крізь обидва ці засоби контролю, тому що прогалина була не в підписанні. Вона була в обсязі.»

Походження говорить вам, де був побудований пакет. Воно не говорить вам, чи була збірка авторизована. Це та прогалина, яку покликаний закрити цей аудит.

Як захиститися (Порада ІТ-Блогу): Щоб уникнути таких атак, використовуйте двофакторну автентифікацію (2FA) для всіх своїх облікових записів, особливо тих, що мають доступ до критично важливих систем. Регулярно оновлюйте все програмне забезпечення, включаючи операційну систему, браузери та програми, щоб усунути відомі вразливості.

Оригінал статті: venturebeat.com

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *