Minería de cripto y scripts de inicio en GCP: detección
Detecte abusos de Compute Engine en la auditoría: scripts de inicio, claves SSH en metadatos, OS Login desactivado, VM con GPU, ráfagas y regiones.
En resumen. El abuso de Compute Engine deja rastros claros en Admin Activity. Persistencia: entradas setMetadata / setCommonInstanceMetadata cuyo delta añade startup-script, startup-script-url, ssh-keys, o elimina enable-oslogin / block-project-ssh-keys. Minería: compute.instances.insert con guestAccelerators o tipos de máquina a2-/a3-/g2-, ráfagas de creaciones, VM en regiones que nunca usa. La entrada de auditoría le dice qué claves de metadatos cambiaron; el contenido hay que obtenerlo de la VM o de su disco.
Compute es donde un proyecto de Google Cloud comprometido se convierte con más frecuencia en una factura. El informe Threat Horizons de noviembre de 2021 de Google constató que el 86 % de una muestra de 50 instancias de Google Cloud comprometidas recientemente se usaba para minar criptomonedas y que, cuando se disponía de cronología, en el 58 % el software de minería se había descargado en los 22 segundos siguientes al compromiso. Esa es la parte de «impacto» (T1496, Resource Hijacking). La parte de persistencia, las puertas traseras en los metadatos de las VM, es más discreta y más peligrosa.
Scripts de inicio: root en cada arranque
Un script de inicio es un valor de metadatos que el entorno invitado ejecuta como root, en cada arranque en Linux (scripts de inicio en VM Linux). Cualquiera con compute.instances.setMetadata sobre una VM, o compute.projects.setCommonInstanceMetadata sobre el proyecto, puede por tanto ejecutar código como root en esas VM en el siguiente reinicio, y provocar ese reinicio con reset. Cargas habituales: una reverse shell, un minero o un script que lee el token de la cuenta de servicio desde el servidor de metadatos.
Las claves que ejecutan código:
| SO | Claves de metadatos |
|---|---|
| Linux | startup-script, startup-script-url, shutdown-script, shutdown-script-url |
| Windows | windows-startup-script-ps1, -cmd, -bat, -url, sysprep-specialize-script-ps1, -cmd |
En el registro de auditoría, busque:
protoPayload.methodName=("v1.compute.instances.setMetadata" OR "v1.compute.projects.setCommonInstanceMetadata")
y lea protoPayload.metadata.instanceMetadataDelta (o projectMetadataDelta), que enumera addedMetadataKeys, modifiedMetadataKeys y deletedMetadataKeys. Las operaciones de Compute son de larga duración, así que un mismo cambio puede producir dos entradas (operation.first y operation.last); cuéntelas una sola vez.
No espere encontrar el script en el registro. Recupérelo con gcloud compute instances describe VM --format=json (o project-info describe para los metadatos del proyecto) y haga una instantánea del disco de arranque antes que nada, para poder examinar lo que se ejecutó. Security Command Center tiene una detección comparable, Persistence: GCE Admin Added Startup Script. MITRE lo asigna a T1037 y, para la ejecución de comandos a través del plano de control de la nube, a T1651.
Claves SSH y OS Login
Dos formas de obtener una shell sin tocar IAM:
- Claves SSH en los metadatos: añadir una línea a
ssh-keysen los metadatos de la instancia o del proyecto concede acceso SSH a las VM (añadir claves SSH a las VM). Las claves de todo el proyecto se aplican a todas las VM que no las bloqueen. MITRE T1098.004. - Desactivar OS Login: con
enable-oslogin=TRUE, el acceso SSH lo controla IAM y las claves de los metadatos se ignoran. Borrar o cambiarenable-oslogin(oblock-project-ssh-keys) vuelve a poner en juego las claves de los metadatos. Es el paso que hace útil la clave SSH, y es raro en la operación normal.
La combinación «ssh-keys añadida y enable-oslogin borrada en la misma llamada setCommonInstanceMetadata» es de las pruebas más claras que ofrece la nube. La corrección consiste en volver a habilitar OS Login y aplicar la política de organización compute.requireOsLogin (OS Login).
Minería: VM con GPU, ráfagas y regiones sin uso
Las entradas de creación son v1.compute.instances.insert, bulkInsert e instanceTemplates.insert. La solicitud muestra lo que se pidió:
guestAccelerators(GPU conectadas) o tipos de máquina optimizados para aceleradores (familiasa2-,a3-,a4-,g2-) enmachineType;- una cantidad: muchas instancias del mismo principal en poco tiempo;
- una zona en una región donde el proyecto no tiene otra actividad. Los atacantes eligen regiones que nadie vigila (T1535, Unused/Unsupported Cloud Regions).
Los errores de cuota también son una pista: un atacante que choca con los límites de cuota de GPU deja llamadas insert fallidas. Y revise la facturación: los mineros que funcionan durante horas aparecen ahí antes de que nadie lea un registro.
Cortafuegos abiertos a Internet
v1.compute.firewalls.insert, patch o update con sourceRanges que contiene 0.0.0.0/0 (o ::/0) abre un puerto a todo el mundo: SSH para el atacante o un puerto para una web shell. Asignado a T1562.007.
Confirmar con pruebas de red
Los cambios de metadatos dicen lo que se configuró. VPC Flow Logs, si está habilitado en la subred, dice lo que ocurrió: una sesión SSH entrante desde la IP del atacante después del reinicio, conexiones salientes de la VM hacia esa IP o hacia pools de minería, volumen de salida.
Qué marca el analizador
| Regla | Gravedad | Condición |
|---|---|---|
startup_script_changed | Alta | Clave de script de inicio / apagado / sysprep añadida o cambiada en los metadatos de la instancia o del proyecto |
oslogin_changed | Alta | enable-oslogin, enable-oslogin-2fa o block-project-ssh-keys cambiada o eliminada |
ssh_key_added | Media | ssh-keys / sshKeys añadida o cambiada |
gpu_instance_created | Media | Instancia o plantilla creada con aceleradores o un tipo de máquina optimizado para aceleradores |
instance_burst | Alta | Al menos 5 creaciones de instancias del mismo principal en 30 minutos |
new_zone_instance (análisis) | Media | Instancia creada en una región sin actividad previa en los registros |
firewall_opened | Media | Regla de cortafuegos creada o cambiada con origen 0.0.0.0/0 o ::/0 |
Las claves de metadatos se muestran en cada evento como +startup-script, ~enable-oslogin, -block-project-ssh-keys. La lista de remediación pide hacer una instantánea e inspeccionar, reconstruir en lugar de limpiar y rotar las credenciales que tenía la VM.
Remediación
Haga instantáneas de los discos de las VM afectadas para el análisis forense y reconstrúyalas a partir de una imagen de confianza; elimine las claves SSH y los scripts de inicio desconocidos de los metadatos de la instancia y del proyecto; vuelva a habilitar OS Login y aplíquelo; detenga las instancias que nadie aprobó; limite las cuotas de GPU; restrinja las ubicaciones con gcp.resourceLocations. El token de la cuenta de servicio de la VM debe darse por robado: revise lo que esa cuenta de servicio podía hacer.
Preguntas frecuentes
¿Cómo encuentro una puerta trasera en un script de inicio de Google Cloud?
Busque en los registros Admin Activity las entradas v1.compute.instances.setMetadata y v1.compute.projects.setCommonInstanceMetadata cuyo delta de metadatos añade o modifica startup-script, startup-script-url o sus equivalentes de Windows. Después lea el valor actual de la clave en la VM o en el proyecto y haga una instantánea del disco.
¿Es frecuente la minería de criptomonedas tras un compromiso de Google Cloud?
El informe Threat Horizons de Google de noviembre de 2021 constató que el 86 % de una muestra de 50 instancias de Google Cloud comprometidas recientemente se usaba para minar criptomonedas.
Lecturas recomendadas
- Registros de auditoría de Compute Engine — documentación de Google Cloud.
- Acerca de OS Login — documentación de Google Cloud.
- Google Cloud comprometido: guía de respuesta a incidentes.