Сканер уязвимостей Trivy был скомпрометирован в результате атаки на цепочку поставок, осуществленной злоумышленниками, известными как TeamPCP, которые распространяли вредоносное ПО для кражи учетных данных через официальные релизы и GitHub Actions.
Trivy — это популярный сканер безопасности, который помогает выявлять уязвимости, некорректные настройки и раскрытые секреты в контейнерах, средах Kubernetes, репозиториях кода и облачной инфраструктуре. Поскольку его часто используют разработчики и команды по безопасности, он является ценной мишенью для злоумышленников, стремящихся украсть конфиденциальные учетные данные для аутентификации.
О взломе впервые сообщил исследователь безопасности Пол Маккарти, который предупредил, что в версию Trivy 0.69.4 был внедрен бэкдор, а пользователям были опубликованы вредоносные образы контейнеров и релизы GitHub.
Дальнейший анализ, проведенный Socket, а затем Wiz, установил, что атака затронула несколько GitHub Actions, скомпрометировав почти все теги версий репозитория trivy-action.
Исследователи обнаружили, что злоумышленники скомпрометировали процесс сборки Trivy в GitHub, подменив файл entrypoint.sh в GitHub Actions на вредоносную версию и опубликовав троянизированные бинарные файлы в релизе Trivy v0.69.4. Оба этих элемента действовали как похитители информации (infostealers) в основном сканере и связанных GitHub Actions, включая trivy-action и setup-trivy.
Злоумышленники использовали скомпрометированный учетную запись с правами на запись в репозиторий, что позволило им публиковать вредоносные релизы. Эти скомпрометированные учетные данные получены в результате более раннего инцидента в марте, когда учетные данные были эксфильтрованы из среды Trivy и не были полностью изолированы.
Злоумышленник принудительно изменил 75 из 76 тегов в репозитории aquasecurity/trivy-action, перенаправив их на вредоносные коммиты.
В результате любые внешние рабочие процессы, использующие затронутые теги, автоматически выполняли вредоносный код перед запуском легитимных сканирований Trivy, что затрудняло обнаружение компрометации.
По данным Socket, похититель информации собирал данные разведки и сканировал системы на наличие широкого спектра файлов и местоположений, известных для хранения учетных данных и секретов аутентификации, включая:
- Данные разведки: имя хоста (hostname), whoami, uname, сетевая конфигурация и переменные среды
- SSH: закрытые и открытые ключи, а также связанные конфигурационные файлы
- Конфигурации облака и инфраструктуры: учетные данные Git, AWS, GCP, Azure, Kubernetes и Docker
- Файлы среды: .env и связанные варианты
- Учетные данные баз данных: конфигурационные файлы для PostgreSQL, MySQL/MariaDB, MongoDB и Redis
- Файлы учетных данных: включая токены аутентификации менеджеров пакетов и связанных с Vault
- Конфигурации CI/CD: Terraform, Jenkins, GitLab CI и аналогичные файлы
- Закрытые TLS-ключи
- Конфигурации VPN
- Вебхуки: токены Slack и Discord
- Файлы истории командной оболочки (Shell history)
- Системные файлы: /etc/passwd, /etc/shadow и журналы аутентификации
- Криптовалютные кошельки

Вредоносный скрипт также сканировал области памяти, используемые процессом GitHub Actions Runner.Worker, на наличие JSON-строки “" <name> ":{ "value": "<secret>", "isSecret":true}” для поиска дополнительных секретов аутентификации.
На машинах разработчиков троянизированный бинарный файл Trivy выполнял аналогичный сбор данных, собирая переменные среды, сканируя локальные файлы на наличие учетных данных и перечисляя сетевые интерфейсы.
Собранные данные шифровались и сохранялись в архиве с именем tpcp.tar.gz, который затем эксфильтровался на сервер командно-контрольной связи (C2) с ошибкой в доменном имени (typosquatted) по адресу scan.aquasecurtiy[.]org.
Если эксфильтрация не удавалась, вредоносное ПО создавало в учетной записи жертвы на GitHub общедоступный репозиторий с именем tpcp-docs и загружало туда украденные данные.
Для сохранения присутствия на скомпрометированном устройстве вредоносное ПО также размещало Python-полезную нагрузку по адресу ~/.config/systemd/user/sysmon.py и регистрировало ее как службу systemd. Эта полезная нагрузка проверяла удаленный сервер на наличие дополнительных полезных нагрузок для загрузки, предоставляя злоумышленнику постоянный доступ к устройству.
Считается, что атака связана с группой злоумышленников, известной как TeamPCP, поскольку одна из полезных нагрузок похитителя информации содержала комментарий “TeamPCP Cloud stealer” в последней строке Python-скрипта, внедренного в файловую систему.
“Вредоносное ПО самоидентифицируется как TeamPCP Cloud stealer в комментарии Python в последней строке внедренного сборщика учетных данных файловой системы. TeamPCP, также отслеживаемый как DeadCatx3, PCPcat и ShellForce, является задокументированным облачным злоумышленником, известным эксплуатацией некорректно настроенных API Docker, кластеров Kubernetes, панелей Ray и серверов Redis”, — поясняет Socket.

Aqua Security подтвердила инцидент, заявив, что злоумышленник использовал скомпрометированные учетные данные из предыдущего инцидента, которые не были должным образом изолированы.
“Это было продолжение недавнего инцидента (2026-03-01), в ходе которого были эксфильтрованы учетные данные. Наша изоляция первого инцидента была неполной”, — пояснили в Aqua Security.
“Мы сменили секреты и токены, но процесс не был атомарным, и злоумышленники могли получить доступ к обновленным токенам”.
Вредоносный релиз Trivy (v0.69.4) был доступен около трех часов, а скомпрометированные теги GitHub Actions оставались активными до 12 часов.
Злоумышленники также вмешались в репозиторий проекта, удалив первоначальное сообщение Aqua Security о предыдущем инциденте в марте.
Организации, которые использовали затронутые версии во время инцидента, должны считать свои среды полностью скомпрометированными.
Это включает в себя ротацию всех секретов, таких как облачные учетные данные, SSH-ключи, токены API и пароли баз данных, а также анализ систем на предмет дополнительной компрометации.
Последующая атака распространяет червя CanisterWorm через npm
Исследователи из Aikido также связали ту же группу злоумышленников с последующей кампанией, связанной с новым самораспространяющимся червем под названием “CanisterWorm”, который нацелен на пакеты npm.
Червь компрометирует пакеты, устанавливает постоянный бэкдор через пользовательскую службу systemd, а затем использует украденные токены npm для публикации вредоносных обновлений в другие пакеты.
“Самораспространяющийся червь. deploy.js извлекает токены npm, определяет имена пользователей, перебирает все публикуемые пакеты, увеличивает версии патчей и публикует полезную нагрузку во всей области видимости. 28 пакетов менее чем за 60 секунд”, — подчеркивает Aikido.
Вредоносное ПО использует децентрализованный механизм командно-контрольной связи с помощью каннистров Internet Computer (ICP), которые действуют как резолвер “мертвой почты” (dead-drop resolver), предоставляющий URL-адреса для дополнительных полезных нагрузок.
Использование каннистров ICP делает операцию более устойчивой к блокировке, поскольку только контроллер каннистра может удалить его, а любая попытка остановить его потребует предложения по управлению и голосования сети.
Червь также включает функциональность для сбора токенов аутентификации npm из конфигурационных файлов и переменных среды, что позволяет ему распространяться по средам разработчиков и конвейерам CI/CD.
На момент анализа некоторая инфраструктура вторичных полезных нагрузок была неактивна или настроена с безвредным контентом, но исследователи утверждают, что это может измениться в любой момент.
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Lawrence Abrams




