Взлом GitHub-репозиториев Grafana Labs: как атака на цепочку поставок npm привела к краже кодовой базы и вымогательству

от автора

Часть I: Первопричина — атака Mini Shai-Hulud на экосистему TanStack

Цепочка поставок как вектор атаки

11 мая 2026 года, в промежутке с 19:20 до 19:26 UTC, произошло одно из наиболее технически изощрённых событий в истории атак на цепочку поставок npm. Группировка TeamPCP опубликовала 84 вредоносные версии пакетов в рамках 42 пакетов из пространства имён @tanstack/* — и всё это за шесть минут.

Кампания получила название Mini Shai-Hulud — отсылка к гигантским песчаным червям из вселенной «Дюны» Фрэнка Герберта. Это не первая волна активности TeamPCP: до этого они скомпрометировали сканер Trivy от Aqua Security в марте 2026-го и npm-пакет Bitwarden CLI в апреле 2026-го. Каждая следующая волна технически сложнее предыдущей.

Как работала атака: три уязвимости в одной цепочке

Атака объединила три уязвимости, каждая из которых по отдельности была бы недостаточна. Злоумышленник создал форк репозитория TanStack/router, открыл pull request, который запустил workflow с триггером pull_request_target, и отравил кэш GitHub Actions через границу доверия fork↔base. Когда легитимный workflow сработал, отравленный кэш был восстановлен, а вредоносный код извлёк OIDC-токен прямо из памяти процесса runner’а.

Ключевой момент: злоумышленники не крали статические npm-токены. Вместо этого они извлекали runtime OIDC-токены напрямую из памяти процесса runner’а, что позволило им аутентифицироваться легитимным образом через trusted publisher bindings и публиковать скомпрометированные обновления в npm-реестр.

Масштаб заражения

К концу дня было задокументировано более 170 скомпрометированных пакетов в npm и PyPI, включая Mistral AI, UiPath, OpenSearch и Guardrails AI. Для эксфильтрации использовалась тройная C2-архитектура: тайпсквоттинговый домен git-tanstack.com, децентрализованная сеть Session messenger и GitHub API dead drops, где украденные токены создавали репозитории с названиями из вселенной «Дюны».

Примечательно, что это первый задокументированный случай, когда вредоносные npm-пакеты несли валидную SLSA-провенанс — криптографический сертификат, генерируемый Sigstore и призванный подтвердить, что пакет собран из доверенного источника. Иными словами, инструменты проверки подлинности оказались бесполезны.

Часть II: Официальное заявление Grafana Labs

Ниже я Вам привел официальное сообщение команды Grafana Labs, опубликованное сегодня (19 мая 2026 года). Оно воспроизводится в полном объёме, поскольку представляет собой образцовый пример прозрачной коммуникации с сообществом в кризисной ситуации.
Если кому-то интересно то Вы можете ознакомиться с их сообщением по ссылке: https://grafana.com/blog/grafana-labs-security-update-latest-on-tanstack-npm-supply-chain-ransomware-incident/?pg=blog

16 мая 2026 года Grafana Labs подтвердила целевую атаку со стороны киберпреступной группировки, которая получила несанкционированный доступ к нашим репозиториям GitHub и скачала нашу кодовую базу. Затем злоумышленники потребовали выкуп, угрожая опубликовать данные.
С момента публикации наших первоначальных выводов расследование продолжалось, и мы публикуем этот материал, чтобы поделиться более подробной информацией об ответных мерах и принятых шагах по ограничению последствий. Полный отчёт по результатам расследования будет опубликован по его завершении.
На сегодняшний день расследование не выявило никаких свидетельств компрометации производственных систем или операций клиентов. Инцидент был строго ограничен средой GitHub Grafana Labs и не затронул наши производственные системы или платформу Grafana Cloud.
После первоначальной оценки мы выяснили, что помимо исходного кода загруженный контент включал GitHub-репозитории, которые некоторые команды Grafana Labs используют для совместной работы и хранения внутренней операционной информации и других сведений о нашей деятельности. Это включает деловые контактные имена и адреса электронной почты, которые были бы переданы в контексте профессиональных отношений, — но не информацию, полученную из производственных систем или обработанную через платформу Grafana Cloud.
Для пользователей open source-проектов Grafana Labs и платформы Grafana Cloud: наша кодовая база была скачана, но не была изменена. В настоящее время от наших клиентов или пользователей open source-решений не требуется никаких действий.
Расследование продолжается: мы продолжаем изучать журналы, телеметрию и все доступные данные в репозиториях GitHub компании. Если мы когда-либо установим, что системы или операции какого-либо клиента затронуты, мы уведомим его напрямую.
В Grafana Labs завоевание и поддержание доверия сообщества — это основа всего, что мы делаем. Мы понимаем, что клиенты полагаются на нас как на надёжного партнёра, и мы не относимся к этой ответственности легкомысленно. Мы публикуем это обновление в духе прозрачности, потому что понимаем: у вас могут возникнуть вопросы, и мы воспринимаем эту ситуацию серьёзно.
Краткое изложение и предыстория
Инцидент берёт начало в атаке на цепочку поставок npm TanStack в рамках кампании Mini Shai-Hulud. Мы обнаружили вредоносную активность 11 мая и немедленно инициировали план реагирования на инциденты.
Мы провели анализ и оперативно ротировали значительное количество токенов GitHub workflow, однако один пропущенный токен позволил атакующим получить доступ к нашим репозиториям GitHub. Последующая проверка подтвердила, что конкретный GitHub workflow, который мы изначально считали незатронутым, был фактически скомпрометирован.
16 мая мы получили от злоумышленников требование о выплате выкупа в обмен на нераскрытие нашей кодовой базы. Grafana Labs приняла решение не выплачивать выкуп. Это решение согласуется с официальной позицией ФБР: выплата выкупа не гарантирует безопасность и лишь стимулирует дальнейшую преступную деятельность.
Как только мы получили контакт от вымогателей, мы немедленно начали принимать меры по ограничению последствий, которые включали ротацию токенов автоматизации, внедрение расширенного мониторинга, аудит всех коммитов с момента инцидента 11 мая и существенное усиление защиты GitHub.
Мы также уведомили федеральные правоохранительные органы и будем поддерживать с ними постоянный диалог по данной ситуации.
Масштаб инцидента и принятые меры
Текущие выводы указывают на то, что масштаб инцидента ограничен репозиториями GitHub Grafana Labs, которые включают публичный и приватный исходный код, а также внутренние GitHub-репозитории.
Нет никаких свидетельств компрометации производственных систем или операций клиентов.
В рамках наших стандартных практик безопасности мы поделимся дополнительной информацией из нашего пост-инцидентного обзора по завершении расследования.
Grafana Labs также принимает меры по усилению безопасности для защиты наших систем. В настоящее время мы реализуем масштабные меры по дополнительной защите наших конвейеров CI/CD (непрерывной интеграции и непрерывного развёртывания) и предотвращению повторения подобных инцидентов.
Наши команды сосредоточены на продолжении расследования и внедрении усиленных средств контроля безопасности.

Часть III: Технический разбор — как именно это произошло

Шаг 1: Форк и внедрение вредоносного кода

Атака начиналась стандартно для open-source экосистемы: злоумышленник создал форк публичного репозитория Grafana — действие, выглядящее совершенно безобидно. Затем в форк был внедрён вредоносный curl-запрос. Когда уязвимый workflow с триггером pull_request_target выполнился, он запустил команду внутри доверенной CI-среды — это позволило атакующему сдампить переменные окружения и извлечь привилегированный GitHub-токен.

Шаг 2: Canary-токен как детектор вторжения

Вторжение было обнаружено потому, что один из тысяч canary-токенов, которые Grafana рассеяла по всей своей среде, был активирован — это намеренно подброшенный фальшивый credential, спроектированный так, чтобы выдать сигнал тревоги в момент, когда кто-то его коснётся.

Это решение оказалось ключевым. Когда атакующий собирал секреты из скомпрометированной build-среды, он подобрал один из таких «приманок», и сигнал сработал. Сообщество отреагировало с долей иронии: компания, которая продаёт инструменты наблюдаемости всему миру, сама спаслась благодаря именно observability-технике.

Шаг 3: Эксфильтрация и вымогательство

После скачивания кода злоумышленник перешёл к вымогательству, требуя оплату в обмен на нераскрытие репозиториев. Группировка CoinbaseCartel, предположительно являющаяся ответвлением экосистемы ShinyHunters, Scattered Spider и LAPSUS$, разместила Grafana на своём сайте утечек в даркнете — однако на момент публикации украденный код опубликован не был.

Часть IV: Почему это важно для каждого DevOps-инженера

«Pwn Request» — уязвимость, которая никуда не ушла

Первопричина была отслежена до недавно включённого GitHub Action, содержащего уязвимость типа «Pwn Request» — неправильную конфигурацию в workflow, запускаемом по событию pull_request_target, которая предоставляла внешним контрибьюторам доступ к production-секретам во время CI-прогонов.

Этот паттерн задокументирован GitHub Security Lab годами. Кампания, отслеживавшаяся Wiz Research между мартом и апрелем 2026 года, использовала AI-генерированные pull request’ы для открытия более 500 вредоносных submissions в сотнях репозиториев, нацеленных на ту же уязвимость.

Что нужно проверить прямо сейчас

Если вы поддерживаете публичные или приватные GitHub-репозитории с CI/CD-пайплайнами, вот минимальный чеклист:

1. Аудит workflow-файлов:

Откройте директорию .github/workflows и найдите все файлы, использующие pull_request_target. Убедитесь, что workflow не checkout’ит и не исполняет код из pull request’а напрямую.

2. Ротация токенов:

Если ваша команда устанавливала любую из затронутых версий @tanstack/* 11 мая, ротируйте AWS, GCP, Kubernetes, Vault, GitHub, npm и SSH-credentials, доступные с хоста установки.

3. Проверка на персистентность:

Проверьте наличие persistence-демона по пути ~/Library/LaunchAgents/com.user.gh-token-monitor.plist на macOS или ~/.config/systemd/user/gh-token-monitor.service на Linux и удалите его перед отзывом любых токенов.

4. Блокировка C2-инфраструктуры:

На уровне DNS или прокси заблокируйте git-tanstack.com, *.getsession.org и 83.142.209.194.

5. Внедрите canary-токены:

Если вы управляете частной организацией, рассмотрите возможность размещения собственных canary-токенов в build-средах: именно для этого сценария они и существуют — и инцидент с Grafana показывает, что они работают.

Часть V: Уроки и выводы

Прозрачность как стратегический актив

Grafana Labs сделала нечто редкое: публичное раскрытие было выпущено в тот же день, что и требование о выкупе — это намеренный сигнал о нежелании компании вступать в переговоры. Большинство компаний предпочитают тихо платить или тянуть время. Grafana выбрала другой путь — и это усилило, а не подорвало доверие сообщества.

Отказ платить выкуп — единственно верное решение

Позиция Grafana Labs согласуется с позицией ФБР и большинства регуляторов: выплата выкупа не гарантирует получения данных обратно и лишь финансирует следующие атаки. CoinbaseCartel с сентября 2025 года уже насчитывает более 170 жертв в технологическом, здравоохранительном, производственном и транспортном секторах. Каждая выплата — это вклад в расширение этой инфраструктуры.

Заключение

Инцидент с Grafana Labs — это не история о провале одной компании. Это история о системной уязвимости, которая прямо сейчас присутствует в тысячах репозиториев. Атакующие не ломали пароли и не фишили сотрудников — они воспользовались задокументированным, публично известным паттерном в GitHub Actions, который большинство команд попросту не проверяли.

Grafana Labs ответила правильно: быстро обнаружила (canary-токены), быстро раскрыла (в тот же день), отказалась платить (правильное решение) и вступила в диалог с правоохранителями. Это образец кризисных коммуникаций в сфере кибербезопасности.

Вопрос не в том, случится ли подобное с вашей организацией. Вопрос в том, обнаружите ли вы это раньше, чем злоумышленники закончат скачивать ваши данные.

ссылка на оригинал статьи https://habr.com/ru/articles/1037180/