Назад к блогу

Захват сессии AI-ассистента и червь Shai-Hulud: что подтверждено

Захват сессии AI-ассистента и червь Shai-Hulud: что подтверждено

Mandiant подтвердила случай, когда атакующий перехватил активную сессию AI-ассистента по кодированию и через отравленную рекомендацию установил инфостилер, похитил GitHub-токены и распространил червя Shai-Hulud примерно по 100 внутренним репозиториям. Одновременно подтверждены компрометация npm-пакета Tensorlake и повторное включение двух GitHub Actions, чьи теги по-прежнему ссылались на вредоносный код. Разбор показывает, как AI-инструменты и цепочки поставок ПО становятся единым вектором атаки.

В отчёте 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. 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 и 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. Он ищет два вида свидетельств на диске: известные скомпрометированные версии пакетов и контентные 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 признаков заражения не показывали.

Источники

Похожее