En esta página, se describen las tareas que puedes realizar para confirmar la validez de un hallazgo de rootkit en modo kernel de Virtual Machine Threat Detection. Los hallazgos de rootkits en modo kernel indican que es posible que el software malicioso haya manipulado la memoria del kernel de una VM.
Cuando recibas un resultado de rootkit en modo kernel de Virtual Machine Threat Detection, te recomendamos que ejecutes estos comandos de Linux en la instancia de Compute Engine afectada para sondear tu sistema en busca de datos que puedan indicar anomalías, como llamadas al sistema usurpadas o módulos de kernel ocultos.
Como alternativa, puedes ejecutar la secuencia de comandos de recopilación de datos proporcionada en la VM afectada. La secuencia de comandos ejecuta los comandos que se describen en esta página.
A menos que se indique lo contrario, cada tarea de inspección de esta página es relevante para todos los hallazgos de rootkits en modo de kernel.
En este documento, se da por sentado lo siguiente:
Realizas las tareas de este documento después de recibir un hallazgo de rootkit en modo kernel de VM Threat Detection. Para obtener una lista de las categorías de resultados relevantes, consulta Resultados de amenazas de rootkit en modo kernel.
Comprendes las herramientas de línea de comandos y el kernel de Linux.
Información acerca de VM Threat Detection
Virtual Machine Threat Detection es un servicio integrado de Security Command Center que está disponible en los niveles Enterprise y Premium. Este servicio analiza las instancias de Compute Engine para detectar aplicaciones potencialmente maliciosas, como software de minería de criptomonedas, rootkits en modo kernel y software malicioso que se ejecuta en entornos de nube vulnerados.
VM Threat Detection forma parte del paquete de detección de amenazas de Security Command Center y está diseñada para complementar las capacidades existentes de Event Threat Detection y Container Threat Detection.
Para obtener información sobre VM Threat Detection, consulta la descripción general de Virtual Machine Threat Detection. Para obtener información sobre cómo ver los detalles de un resultado de VM Threat Detection, consulta Revisa los resultados en la consola de Google Cloud.
Antes de comenzar
Para obtener los permisos que necesitas para ver todos los recursos y hallazgos en Security Command Center y administrar la instancia de Compute Engine afectada, pídele a tu administrador que te otorgue los siguientes roles de IAM:
-
Visualizador administrador del centro de seguridad (
roles/securitycenter.adminViewer
) en la organización -
Administrador de instancias de Compute (v1) (
roles/compute.instanceAdmin.v1
) en la instancia de Compute Engine
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
Identifica la VM afectada
- Consulta los detalles del hallazgo.
- En la sección Recurso afectado, en el campo Nombre completo del recurso, haz clic en el vínculo. La vista de detalles de la instancia de Compute Engine afectada se abrirá en una pestaña nueva.
- Conéctate a la instancia. Para obtener más información, consulta Conéctate a VMs de Linux en la documentación de Compute Engine.
Cómo encontrar módulos de kernel inesperados
La presencia de módulos inesperados en una VM puede indicar que la memoria del kernel de la VM está potencialmente comprometida.
Para encontrar módulos de kernel inesperados, sigue estos pasos:
Enumera todos los módulos de kernel cargados en la VM:
lsmod cat /proc/modules
Enumera las entradas
sysfs
para los módulos cargados y descargados:ls -l /sys/module/
Compara los resultados de estas listas con las de otras VMs del proyecto. Busca módulos que aparezcan en la VM afectada, pero no en las otras.
Busca módulos fuera del árbol en syslog
Los indicadores de que se cargó un módulo fuera del árbol en una VM pueden indicar que se cargaron módulos de kernel atípicos. Puedes buscar en el búfer de registro del kernel y en los mensajes syslog
para determinar si se cargó un módulo fuera del árbol. En las entradas de registro, un módulo fuera del árbol se marca como carga contaminada.
En el búfer de registro del kernel y los mensajes syslog
, busca entradas de registro que se asemejen a lo siguiente:
MODULE_NAME: loading out-of-tree module taints kernel.
Busca en el búfer de registro del kernel entradas de registro que indiquen la presencia de módulos fuera del árbol:
sudo dmesg | grep out-of-tree
Busca en todos los mensajes
syslog
entradas de registro que indiquen la presencia de módulos fuera del árbol:grep "out-of-tree" /var/log/syslog*
Cómo verificar si hay parches en vivo
La aplicación de parches en vivo en una VM puede interferir con las detecciones de VM Threat Detection y activar resultados falsos positivos.
Para verificar si hay parches en vivo, sigue estos pasos:
Consulta
syslog
para ver la instalación y el registro del módulo de parcheo en vivo. Por lo general, los parches en vivo modifican el código del kernel instalando puntosftrace
del kernel.sudo grep livepatch /var/log/syslog*
Busca módulos de kernel nuevos instalados para la aplicación de parches en vivo (por lo general, con el prefijo
livepatch
):sudo lsmod | grep livepatch
Busca archivos de parche:
sudo ls -l /sys/kernel/livepatch
Para obtener información sobre los parches en vivo, consulta Livepatch en la documentación del kernel de Linux.
Verifica si hay otras actividades potencialmente maliciosas detectadas en la VM
- En Security Command Center, consulta los detalles del resultado de VM Threat Detection que estás investigando.
- En la sección Recurso afectado, en el campo Nombre completo del recurso, haz clic en la flecha desplegable y, luego, en Mostrar todos los resultados con este nombre completo de recurso. La búsqueda de resultados se actualiza para mostrar solo los resultados de esta VM.
- Busca hallazgos que indiquen posibles actividades de criptominería, software malicioso, otorgamientos de IAM inusuales y otras amenazas de seguridad.
Comprueba si el software antivirus está causando un resultado falso positivo
El software antivirus puede interferir en las detecciones de VM Threat Detection y generar resultados falsos positivos.
Cómo verificar todos los procesos en ejecución del sistema
La presencia de procesos inesperados puede indicar que el hallazgo de VM Threat Detection es válido y que la VM se vio comprometida.
Enumera todos los procesos que se ejecutan en la VM:
ps -eAf
Busca procesos de depurador, como
gdb
,strace
ypstack
, que no sueles ejecutar en esta VM. Los procesos del Debugger pueden espiar otros procesos.Busca otros procesos sospechosos en la VM.
Verifica el kernel iniciado
Verifica el kernel iniciado para identificar el kernel de Linux:
cat /proc/version
Si el valor que se muestra no es la versión del kernel esperada, es posible que se trate de un ataque de secuestro que se realiza aprovechando la herramienta kexec
en el kernel. La herramienta kexec
puede iniciar el sistema de forma suave para usar un kernel diferente.
Tareas adicionales para los resultados de Unexpected kernel code modification
Las tareas de esta sección son específicas de la categoría de búsqueda Defense Evasion: Unexpected
kernel code modification
. Realiza las tareas de las siguientes secciones para verificar la validez de un hallazgo en esta categoría.
Estas secciones te ayudan a determinar si tu VM usa una API de depurador. Las APIs del Debugger pueden activar resultados falsos positivos, ya que pueden modificar las regiones de código del kernel en ejecución.
En general, VM Threat Detection no genera un resultado si detecta el uso de una API de depurador. Sin embargo, si tu VM usa una API de depurador que VM Threat Detection no conoce, es posible que obtengas un resultado falso positivo.
Cómo verificar si hay generadores de seguimiento de depuración habilitados
Los generadores de registros, excepto el generador de registros nop
, pueden causar modificaciones en el código del kernel. Estos pueden interferir en las detecciones de VM Threat Detection y activar resultados falsos positivos. En general, si VM Threat Detection detecta la presencia de generadores de trazas, no envía un resultado Defense Evasion: Unexpected kernel code
modification
.
Para verificar si hay generadores de seguimiento de depuración habilitados, sigue estos pasos:
Revisa los trazadores disponibles:
cat /sys/kernel/debug/tracing/available_tracers
El resultado se ve de la manera siguiente:
hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop
Verifica el trazador actual:
cat /sys/kernel/debug/tracing/current_tracer
El resultado es uno de los generadores de registros disponibles que se mostraron en el comando anterior.
Confirma si el seguimiento está habilitado en el sistema:
cat /sys/kernel/debug/tracing/tracing_on
Un valor de
1
indica que el seguimiento está habilitado en el sistema.Haz una lista de las CPUs en las que se habilitó el seguimiento:
cat /sys/kernel/debug/tracing/tracing_cpumask
Consulta los detalles del seguimiento:
cat /sys/kernel/debug/tracing/trace_stat/function*
El resultado se ve de la manera siguiente:
Function Hit Time Avg s^2
Cómo verificar los eventos del generador de registros de depuración
La supervisión de eventos en el kernel puede causar modificaciones en el código del kernel y generar resultados falsos positivos de VM Threat Detection. Muchas herramientas de depuración y supervisión de rendimiento pueden habilitar automáticamente la supervisión de eventos.
Para verificar si la supervisión de eventos está habilitada, ejecuta los siguientes comandos:
cat /sys/kernel/debug/tracing/events/enable
cat /sys/kernel/debug/tracing/events/*/enable
Un resultado de 0
significa que la supervisión de eventos está inhabilitada. Un resultado de 1
significa que la supervisión de eventos está habilitada.
Considera inhabilitar la supervisión de eventos para verificar si VM Threat Detection emite los mismos resultados. Si se reducen los resultados, eso puede indicar que algunos de los resultados iniciales fueron falsos positivos.
Verifica si hay kprobes, reglas de eBPF y netfilters
Los netfilters, los kprobes y las reglas de eBPF pueden activar modificaciones de código porque activan transferencias de llamadas a devoluciones de llamada personalizadas. VM Threat Detection detecta la presencia de estas sondas y las asigna a páginas de código modificadas, sin tener en cuenta cuáles pueden activar falsos positivos.
Para verificar si hay kprobes, reglas de eBPF y netfilters, ejecuta el siguiente comando:
iptable -L
cat /sys/kernel/debug/kprobes/enabled
cat /sys/kernel/debug/kprobes/list
cat /sys/kernel/debug/kprobes/blacklist
cat /sys/kernel/debug/tracing/enabled_functions
sudo apt-get update && sudo apt-get install bpftrace
bpftrace -l
sudo apt install linux-tools-`uname -r`
bpftool prog
Cómo verificar si hay generadores de seguimiento de depuración anticipados
La presencia de generadores de registros de depuración anticipados que se habilitan en el momento del inicio puede interferir con las detecciones de la detección de amenazas de VM y activar resultados falsos positivos.
Para verificar si hay generadores de seguimiento de depuración anticipados, ejecuta el siguiente comando:
cat /proc/cmdline
Para obtener una lista de posibles generadores de registros de depuración anticipados, consulta Registros del tiempo de inicio en la documentación del kernel de Linux.
Tarea adicional para Unexpected system call handler
Realiza esta tarea si obtienes un resultado Defense Evasion: Unexpected system call handler
.
Audita las llamadas del sistema y busca anomalías en su uso y en los invocadores. Los registros de auditoría proporcionan información sobre el proceso de invocación y los argumentos de las llamadas del sistema. También puedes realizar tareas de verificación para verificar los comportamientos esperados de las llamadas comunes al sistema. Para obtener más información, consulta Ejemplo de inspección con el rootkit Diamorphine en esta página.
Tarea adicional para Unexpected interrupt handler
Realiza esta tarea si obtienes un resultado Defense Evasion: Unexpected interrupt handler
.
Haz una lista de los controladores de interrupción en vivo del sistema y compara los resultados con la información de otras VMs similares del proyecto. Los controladores de interrupción inesperados pueden indicar que la VM está comprometida.
Para enumerar los controladores de interrupción activos, ejecuta el siguiente comando:
cat /proc/interrupts
El resultado se ve de la manera siguiente:
CPU0 CPU1 0: 44 0 IO-APIC 0-edge timer 1: 9 0 IO-APIC 1-edge i8042 4: 17493 0 IO-APIC 4-edge ttyS0 8: 0 0 IO-APIC 8-edge rtc0 9: 0 0 IO-APIC 9-fasteoi acpi 12: 0 152 IO-APIC 12-edge i8042 24: 16 0 PCI-MSI 81920-edge virtio2-config 25: 0 40194 PCI-MSI 81921-edge virtio2-inflate 26: 58528 0 PCI-MSI 81922-edge virtio2-deflate 27: 0 966356 PCI-MSI 81923-edge virtio2-stats 28: 0 0 PCI-MSI 49152-edge virtio0-config 29: 0 0 PCI-MSI 49153-edge virtio0-control 30: 0 0 PCI-MSI 49154-edge virtio0-event 31: 0 555807 PCI-MSI 49155-edge virtio0-request 32: 0 0 PCI-MSI 98304-edge virtio3-config 33: 184 0 PCI-MSI 98305-edge virtio3-input 34: 0 0 PCI-MSI 65536-edge virtio1-config 35: 556203 0 PCI-MSI 65537-edge virtio1-input.0 36: 552746 1 PCI-MSI 65538-edge virtio1-output.0 37: 1 426036 PCI-MSI 65539-edge virtio1-input.1 38: 0 408475 PCI-MSI 65540-edge virtio1-output.1
Tarea adicional para Unexpected processes in runqueue
Sigue estos pasos si obtienes un resultado Defense Evasion: Unexpected processes in
runqueue
. Esta sección te ayuda a recopilar datos adicionales para investigar tus conclusiones. Es posible que estos datos no indiquen directamente un problema de software malicioso.
En esta tarea, revisarás la cola del programador por CPU. Aunque algunos procesos pueden ser de corta duración, puedes evaluar el comportamiento de la cola del programador con los procesos en ejecución por CPU para buscar comportamientos anómalos.
Muestra detalles sobre la cantidad de tiempo que cada proceso en ejecución pasa por CPU. Esto te permite ver si una CPU en particular está muy ocupada. Puedes correlacionar los resultados con las interrupciones fijadas en la CPU desde
/proc/interrupts
.cat /proc/schedstat
Para obtener más información sobre este comando, consulta Estadísticas del programador en la documentación del kernel de Linux.
Enumera todas las tareas ejecutables actuales y los detalles sobre los cambios de contexto para cada CPU.
cat /proc/sched_debug
El resultado se ve de la manera siguiente:
Sched Debug Version: v0.11, 5.4.0-1081-gke #87-Ubuntu ktime : 976187427.733850 sched_clk : 976101974.761097 cpu_clk : 976101973.335113 jiffies : 4538939132 sched_clock_stable() : 1 sysctl_sched .sysctl_sched_latency : 12.000000 .sysctl_sched_min_granularity : 1.500000 .sysctl_sched_wakeup_granularity : 2.000000 .sysctl_sched_child_runs_first : 0 .sysctl_sched_features : 2059067 .sysctl_sched_tunable_scaling : 1 (logarithmic) cpu#0, 2199.998 MHz .nr_running : 0 .nr_switches : 16250401 .nr_load_updates : 0 .nr_uninterruptible : 12692 .next_balance : 4538.939133 .curr->pid : 0 .clock : 976101971.732857 .clock_task : 976101971.732857 .avg_idle : 880408 .max_idle_balance_cost : 500000 runnable tasks: S task PID tree-key switches prio wait-time sum-exec sum-sleep ----------------------------------------------------------------------------------------------------------- S systemd 1 51740.602172 326778 120 0.000000 165741.786097 0.000000 0 0 /init.scope S kthreadd 2 1482297.917240 1361 120 0.000000 112.028205 0.000000 0 0 / I rcu_sched 11 1482642.606136 1090339 120 0.000000 17958.156471 0.000000 0 0 / S cpuhp/1 15 537.058588 8 120 0.000000 2.275927 0.000000 0 0 / S idle_inject/1 16 -2.994953 3 49 0.000000 0.012780 0.000000 0 0 / S migration/1 17 0.000000 245774 0 0.000000 5566.508869 0.000000 0 0 / S ksoftirqd/1 18 1482595.656315 47766 120 0.000000 1235.099147 0.000000 0 0 / I kworker/1:0H 20 536.961474 5 100 0.000000 0.043908 0.000000 0 0 / S kdevtmpfs 21 11301.343465 177 120 0.000000 3.195291 0.000000 0 0 / I netns 22 6.983329 2 100 0.000000 0.021870 0.000000 0 0 / Srcu_tasks_kthre 23 10.993528 2 120 0.000000 0.010200 0.000000 0 0 / S kauditd 24 1482525.828948 319 120 0.000000 14.489652 0.000000 0 0 /
Busca lo siguiente:
- Nombres de procesos en ejecución
- Cantidad de conmutaciones de contexto por CPU. Comprueba si un proceso genera muy pocos o demasiados conmutadores en la CPU.
- Tiempo de CPU empleado (tiempo no inactivo).
Ejemplo de inspección con el rootkit Diamorphine
En esta sección, se muestra una inspección de una VM que tiene instalado el rootkit Diamorphine. Diamorphine es un módulo de kernel cargable (LKM) popular. Este rootkit activa las siguientes categorías de hallazgos:
Defense Evasion: Unexpected system call handler
Defense Evasion: Unexpected kernel modules
Defense Evasion: Unexpected kernel read-only data modification
Para obtener más información sobre estas categorías de resultados, consulta Resultados de amenazas de rootkit en modo kernel.
Los pasos de inspección que se realizaron y los síntomas que se observaron en la VM son los siguientes:
Busca en
syslog
todos los módulos de kernel fuera del árbol que se cargaron.Busca en el búfer de registro del kernel:
sudo dmesg | grep out-of-tree
Resultado:
diamorphine: loading out-of-tree module taints kernel.
Busca los mensajes de
syslog
:grep "out-of-tree" /var/log/syslog*
Resultado:
/var/log/syslog: diamorphine: loading out-of-tree module taints kernel.
Busca
syslog
para detectar fallas de verificación de módulos (no disponible en todas las distribuciones de Linux).Busca en el búfer de registro del kernel:
sudo dmesg | grep "module verification failed"
Resultado:
diamorphine: module verification failed: signature and/or required key missing - tainting kernel
Busca los mensajes de
syslog
:sudo grep "module verification failed" /var/log/syslog*
Resultado:
/var/log/syslog: diamorphine: module verification failed: signature and/or required key missing - tainting kernel
Confirma que el módulo esté oculto de los comandos
/proc/modules
ylsmod
.sudo grep diamorphine /proc/modules sudo lsmod | grep diamorphine
No se mostraron resultados.
Confirma que el módulo tenga una entrada en
sysfs
.sudo cat /sys/module/diamorphine/coresize
Resultado:
16384
Obtén la tabla de llamadas del sistema para la arquitectura:
sudo ausyscall --dump
Resultado:
Using x86_64 syscall table: 0 read 1 write 2 open 3 close
Audita si hay anomalías en las llamadas al sistema, como
kill
ygetdents
, que suelen manipular los rootkits.Para verificar si se manipuló el controlador de llamadas del sistema, audita las llamadas del sistema y busca comportamientos anómalos. Estos comportamientos varían para cada llamada al sistema.
Una llamada al sistema que suele hackearse es la llamada
kill
. Puedes verificar si se omitió la llamada al sistemakill
. En el siguiente ejemplo, se auditó la llamada al sistemakill
.Instala
auditd
y observa el comportamiento de la VM sin el rootkit Diamorphine:$ sudo apt-get update && sudo apt-get install auditd $ # Add audit rules for specific system calls $ sudo echo "-a exit,always -F arch=b64 -S kill -k audit_kill" >> /etc/audit/rules.d/audit.rules $ sudo /etc/init.d/auditd restart Restarting auditd (via systemctl): auditd.service. $ # Behavior observed without rootkit $ sleep 600 & [1] 1119 $ sudo kill -9 1119 $ sudo ausearch -k audit_kill | grep -A 3 "pid=1119" type=OBJ_PID msg=audit(1677517839.523:198): opid=1119 oauid=1001 ouid=0 oses=1 obj=unconfined ocomm="sleep" type=SYSCALL msg=audit(1677517839.523:198): arch=c000003e syscall=62 success=yes exit=0 a0=45f a1=9 a2=0 a3=7f61c64b2ac0 items=0 ppid=1034 pid=1035 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined key="audit_kill" $ sleep 600 & [1] 1087 $ sudo kill -31 1087 $ sudo ausearch -k audit_kill | grep -A 3 "pid=1087" type=OBJ_PID msg=audit(1677517760.844:168): opid=1087 oauid=1001 ouid=0 oses=1 obj=unconfined ocomm="sleep" type=SYSCALL msg=audit(1677517760.844:168): arch=c000003e syscall=62 success=yes exit=0 a0=43f a1=1f a2=0 a3=7f61c64b2ac0 items=0 ppid=1034 pid=1035 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined key="audit_kill"
En este punto de la inspección, se instaló el rootkit Diamorphine. En los siguientes pasos, se muestra el comportamiento de la VM después de la instalación del rootkit.
Confirma que no haya una entrada de registro de auditoría para el indicador después de que se haya instalado el rootkit de Diamorphine:
$ sudo ausearch -k audit_kill | grep -A 3 "pid=1158" $ sleep 600 & [2] 1167
Verifica los detalles en la entrada de registro de auditoría para encontrar el indicador. En este ejemplo, aunque el rootkit no usurpó por completo este indicador en particular, hay información disponible sobre el proceso de invocador.
$ sudo kill -9 1167 $ sudo ausearch -k audit_kill | grep -A 3 "pid=1167" type=OBJ_PID msg=audit(1677518008.586:237): opid=1167 oauid=1001 ouid=0 oses=1 obj=unconfined ocomm="sleep" type=SYSCALL msg=audit(1677518008.586:237): arch=c000003e syscall=62 success=yes exit=0 a0=48f a1=9 a2=0 a3=7f61c64b2ac0 items=0 ppid=1034 pid=1035 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined key="audit_kill"
Cómo depurar la secuencia de comandos de recopilación de datos
La siguiente secuencia de comandos realiza muchas de las tareas de depuración que se describen en esta página. Puedes ejecutar esta secuencia de comandos en el modo sudo
o root
. La secuencia de comandos solo lee información de depuración del sistema.
$ cat kprot.sh
#!/bin/bash
echo "Boot command line"
cat /proc/cmdline
echo "=================================================="
echo "Loaded modules"
cat /proc/modules
echo "=================================================="
echo "Current tracer"
cat /sys/kernel/debug/tracing/current_tracer
echo "=================================================="
echo "Tracing event enable"
cat /sys/kernel/debug/tracing/events/enable
echo "=================================================="
echo "Tracing sub events enable"
for en in `find /sys/kernel/debug/tracing/events/*/enable`; do printf "\b$en\n"; cat $en; done
echo "=================================================="
echo "IP table rules"
iptables -L
echo "=================================================="
echo "Ftrace list"
cat /sys/kernel/debug/tracing/enabled_functions
echo "=================================================="
echo "Kprobes enabled"
cat /sys/kernel/debug/kprobes/enabled
echo "=================================================="
echo "Kprobes list"
cat /sys/kernel/debug/kprobes/list
echo "=================================================="
echo "Kprobes blocklist"
cat /sys/kernel/debug/kprobes/blacklist
echo "=================================================="
echo "BPF trace"
sudo apt update && sudo apt-get update && sudo apt-get install bpftrace
bpftrace -l
echo "=================================================="
echo "BPF prog list"
sudo apt update && sudo apt install linux-tools-`uname -r`
bpftool prog
echo "=================================================="
¿Qué sigue?
- Más información sobre Virtual Machine Threat Detection
- Descubre cómo usar Virtual Machine Threat Detection