Trivy Comprometido: Cómo TeamPCP Envenenó Más de 10.000 Pipelines de CI/CD y Qué Hacer Ahora

Si tu pipeline de CI/CD usa Trivy — y estadísticamente hablando, probablemente sí — tenés que leer esto. Entre el 19 y el 23 de marzo de 2026, el grupo de amenazas TeamPCP comprometió el escáner de vulnerabilidades Trivy de Aqua Security, inyectando malware robador de credenciales en todos los canales de distribución oficiales al mismo tiempo. Esto es CVE-2026-33634, con un score CVSS de 9.4, y afectó a más de 10.000 workflows de CI/CD en todo el mundo.

Acá te explicamos qué pasó exactamente, cómo funcionó el ataque, y los pasos concretos que tenés que seguir ahora mismo.


Qué es Trivy y por qué esto importa

Trivy es el escáner de vulnerabilidades open source más adoptado en CI/CD cloud-native. Corre como GitHub Action en cada PR, cada merge, cada deployment — y corre con acceso a los secrets del pipeline por diseño. Eso es exactamente por qué fue el objetivo. Comprometer Trivy no le da al atacante solo tu código: le da tus credenciales de nube, tus claves SSH, tus tokens de Kubernetes, tu configuración de Docker, y todo lo demás que toca tu pipeline.


Cómo ocurrió el ataque

El ataque tuvo dos fases y explotó una sola causa raíz: rotación incompleta de credenciales de un incidente anterior.

Fase 1 — 19 de marzo de 2026: TeamPCP ingresó usando credenciales robadas durante una brecha anterior y separada de la infraestructura de Aqua Security que nunca se remedió completamente. Con esas credenciales:

  • Forzaron commits maliciosos en 76 de 77 version tags de aquasecurity/trivy-action y en los 7 tags de aquasecurity/setup-trivy
  • Publicaron un binario envenenado como release oficial v0.69.4 en GitHub Releases, Docker Hub, GHCR, ECR Public y get.trivy.dev
  • Suplantaron la identidad de maintainers legítimos para que los commits parecieran auténticos

El payload inyectado corría antes del escaneo real de Trivy: recolectaba variables de entorno, barría el filesystem en busca de credenciales de nube e infraestructura, encriptaba los resultados y los exfiltraba a infraestructura controlada por el atacante. Después lanzaba el escaneo real de Trivy, que completaba con output normal. Los operadores no veían errores. Los pipelines parecían funcionar. El robo era invisible.

Fase 2 — 22 y 23 de marzo: Tres días después, usando credenciales de Docker Hub comprometidas por separado, TeamPCP subió nuevas imágenes maliciosas: 0.69.5, 0.69.6 y el tag latest — saltándose todos los controles basados en GitHub que se habían implementado. Esto extendió la exposición por aproximadamente 10 horas adicionales antes de que Docker cuarentenara las imágenes el 23 de marzo.

Expansión — 23 y 24 de marzo: Usando tokens robados de una cuenta bot (Argon-DevOps-Mgt) que conectaba dos organizaciones de GitHub de Aqua, TeamPCP desfiguró los 44 repositorios de la org interna aquasec-com de Aqua y expandió el ataque a Checkmarx KICS, LiteLLM (paquetes PyPI 1.82.7 y 1.82.8) y extensiones de VS Code en OpenVSX.


Versiones afectadas — la lista completa

Imágenes de Docker Hub:

  • aquasec/trivy:0.69.4, 0.69.5, 0.69.6, latest (durante el 19–23 de marzo)
  • Última versión limpia conocida: aquasec/trivy:0.69.3

GitHub Actions:

  • aquasecurity/trivy-action — todos los tags excepto el commit SHA 57a97c7 (v0.35.0)
  • aquasecurity/setup-trivy — todos los tags excepto el commit SHA 3fb12ec (v0.2.6)

Binarios descargados:

  • v0.69.4 desde GitHub Releases o get.trivy.dev

Atención: mirror.gcr.io puede estar sirviendo imágenes maliciosas cacheadas — siempre usá referencias con digest fijo.

Digests comprometidos a buscar:

  • sha256:27f446230c60bbf0b70e008db798bd4f33b7826f9f76f756606f5417100beef3
  • sha256:425cd3e1a2846ac73944e891250377d2b03653e6f028833e30fc00c1abbc6d33

Checklist de respuesta inmediata

Paso 1 — Determinar si estuviste expuesto

Revisá tus logs de pipeline, tu image store local, y tus cachés de Artifactory o Nexus buscando los digests o tags mencionados arriba. Tu ventana de exposición es: cualquier ejecución de Trivy entre el 19 de marzo a las 18:24 UTC y el 23 de marzo a las 01:36 UTC usando los tags afectados.

Paso 2 — Rotar todo

Si algún escaneo de Trivy corrió una versión comprometida, tratá todos los secrets accesibles desde ese pipeline como comprometidos. Rotá inmediatamente:

  • Tokens de GitHub y Personal Access Tokens
  • Credenciales de proveedores de nube (AWS, GCP, Azure)
  • Tokens de registros de Docker
  • Claves SSH
  • Tokens de Kubernetes
  • Contraseñas de bases de datos accesibles desde el entorno de build

Caso especial: Si corriste la imagen comprometida con el socket de Docker montado (-v /var/run/docker.sock:/var/run/docker.sock), tratá el host completo como comprometido — ese mount otorga acceso a nivel root sobre el nodo.

Paso 3 — Pinear a versiones seguras

  • Binario: usá aquasec/trivy:0.69.3 o esperá un nuevo release verificado de Aqua Security
  • GitHub Action: pineá a aquasecurity/trivy-action@57a97c7 (no @v0.35.0)
  • setup-trivy: pineá a aquasecurity/setup-trivy@3fb12ec

De acá en adelante: siempre pineá tus GitHub Actions a commit SHAs, nunca a tags mutables. Este ataque demostró a escala que los version tags pueden ser redirigidos silenciosamente.

Paso 4 — Verificar exposición a LiteLLM y Checkmarx

Si tu stack usa LiteLLM, buscá el indicador de compromiso litellm_init.pth y rotá todos los secrets. Si usás Checkmarx KICS, verificá que no estés corriendo la GitHub Action comprometida del 23 de marzo.


La lección que nadie quiere aprender

Este ataque ocurrió porque la rotación incompleta de credenciales de un incidente anterior dejó una puerta abierta. TeamPCP no necesitó un zero-day. Entró por credenciales que deberían haberse revocado meses antes.

La lección técnica es clara: cuando rotás credenciales después de un incidente, la rotación tiene que ser atómica y completa. Un solo token válido que conectaba dos organizaciones fue suficiente para comprometer 44 repositorios y extender el ataque por días.

La lección más amplia: las herramientas que usás para asegurar tu pipeline son parte de tu superficie de ataque. Tu escáner de vulnerabilidades corre con privilegios elevados. Tu linter corre con privilegios elevados. Todo lo que está en tu cadena de build lo hace. Pinear a commit SHAs — no a tags mutables — ya no es higiene opcional: es el baseline mínimo.


Recursos


¿Tu equipo usa Trivy en producción? ¿Ya rotaron sus secrets o están usando algún método alternativo de verificación de dependencias? Contanos en los comentarios.