В отчёте Mandiant описан случай, когда атакующий перехватил активную сессию AI-ассистента по кодированию у неназванного SaaS-провайдера. Ассистент порекомендовал отравленное ПО, рекомендацию приняли, после чего через активную сессию разработчика установили инфостилервредоносная программа, которая собирает учётные данные и секреты с заражённой системы, похитили GitHub OAuth-токены, а затем Shai-Huludсамораспространяющийся червь, заражающий пакеты и репозитории через цепочку поставок распространился примерно по 100 внутренним репозиториям.
Параллельно подтверждены ещё два события: компрометация npm-пакета Tensorlake (версия 0.5.144) и повторное включение двух GitHub Actions, чьи release-теги по-прежнему указывали на вредоносный код.
Что именно изменилось
Захват сессии ассистента. Атакующий перехватил активную сессию AI-ассистента у неназванного SaaS-провайдера. Ассистент порекомендовал программное обеспечение, которое атакующий предварительно отравил, и эту рекомендацию приняли. После этого атакующий через активную сессию разработчика установил инфостилер посредством отравленного пакета PyPI и украл OAuth-токены GitHub. Затем он развернул самораспространяющегося червя Shai-Hulud примерно по 100 внутренним репозиториям кода и отравил пакет в официальном пространстве имён компании — другой сотрудник загрузил скомпрометированную версию, что вызвало повторное заражение.
Компрометация tensorlake 0.5.144. Скомпрометированная версия содержала обфусцированное ВПО, которое собирает учётные данные, выгружает секреты, закрепляется в системе и исполняет удалённо переданный код. Заражение запускалось через preinstall-хуксценарий, который менеджер пакетов выполняет автоматически перед установкой пакета. Этот сценарий вызывал setup.mjs — обфусцированный загрузчик, который через среду Bun передавал управление файлу Math_Symbol.jsосновной модуль вредоносной программы, похищающий учётные данные и распространяющийся дальше. Червь похищал токены npm и GitHub, учётные данные AWS, HashiCorp Vault, Kubernetes, SSH-ключи, файлы .env, криптокошельки и данные мессенджеров. Для распространения он перечислял пакеты, связанные с публикующим идентификатором жертвы, формировал Sigstore provenanceкриптографическое подтверждение происхождения сборки, которое заставляет реестр считать опубликованную версию доверенной и перепубликовывал скомпрометированные версии.
Повторное включение GitHub Actions. Два действия — actions-cool/issues-helper и actions-cool/maintain-one-comment — были скомпрометированы 18 мая 2026 года в рамках кампании Mini Shai-Huludсерия атак на цепочку поставок npm в мае 2026 года, затронувшая сотни пакетов и версий. 16 сентября 2026 года оба репозитория снова стали доступны, при этом release-теги не были очищены и по-прежнему указывали на вредоносное содержимое от 18 мая. Обфусцированный payload оставался внутри файла index.js, поэтому любой workflow, ссылающийся на действие по тегу версии, возобновил загрузку и выполнение полезной нагрузки. Эти actions автоматизируют обслуживание issues и комментариев, поэтому их workflow обычно запускаются ежедневно или при открытии issue/pull request — большинство затронутых репозиториев, вероятно, исполнили payload в течение дня после повторного включения. 25 сентября оба action снова отключили, и workflow стали падать вместо запуска payload.
Предыстория
До этого инцидента были известны несколько отдельных кампаний семейства Shai-Hulud. В мае 2026 года кампания Mini Shai-Hulud затронула 323 пакета и 639 версий в npm, а также два GitHub Actions, собиравших учётные данные из CI/CD и отправлявших их на домен t.m-kosche[.]com. Активность связали с кластером Mini Shai-Hulud по совпадению домена эксфильтрации с npm-пакетами экосистемы @antv.
В августе 2026 года npm-червь, связанный с Keyv, заразил сотни пакетов и внедрил хуки для Claude Code и Visual Studio Code. Отдельный вариант Shai-Hulud сканировал 469 мест для учётных данных на системах разработчиков, в CI/CD-инструментах, облачных конфигурациях и файлах AI-инструментов. Тогда же кампания ChainDrop затронула 444 npm-пакета. Эти кампании считаются отдельными, и имеющиеся данные не связывают их с инцидентом, описанным Mandiant.
Как устроен механизм распространения
Основная нагрузка запускается автоматически при установке пакета. Для эксфильтрации используются несколько каналов: сначала POST на iseekaigogo[.]com:443/router, а в качестве запасного варианта — публичный GitHub-репозиторий с описанием «Shai-Hulud: Here We Go Again».
Отдельный компонент — «hostage token» — использует PowerShell-монитор, который каждые 60 секунд опрашивает api.github.com/user украденным GitHub-токеном. Пока токен действителен, доступ сохраняется; если жертва отзывает токен, монитор через Invoke-Expression выполняет обработчик, удаляющий домашний каталог. На уровне хоста остаются артефакты персистентности — gh-token-monitorслужба, которая следит за украденным GitHub-токеном и стирает хост при его отзыве и kitty-monitorслужба того же назначения, оставленная другой волной заражения, устанавливаемые как persistence daemonфоновая служба, которая переживает перезагрузку и продолжает работать без участия пользователя, стирающий хост при отзыве отслеживаемого токена.
Дополнительно червь записывает .claude/settings.json и .vscode/tasks.json в доступные репозитории, чтобы повторно запуститься при открытии проекта в Claude Code или VS Code.
Почему это стало возможным
Ключевое допущение — доверие к рекомендации ассистента без проверки: ассистент порекомендовал отравленное ПО, и рекомендацию приняли. После этого атакующий использовал активную сессию разработчика для установки инфостилера и кражи OAuth-токенов.
Mandiant рекомендует держать необработанные API-ключи, долгоживущие OAuth-токены и другие секреты вне прямого доступа расширений, а рекомендованные ИИ сторонние зависимости проверять по криптографическим контрольным суммам и одобренным allowlist.
Что это меняет на практике
Разработчикам рекомендуется искать ссылки на оба скомпрометированных GitHub Actions и удалять их либо прикреплять проверенный чистый коммит. Workflow, привязанные к полному commit SHA версии до 18 мая 2026 года, не затронуты.
Порядок исправления задаётся выводом --check-host: сначала остановить сервис персистентности, затем удалить его файлы и только потом ротировать учётные данные. Отзыв отслеживаемого токена до остановки сервиса специально приводит к уничтожающему стиранию.
Для обнаружения следов компрометации используется детектор shai-hulud-detectинструмент, который ищет на диске следы компрометации цепочки поставки Shai-Hulud. Он ищет два вида свидетельств на диске: известные скомпрометированные версии пакетов и контентные IoCиндикаторы компрометации — признаки вредоносного содержимого, которые остаются на диске даже после удаления самого пакета, которые срабатывают, даже если вредоносный пакет уже удалён, но остались следы дроппера. Проверка пакетов выполняется путём разбора каждого package.json, lockfile, pyproject.toml, requirements.txt, Pipfile, poetry.lock, uv.lock и сверки разрешённых версий со списком из 5 782 записей в compromised-packages.txtфайл со списком известных скомпрометированных версий пакетов, включая транзитивные зависимости внутри node_modules/.
Сканер запускается как исполняемый скрипт с флагом --save-log, который сохраняет отчёт в файл, а путь '.' задаёт сканируемый каталог:
./shai-hulud-detector.sh --save-log shai-hulud-report.log .Коды возврата: exit 0 — чисто, exit 1 — HIGH RISK (немедленные действия), exit 2 — MEDIUM RISK (ручная проверка). В GitHub Actions задание падает при exit 1 или 2, а лог выгружается артефактом всегда. В GitLab CI запуск идёт в script, лог сохраняется как артефакт всегда. В Jenkins запуск идёт через sh-блок, лог архивируется с allowEmptyArchive: true. Pre-commit hook при ненулевом коде возврата печатает сообщение и завершает работу с exit 1, отменяя коммит.
Ограничения и открытые вопросы
Детектор выполняет только обнаружение: он не удаляет вредоносный код, не откатывает пакеты и не блокирует установки — результаты нужно проверить и исправлять вручную. Хеш-детекция ловит только точные совпадения SHA-256 с 20 известными вредоносными хешами, а обнаружение скомпрометированных пакетов требует, чтобы версия была в списке compromised-packages.txt, поэтому новые варианты требуют обновления списка. Эвристики параноидального режима дают ложные срабатывания на легитимном коде. Детектор читает состояние файловой системы и не запрашивает живые данные из реестров npm/PyPI.
Для работы требуется Bash 5.0+ (ассоциативные массивы, mapfile), поскольку macOS поставляет 3.x, а также стандартные Unix-инструменты find, grep, awk, sed, sort, comm, shasum (или sha256sum), xargs.
Публичное описание инцидента с захватом сессии AI-ассистента не раскрывает, когда произошло вторжение и каким образом атакующий перехватил активную сессию. Доступные доказательства не связывают отдельные кампании Shai-Hulud с этим инцидентом. По пакету tensorlake: версия 0.5.144 удалена из npm, предыдущая 0.5.143 на момент первых разборов оставалась чистой, а сборки PyPI и Cargo признаков заражения не показывали.
Источники
- github.com/…/README.md
- thehackernews.com/…/attacker-hijacks-ai-coding-assistant.html
- thehackernews.com/…/tensorlake-npm-package-compromised-to.html
- thehackernews.com/…/compromised-github-actions-came-back.html
- www.securitylab.ru/…/578496.php
- www.bleepingcomputer.com/news/security/github-actions-re-enabled-with-mini-shai-hulud-payload-still-active/
- github.com/…/ci-examples.md