Новая атака на цепочку поставок Trivy: вредоносная версия сканера уязвимостей заражает тысячи CI/CD-пайплайнов через GitHub Actions

information security

В конце марта 2026 года экосистема популярного сканера уязвимостей для контейнеров и инфраструктуры Trivy стала целью второй за месяц сложной атаки на цепочку поставок. Если первая атака была связана с расширением для VS Code, то новый инцидент затронул официальное действие GitHub Actions, что потенциально поставило под угрозу тысячи пайплайнов непрерывной интеграции и доставки. Вредоносный код, замаскированный под легитимный скрипт сканирования, был нацелен на хищение критически важных секретов, включая облачные учётные данные, токены Kubernetes и SSH-ключи.

Описание

По данным экспертов по безопасности, угроза была обнаружена 19 марта примерно в 19:15 по Всемирному координированному времени. Изначально сообщалось о компрометации версии Trivy 0.69.4, однако быстро выяснилось, что масштабы атаки гораздо шире. Злоумышленник, получив доступ к учётным данным с правами на запись в репозиторий, выполнил принудительный перезапись 75 из 76 тегов версий в официальном репозитории aquasecurity/trivy-action на GitHub. Это действие, по сути, превратило доверенные ссылки на версии в механизм распространения вредоносной программы-сборщика данных. Поскольку более 10 000 рабочих процессов на GitHub ссылаются на это действие, потенциальный радиус поражения оказался значительным.

Аналитики компании Socket, специализирующейся на безопасности цепочек поставок, сообщили о выявлении этой активности в реальном времени. Их система сгенерировала 182 записи в потоке угроз, связанных с вредоносными действиями GitHub Actions в рамках этой кампании, которые были корректно классифицированы как бэкдоры, сборщики данных или средства разведки. Любой CI/CD-пайплайн, ссылающийся на aquasecurity/trivy-action по тегу версии, включая широко используемые, такие как @0.34.2, @0.33.0 или @0.18.0, начинает исполнять вредоносный код ещё до запуска легитимного сканирования Trivy. На момент публикации предупреждения единственной незатронутой версией оставался тег @0.35.0.

Инцидент

Механизм атаки демонстрирует высокий уровень изощрённости. Вместо внесения изменений в ветку или создания нового релиза, что оставило бы следы в истории коммитов, злоумышленник использовал принудительную перезапись существующих тегов. Каждый из 75 тегов был перенаправлен на новый вредоносный коммит, метаданные которого были тщательно подделаны под оригинальный коммит, связанный с конкретным тегом. Для этого использовалось дерево файлов из последнего коммита в основной ветке, где легитимный файл entrypoint.sh был заменён на вредоносную полезную нагрузку. В результате на странице релизов GitHub каждый скомпрометированный тег отображал все ожидаемые метаданные и даже значок "Immutable" (неизменяемый), однако визуальный индикатор "0 коммитов в master с момента этого релижа" для старых версий выдавал подлог.

Вредоносный скрипт entrypoint.sh был спроектирован для выполнения в среде GitHub Actions runner и действовал в три этапа. Сначала происходил сбор данных: скрипт извлекал переменные среды из процессов раннера, а на размещённых GitHubом раннерах под Linux с помощью Python-скрипта, исполняемого с привилегиями sudo, осуществлялся дамп памяти процесса для поиска секретов в формате JSON. На само-хостовых раннерах запускался комплексный сборщик учётных данных с файловой системы, нацеленный на SSH-ключи, конфигурации AWS, GCP, Azure, токены сервисных аккаунтов Kubernetes, файлы окружения (.env) и даже ключи криптовалютных кошельков, в частности, для экосистемы Solana.

На втором этапе все собранные данные шифровались с использованием гибридной схемы: случайный сессионный ключ использовался для шифрования методом AES-256-CBC, после чего сам этот ключ шифровался публичным RSA-ключом злоумышленника. На этапе эксфильтрации зашифрованный пакет отправлялся через HTTPS POST на домен scan[.]aquasecurtiy[.]org, использующий опечатку в названии легитимного домена Aqua Security. В случае неудачи основного канала сценарий использовал токен GitHub (PAT), переданный в рабочий процесс, для создания публичного репозитория tpcp-docs в аккаунте жертвы и загрузки туда украденных данных как приложения к релизу, что обеспечивало злоумышленнику устойчивый канал получения информации.

По мнению аналитиков, стиль атаки и кодовая база указывают на группу угроз, известную как TeamPCP, которая специализируется на облачных средах. Последующие обновления от сопровождающих Trivy подтвердили, что атака стала возможной из-за скомпрометированных ранее учётных данных с правами на запись, выкраденных из среды CI Trivy во время инцидента в начале марта. Хотя секреты были заменены, процесс ротации не был полностью атомарным, что позволило угрозе сохранить доступ к новым учётным данным и выполнить аутентифицированные операции по перезаписи тегов.

Для организаций, использующих Trivy в своих CI/CD-процессах, первоочередной мерой является немедленный переход от указания версий по тегам к жёсткой привязке по хешу коммита. Единственным безопасным вариантом на момент обнаружения атаки являлся коммит с хешем 57a97c7e7821a5776cebc9bb87c984fa69cba8f1. Любой пайплайн, исполнивший скомпрометированный тег, следует считать полностью скомпрометированным, что требует ротации всех секретов, доступных этому рабочему процессу. Этот инцидент в очередной раз подчёркивает критическую важность управления доступом к репозиториям и необходимость привязки зависимостей в цепочках поставок программного обеспечения к неизменяемым идентификаторам, таким как хеши коммитов, а не к изменяемым тегам.

Индикаторы компрометации

Doomains

  • scan.aquasecurtiy.org

SHA256

  • 18a24f83e807479438dcab7a1804c51a00dafc1d526698a66e0640d1e5dd671a

Compromised Actions

  • aquasecurity/trivy-action@0.0.1 (f7773844)
  • aquasecurity/trivy-action@0.0.2 (f5c9fd92)
  • aquasecurity/trivy-action@0.0.3 (22e864e7)
  • aquasecurity/trivy-action@0.0.4 (6ec7aaf3)
  • aquasecurity/trivy-action@0.0.5 (555e7ad4)
  • aquasecurity/trivy-action@0.0.6 (794b6d99)
  • aquasecurity/trivy-action@0.0.7 (506d7ff0)
  • aquasecurity/trivy-action@0.0.8 (91d5e0a1)
  • aquasecurity/trivy-action@0.0.9 (252554b0)
  • aquasecurity/trivy-action@0.0.10 (b9faa60f)
  • aquasecurity/trivy-action@0.0.11 (3c615ac0)
  • aquasecurity/trivy-action@0.0.12 (c19401b2)
  • aquasecurity/trivy-action@0.0.13 (4209dcad)
  • aquasecurity/trivy-action@0.0.14 (61fbe20b)
  • aquasecurity/trivy-action@0.0.15 (0d49ceb3)
  • aquasecurity/trivy-action@0.0.16 (2e7964d5)
  • aquasecurity/trivy-action@0.0.17 (1d74e4cf)
  • aquasecurity/trivy-action@0.0.18 (3201dddd)
  • aquasecurity/trivy-action@0.0.19 (ea56cd31)
  • aquasecurity/trivy-action@0.0.20 (9738180d)
  • aquasecurity/trivy-action@0.0.21 (ef3a510e)
  • aquasecurity/trivy-action@0.0.22 (bb75a905)
  • aquasecurity/trivy-action@0.1.0 (9e8968cb)
  • aquasecurity/trivy-action@0.2.0 (7f6f0ce5)
  • aquasecurity/trivy-action@0.2.1 (0891663b)
  • aquasecurity/trivy-action@0.2.2 (3dffed04)
  • aquasecurity/trivy-action@0.2.3 (cf1692a1)
  • aquasecurity/trivy-action@0.2.4 (848d665e)
  • aquasecurity/trivy-action@0.2.5 (fa4209b6)
  • aquasecurity/trivy-action@0.3.0 (8cfb9c31)
  • aquasecurity/trivy-action@0.4.0 (18f01feb)
  • aquasecurity/trivy-action@0.4.1 (7b955a5e)
  • aquasecurity/trivy-action@0.5.0 (d488f438)
  • aquasecurity/trivy-action@0.5.1 (fa78e67c)
  • aquasecurity/trivy-action@0.6.0 (a5b4818d)
  • aquasecurity/trivy-action@0.6.1 (6fc874a1)
  • aquasecurity/trivy-action@0.6.2 (2a51c5c5)
  • aquasecurity/trivy-action@0.7.0 (ddb66974)
  • aquasecurity/trivy-action@0.7.1 (aa3c46a9)
  • aquasecurity/trivy-action@0.8.0 (4bdcc5d9)
  • aquasecurity/trivy-action@0.9.0 (b745a35b)
  • aquasecurity/trivy-action@0.9.1 (da73ae07)
  • aquasecurity/trivy-action@0.9.2 (7550f14b)
  • aquasecurity/trivy-action@0.10.0 (8aa8af3e)
  • aquasecurity/trivy-action@0.11.0 (e53b0483)
  • aquasecurity/trivy-action@0.11.1 (276ca968)
  • aquasecurity/trivy-action@0.11.2 (8ae5a08a)
  • aquasecurity/trivy-action@0.12.0 (820428af)
  • aquasecurity/trivy-action@0.13.0 (cf19d27c)
  • aquasecurity/trivy-action@0.13.1 (405e91f3)
  • aquasecurity/trivy-action@0.14.0 (2297a1b9)
  • aquasecurity/trivy-action@0.15.0 (2b1dac84)
  • aquasecurity/trivy-action@0.16.0 (f4f1785b)
  • aquasecurity/trivy-action@0.16.1 (3d1b5be1)
  • aquasecurity/trivy-action@0.17.0 (985447b0)
  • aquasecurity/trivy-action@0.18.0 (85cb72f1)
  • aquasecurity/trivy-action@0.19.0 (38623bf2)
  • aquasecurity/trivy-action@0.20.0 (9092287c)
  • aquasecurity/trivy-action@0.21.0 (b7befdc1)
  • aquasecurity/trivy-action@0.22.0 (9ba3c3cd)
  • aquasecurity/trivy-action@0.23.0 (fd090040)
  • aquasecurity/trivy-action@0.24.0 (e0198fd2)
  • aquasecurity/trivy-action@0.25.0 (ddb94181)
  • aquasecurity/trivy-action@0.26.0 (b7252377)
  • aquasecurity/trivy-action@0.27.0 (66c90331)
  • aquasecurity/trivy-action@0.28.0 (c5967f85)
  • aquasecurity/trivy-action@0.29.0 (9c000ba9)
  • aquasecurity/trivy-action@0.30.0 (ad623e14)
  • aquasecurity/trivy-action@0.31.0 (85190378)
  • aquasecurity/trivy-action@0.32.0 (fd429cf8)
  • aquasecurity/trivy-action@0.33.0 (19851bef)
  • aquasecurity/trivy-action@0.33.1 (91e7c2c3)
  • aquasecurity/trivy-action@0.34.0 (ab6606b7)
  • aquasecurity/trivy-action@0.34.1 (a9bc513e)
  • aquasecurity/trivy-action@0.34.2 (ddb9da44)
Комментарии: 0