В марте 2026 года группа TeamPCP взломала инфраструктуру сканера уязвимостей Trivy и запустила каскадную атаку на цепочку поставок ПО. Под удар попали CI/CD-пайплайны, облачные ключи и рабочие секреты компаний; по оценке Mandiant, число скомпрометированных SaaS-сред превысило 1000.

Главный урок инцидента неприятен своей простотой: атакующим не понадобилась неизвестная уязвимость. Им хватило доступа к одной учетной записи и токенам, которые вовремя не убрали.

Почему Trivy стал удобной целью

Trivy — популярный open source (от англ. open source — открытый исходный код) сканер уязвимостей от Aqua Security. Его используют для проверки контейнеров, Kubernetes-кластеров, репозиториев и облачной инфраструктуры. На GitHub у проекта больше 33 тыс. звезд, а связанные с ним GitHub Actions стоят в десятках тысяч рабочих процессов.

Парадокс в том, что инструмент безопасности сам стал точкой входа. Компании доверяют таким программам больше обычных зависимостей: запускают их в сборках, дают доступ к репозиториям, переменным окружения и секретам. Для злоумышленников это ценный маршрут внутрь чужой инфраструктуры.

В феврале 2026 года в репозитории Trivy появился pull request (запрос на изменение кода) от недавно созданного бота. Он использовал опасную настройку GitHub Actions: код из внешнего форка выполнялся с правами основного проекта. Так атакующие получили Personal Access Token сервисного аккаунта aqua-bot с широкими правами на организацию Aqua Security.

Как один токен запустил цепную реакцию

После первой атаки злоумышленники удалили 178 релизов Trivy, ненадолго закрыли репозиторий и опубликовали вредоносное расширение Aqua Trivy для VS Code в OpenVSX. Aqua Security сообщила об инциденте 1 марта и сменила скомпрометированные токены. Но часть артефактов — API-ключи, сертификаты и пароли — осталась у атакующих.

19 марта TeamPCP вернулась. Через сервисный аккаунт aqua-bot группа опубликовала вредоносный тег Trivy 0.69.4 и запустила автоматический пайплайн релиза. Параллельно атакующие сделали force push (принудительную перезапись истории) 75 из 76 тегов в репозитории trivy-action и подменили все семь тегов в setup-trivy.

Снаружи это выглядело почти незаметно. Нового релиза или явного подозрительного коммита не появилось, поэтому многие системы мониторинга не подняли тревогу. Теги просто начали указывать на вредоносный код, а проекты, которые ссылались на них, автоматически подтянули зараженную версию.

По данным разбора Xakep, вредоносный релиз был доступен около трех часов, а зараженные теги GitHub Actions — примерно 12 часов. Этого хватило, чтобы атака пошла дальше по сборочным цепочкам.

Что делал TeamPCP Cloud Stealer

Вредоносный модуль получил название TeamPCP Cloud Stealer. На GitHub-раннерах — машинах, которые выполняют задачи сборки, — он искал секреты в памяти процессов, переменных окружения и файлах конфигурации. Целью стали SSH-ключи, облачные учетные данные, настройки Kubernetes и Docker, файлы .env, пароли баз данных, токены рабочих сервисов и TLS-ключи.

Данные шифровались и уходили на домен, похожий на адрес Aqua Security, но с переставленными буквами в слове security. Если отправка не срабатывала, вредонос создавал в аккаунте жертвы публичный репозиторий и загружал туда архив как файл релиза.

На компьютерах разработчиков поведение отличалось: программа могла закрепиться в системе через пользовательский сервис и ждать новых команд. В Kubernetes-средах она пыталась выйти из контейнера на уровень хоста и добраться до временных облачных токенов. Это особенно опасно: такие токены живут недолго, но в момент атаки открывают доступ к реальным ресурсам.

Похожая логика риска — когда один ключ открывает больше, чем кажется, — заметна и в истории про уязвимость Ollama с утечкой ключей API и переписок. Секреты редко лежат изолированно: один найденный токен часто ведет к следующему сервису.

Почему это касается не только разработчиков

На первый взгляд атака на Trivy — проблема инженеров, DevOps-команд и служб безопасности. На практике последствия могут дойти до обычных пользователей: через украденные ключи атакующие получают доступ к хранилищам, чатам поддержки, внутренним панелям и сервисам рассылок. Оттуда уже проще запускать фишинг (от англ. phishing — выуживание), рассылать поддельные уведомления или подменять файлы обновлений.

В описании вредоноса фигурируют токены рабочих сервисов, включая мессенджеры. Поэтому бытовые запросы вроде «что делать если не запускается дискорд» или «что делать если не грузит дискорд» не стоит закрывать скачиванием случайных утилит и расширений с форумов. Пользователь ищет решение проблемы, а получает программу, которая просит лишние права и вытаскивает токены из браузера или приложений.

Для компаний урок еще жестче. Нельзя считать инструмент безопасным только потому, что он проверяет безопасность. Любая зависимость в сборке — это часть периметра, а теги в репозиториях требуют такой же дисциплины, как пароли и ключи доступа.

Практический вывод: что проверить сейчас

  • Проверьте, где в ваших проектах используются Trivy, trivy-action и setup-trivy. Если сборки ссылались на теги, затронутые атакой, пересоберите артефакты из доверенного состояния.
  • Отзовите и перевыпустите токены, которые могли попасть в CI/CD (continuous integration/continuous delivery — непрерывная сборка и доставка кода): GitHub, облачные ключи, доступы к контейнерным реестрам, Kubernetes и базам данных.
  • Замените ссылки на плавающие теги фиксацией на конкретные коммиты там, где это возможно. Это снижает риск тихой подмены версии.
  • Включите проверку подписи коммитов и релизов. Неподписанный коммит в цепочке поставок должен требовать ручной проверки.
  • Ищите признаки утечки: неизвестные публичные репозитории, странные release asset, новые сервисы автозапуска, подозрительные запросы к доменам, похожим на легитимные.
  • Не храните долгоживущие ключи в переменных окружения без ротации. Чем короче срок жизни секрета, тем меньше ущерб после утечки.
  • Для работы из кафе, аэропортов и коворкингов используйте сервис безопасного интернет-соединения, чтобы защитить соединение и приватность данных в публичных сетях.
  • Если вы не администрируете инфраструктуру, но видите просьбу установить «исправляющее» расширение или утилиту, проверьте источник. Для бытовых проблем с приложениями безопаснее использовать официальный сайт и встроенные обновления.
Поделиться: