
CVE-2026-33634 (CVSS 9.4) — El ataque a la cadena de suministro de CI/CD más impactante de 2026 hasta ahora.
CVE-2026-33634 (CVSS 9.4) — El ataque a la cadena de suministro CI/CD más impactante de 2026 hasta ahora.
Entre el 19 y el 25 de marzo de 2026, el actor de amenazas TeamPCP (también rastreado como DeadCatx3, PCPcat, ShellForce, CanisterWorm) ejecutó un compromiso en cascada de la cadena de suministro en cinco ecosistemas: GitHub Actions, Docker Hub, OpenVSX, npm y PyPI. Partiendo de un único PAT de GitHub rotado de forma incompleta, la campaña se propagó a dos importantes proveedores de seguridad de código abierto (Aqua Security y Checkmarx), cuatro repositorios de GitHub Actions, dos extensiones de VS Code, registros de contenedores y más de 66 paquetes npm.
Este repositorio proporciona un desglose técnico completo, listas de IOC seleccionadas (probadas contra falsos positivos) y consultas de detección listas para implementar en Microsoft Defender XDR.
| Fecha (UTC) | Evento |
|---|---|
| 20 feb 2026 | Cuenta hackerbot-claw creada; comienza a escanear repositorios en busca de flujos de trabajo pull_request_target explotables |
| 28 feb 2026 | Primer compromiso de Trivy mediante solicitud PWN; credenciales exfiltradas |
| 1 mar 2026 | Aqua Security intenta la contención: rotación de credenciales incompleta |
| 19 mar, 17:43 | Golpe principal: TeamPCP hace force-push de 75/76 etiquetas en aquasecurity/trivy-action + las 7 etiquetas en setup-trivy mediante la cuenta de servicio aqua-bot comprometida |
| 19 mar, 18:22 | Trivy v0.69.4 con puerta trasera publicado en GitHub Releases, Docker Hub, GHCR, ECR |
| 20 mar, 05:40 | La ventana de compromiso de Trivy-action se cierra (~12 horas) |
| 20 mar, 20:45 | CanisterWorm detectado propagándose por npm: más de 47 paquetes comprometidos |
| 22 mar, 20:31 | TeamPCP desfigura los 44 repositorios de la organización de GitHub aquasec-com en una ráfaga programada de 2 minutos |
| 22 mar | Imágenes de Docker Hub 0.69.5 y 0.69.6 publicadas con el mismo payload del ladrón |
| 23 mar, 02:53 | Comienza la ola Checkmarx: ast-results v2.53.0 y cx-dev-assist v1.7.0 maliciosos publicados en OpenVSX mediante la cuenta ast-phoenix |
| 23 mar, 12:58 | Las 35 etiquetas de Checkmarx/kics-github-action reciben force-push mediante la cuenta cx-plugins-releases comprometida |
| 23 mar, 15:41 | Checkmarx informa que el problema de OpenVSX está resuelto |
| 23 mar, 16:50 | KICS GitHub Action retirada tras un informe de usuario |
| 23 mar, 22:25 | Sysdig informa que Checkmarx/ast-github-action v2.3.28 también está comprometida |
| 24 mar, 08:30 | Ola LiteLLM: litellm v1.82.7 y v1.82.8 troyanizados publicados en PyPI con credenciales robadas |
| 24 mar, 11:25 | PyPI pone en cuarentena las versiones maliciosas de LiteLLM |
Causa raíz: rotación incompleta de credenciales tras la brecha del 28 de febrero. El PAT de la cuenta de servicio aqua-bot no fue revocado o el atacante observó el nuevo token durante la rotación.
TeamPCP utilizó este acceso retenido para hacer force-push de etiquetas de versión a commits impostores maliciosos. Cada commit falsificado clonaba los metadatos del original (autor, marca de tiempo, mensaje) mientras reemplazaba el script de punto de entrada por el payload del ladrón. La página de lanzamiento de GitHub no mostraba ningún cambio visible: incluso la insignia "Immutable" se mostraba con normalidad.
El ladrón — un entrypoint.sh de 204 líneas que se autodenomina "TeamPCP Cloud stealer" — ejecuta un ataque en tres etapas:
Etapa 1: Raspado de memoria
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
Etapa 2: Barrido de credenciales en el sistema de archivos
Escanea más de 50 rutas sensibles, incluyendo:
~/.ssh/*)~/.npmrc).envEtapa 3: Exfiltración cifrada
tpcp.tar.gzcurl POST a dominios typosquat específicos del proveedortpcp-docs o docs-tpcp en la cuenta de GitHub de la víctima usando el GITHUB_TOKEN robadoEn sistemas Linux que no son de CI, el malware:
~/.config/sysmon/sysmon.py)Las credenciales robadas en la ola Trivy permitieron comprometer el ecosistema de Checkmarx. Cada nueva ola utilizó un dominio C2 typosquat diferente para evadir las listas de bloqueo de la ola anterior:
| Ola | Dominio C2 | Typosquat de |
|---|---|---|
| Trivy | scan.aquasecurtiy[.]org | aquasecurity.org |
| Checkmarx/KICS | checkmarx[.]zone | checkmarx.com |
| LiteLLM | models.litellm[.]cloud | litellm.ai |
| Repositorio | Etiquetas comprometidas | Ventana de exposición (UTC) | Punto de entrada |
|---|---|---|---|
aquasecurity/trivy-action | 75 de 76 (segura: 0.35.0) | Mar 19 17:43 – Mar 20 05:40 | entrypoint.sh |
aquasecurity/setup-trivy | Las 7 etiquetas | Mar 19 17:43 – 21:44 | action.yaml |
Checkmarx/kics-github-action | Las 35 etiquetas | Mar 23 12:58 – 16:50 | setup.sh |
Checkmarx/ast-github-action | v2.3.28 (probablemente todas) | Mar 23 ~22:25+ | setup.sh |
| Extensión | Versión maliciosa | Versión segura |
|---|---|---|
checkmarx.ast-results | 2.53.0 | >= 2.56.0 |
checkmarx.cx-dev-assist | 1.7.0 | >= 1.10.0 |
Ambas extensiones se publicaron con 12 segundos de diferencia a las 12:53 UTC del 23 de marzo mediante la cuenta ast-phoenix. Al activarse, environmentAuthChecker.js busca credenciales de proveedores de nube y luego descarga un ladrón de segunda etapa desde checkmarx[.]zone/static/checkmarx-util-1.0.4.tgz.
| Imagen | Etiquetas 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 |
| Paquete | Versiones | Archivo con puerta trasera |
|---|---|---|
litellm | 1.82.7, 1.82.8 | litellm/proxy/proxy_server.py |
Payload base64 de triple anidamiento con kit de movimiento lateral en K8s. Persistencia mediante sysmon.service que consulta checkmarx.zone/raw.
El patrón de exfiltración es idéntico en todas las olas: