Búsqueda de Ciberamenazas

El escaneado de memoria no permite que los atacantes se escondan

Sophos X-Ops analiza en profundidad el escaneado de memoria y por qué es importante

En el primero de nuestra nueva serie de artículos técnicos de liderazgo intelectual, cuyo objetivo es ofrecer a los lectores una visión en profundidad de algunas de nuestras tecnologías e investigaciones, hemos querido ofrecer una visión general de nuestra protección contra el escaneado de memoria y de cómo funciona.

El escaneo de la memoria, es decir, la búsqueda de amenazas en la memoria de un proceso (la imagen del proceso o los módulos sospechosos, subprocesos y regiones de la pila), puede realizarse de varias formas por los productos de seguridad y en distintos momentos. Puede levarse a cabo cuando se ha creado un nuevo proceso, o regularmente para todos o algunos procesos del sistema. Por ejemplo, un desencadenante de comportamiento para un escaneo de memoria puede ser que el malware llame a CreateRemoteThread (o variantes del mismo) cuando intenta ejecutar una carga maliciosa que se ha inyectado en un proceso; u otras llamadas sospechosas a la API que se utilizan habitualmente en la inyección de procesos y técnicas relacionadas, como VirtualAllocEx y WriteProcessMemory, para asignar memoria y copiar cargas útiles, respectivamente. El malware más sofisticado puede llamar a funciones de API no documentadas, o evitarlas por completo en favor de llamadas directas al sistema y otras técnicas. Combatir estos métodos requiere un enfoque ligeramente diferente del escaneo de memoria. Existen otros posibles desencadenantes de comportamiento para un escaneo de memoria, como la creación de procesos, la lectura/escritura de archivos o la conexión a una dirección IP.

Durante casi un cuarto de siglo, hemos dedicado una cantidad considerable de investigación y esfuerzo al desarrollo de diversas formas de escaneo de memoria. Esto se remonta al año 2000, cuando nuestras capacidades incluían escaneos periódicos y bajo demanda, evolucionando a escaneos de memoria basados en el comportamiento con HIPS (Sistemas de Prevención de Intrusiones basados en el Host), y ahora empleando una tecnología de comportamiento mucho más sofisticada que evoluciona a medida que lo hace el panorama de las amenazas. En concreto, nuestras capacidades no dependen de la coincidencia de patrones, sino que emplean una lógica más compleja, como un lenguaje de definición Turing-completo que emplea un enfoque algorítmico.

¿Por qué necesitamos escanear la memoria?

La creciente ubicuidad de las soluciones antivirus y de detección de Endpoints significa que los actores de amenazas son más cautelosos que nunca a la hora de soltar archivos maliciosos en el disco. Desde su punto de vista, al hacerlo corren el riesgo no solo de que se frustre ese ataque concreto, sino también de tener que reequiparse a medida que su malware es analizado, firmado y sometido a ingeniería inversa.

Como resultado, los actores de las amenazas recurren cada vez más a las denominadas técnicas “sin archivos”, como la inyección de procesos, los empaquetadores, el código virtualizado y los criptógrafos, para ejecutar cargas útiles maliciosas. Por ejemplo, en nuestra reciente telemetría, descubrimos que el 91% de las muestras de ransomware, y el 71% de las muestras de RAT, estaban empaquetadas a medida o utilizaban algún tipo de ofuscación de código.

Fundamentalmente, muchas de estas técnicas significan que la propia carga útil, aunque llegue al disco, está cifrada, y sus verdaderas intenciones y capacidades solo se revelan en la memoria. Esto dificulta que las soluciones de seguridad distingan entre archivos limpios y maliciosos, y las contramedidas, como desempaquetar archivos emulando las instrucciones del empaquetador, suelen tener un coste computacional considerable.

Muchas de estas herramientas y técnicas están disponibles en repositorios de código de fuente abierto, o dentro de marcos comerciales diseñados para pruebas de penetración legítimas; como resultado, es fácil para los actores de amenazas aprovecharlas durante los ataques, a menudo en formas ligeramente modificadas. En una próxima serie de blogs, recorreremos varias técnicas diferentes de inyección de procesos, con demostraciones, para mostrar lo sencillo que es para los actores de amenazas utilizar soluciones estándar. Los atacantes más avanzados, por supuesto, son capaces de encontrar nuevas técnicas, o de crear combinaciones novedosas y perfeccionar los métodos existentes.

Los ataques en memoria proporcionan a los actores de amenazas una ventaja crucial: pueden eludir la detección ejecutando cargas útiles maliciosas sin escribir nada incriminatorio en el disco. Algunas técnicas (como ciertas formas de inyección de procesos) también pueden complicar el análisis forense posterior al incidente, y permiten a los actores de la amenaza recopilar información sensible, como credenciales almacenadas en memoria, o escalar sus privilegios.

Sin embargo, el escaneado de memoria se aprovecha de un hecho crucial: cuando se carga en memoria, el malware debe revelarse. Será desempaquetado, o desencriptado, para que pueda alcanzar su objetivo final. Examinar y evaluar la región de memoria en la que esto ocurre, en tiempo real, nos permite emitir un juicio sobre si un hilo o proceso concreto contiene código malicioso.

Y aunque el escaneo de la memoria ha sido históricamente un proceso costoso desde el punto de vista informático, sobre todo cuando se escanea la memoria de todo un sistema, hay varias formas de dirigir los escaneos de la memoria basándonos en indicios contextuales sobre un incidente determinado y otros factores. Esto nos permite adaptarnos con flexibilidad a la situación y, por tanto, maximizar el rendimiento.

Tipos de exploración de la memoria

Escanear la memoria de todo un sistema puede plantear problemas de rendimiento. Es más, no siempre es necesario. Como el escaneo de la memoria es una función dentro de un subconjunto más amplio de herramientas de detección y prevención, a menudo sabemos dónde queremos escanear, o cuándo, y así podemos realizar un escaneo de memoria específico contra un proceso (o procesos) en el momento en que muestran un comportamiento sospechoso.

Por ejemplo, supongamos que nos alertan de un malware que secuestra un hilo dentro de un proceso legítimo en ejecución (como el ataque Suspender, Inyectar, Reanudar, o SIR), o de un malware que lanza un proceso legítimo e inyecta en él una carga maliciosa (como en diversas formas de inyección de procesos). Podemos simplemente escanear ese hilo o proceso, lo que limita la sobrecarga de rendimiento y facilita la concentración de recursos en la evaluación de esa región concreta de la memoria.

An image showing types of memory scanning, arranged as circular diagrams.
Figura 1: visión general de nuestros tipos de escaneado de memoria selectiva

Selección “dónde”

Padre/hijo

En las ocasiones en que un proceso sospechoso genera otro proceso y se inyecta en él, podemos escanear tanto el proceso padre como el hijo en busca de código malicioso.

Hilo único

Los atacantes suelen apuntar a procesos concretos para inyectarlos, como lsass.exe (que contiene credenciales confidenciales que pueden aprovecharse para escalar privilegios) o explorer.exe. Normalmente, estos procesos tienen cientos de hilos. En estos casos, no es necesario escanear todos y cada uno de los hilos del proceso para localizar una carga maliciosa; en su lugar, localizamos un hilo específico a través de su ID (por ejemplo, identificando los hilos que están a punto de iniciarse o reanudarse a través de llamadas a la API como CreateRemoteThread) y escaneamos solo ese hilo.

Selección “cuándo”

En línea

Aquí, un escaneo se activa por un comportamiento específico, como la creación de un proceso; los analistas escriben reglas de comportamiento basadas en comportamientos sospechosos que pueden no ser suficientes en sí mismos para matar el proceso, pero son razón suficiente para iniciar un escaneo. Impedimos que se complete el comportamiento dado, y solo permitimos que continúe una vez que se ha completado el escaneo y si todo parece ir bien.

Asíncrono

Un escaneo asíncrono es para circunstancias en las que no podemos tomar una decisión sobre un comportamiento concreto hasta que se complete la acción y tengamos más contexto, por lo que permitimos que el proceso continúe mientras lo escaneamos, al tiempo que actualizamos continuamente la evaluación.

Periódicos

Algunos programas maliciosos sin archivos permanecen inactivos en la memoria durante algún tiempo para eludir las defensas o cuando esperan respuestas del C2, a veces durante unos minutos u horas, pero a veces durante mucho más tiempo. Para contrarrestarlo, podemos escanear la memoria a intervalos regulares en busca de comportamientos maliciosos.

Programado

Aquí, el usuario quiere escanear todas las máquinas a una hora concreta del día o a intervalos determinados, para no provocar un pico en el consumo de memoria.

Limpieza posterior a la detección

Si se activa una regla de comportamiento y, como resultado, bloqueamos un proceso, también activamos un escaneo de memoria, para comprobar si quedan restos del proceso malicioso en la memoria. Por ejemplo, algunos programas maliciosos emplean una técnica denominada “hilo vigilante”, en la que un hilo permanece inactivo y se limita a supervisar la ejecución de una carga maliciosa en otro. Si el hilo principal muere, el hilo vigilante toma el relevo y reanuda la actividad. Un escaneo de memoria de limpieza posterior a la detección termina todos los hilos asociados, para que el malware no se vuelva a lanzar.

Escaneado de memoria en acción

Para demostrar algunos de los tipos de escaneado de memoria de los que hemos hablado antes, seleccionamos una muestra de malware y la ejecutamos en un entorno de laboratorio protegido por Sophos para capturar los detalles de protección del comportamiento notificados tras varios escaneados de memoria. En un entorno real, el producto bloquearía la ejecución en cuanto el malware activara alguna de las protecciones indicadas más abajo.

El malware que utilizamos para esta prueba es Agent Tesla RAT, una amenaza común que se distribuye a menudo a través de correos spam maliciosos. Los actores de la amenaza utilizan Agent Tesla para robar credenciales mediante capturas de pantalla y keylogging. Las versiones más recientes emplean diversas técnicas anti-sandbox y anti-análisis.

Por comodidad, al hablar de los escaneos de memoria y las protecciones que se disparan al ejecutar Agent Tesla, detallaremos también las técnicas ATT&CK de MITRE correspondientes.

An image showing five memory protections against the Agent Tesla RAT
Figura 2: vista general de los escaneos iniciados durante nuestra prueba de laboratorio de una muestra de Agent Tesla RAT

Evade_7a (T1055.012) (publicado por primera vez en junio de 2019)

Esta regla de escaneo de memoria se activa cuando un proceso sospechoso lanza un proceso limpio de alta reputación, potencialmente para inyectar procesos. Como la regla se activa durante un evento ProcessCreate, el proceso recién creado aún no se ha iniciado, por lo que escaneamos el proceso sospechoso en busca de código malicioso. En un entorno real, las protecciones de Sophos matarían los procesos padre e hijo, y eliminarían cualquier archivo sospechoso asociado.

Evade_34b (T1055.012) (publicado por primera vez en febrero de 2023)

Esta regla se basa en técnicas, centrándose específicamente en el vaciado de procesos. Extrapola características específicas de la memoria del proceso, y evalúa si un proceso objetivo ha sido vaciado e inyectado con contenido malicioso. Dado que esta regla se centra en la técnica, y no en el código específico, proporciona una protección y una garantía de comportamiento adicionales

Exec_14a (T1055.012) (publicado por primera vez en octubre de 2019)

Aquí se produce un escaneo de memoria como resultado de un evento específico que ocurre cuando se inyecta código malicioso en un proceso hijo, como parte de la secuencia SIR a la que se ha hecho referencia anteriormente. Este evento activa una protección.

A screenshot of computer code, with a memory dump on the left and dnSpy output on the right
Figura 3: el código de Tesla RAT que corresponde a una parte del flujo de trabajo SIR, que provoca la activación de una protección

El proceso que se escanea ya está marcado como proceso sospechoso, puesto que fue lanzado por otro proceso sospechoso (el proceso padre de la sección anterior). Durante un ataque típico de inyección de procesos, queremos bloquear el proceso inyectado lo antes posible, lo que conseguimos apuntando al proceso poco después de que se haya inyectado el código malicioso. Si el proceso padre no parecía contener ningún código malicioso durante el primer escaneado, este escaneado es el siguiente paso; nos permite comprobar si el malware ha desempaquetado algún código malicioso.

C2_1a (T1071.001 y T1095) (publicado por primera vez en febrero de 2020)

En este punto, el Agente Tesla establece una conexión saliente con un servidor C2.

A screenshot of computer code
Figura 4: parte del código de Tesla RAT responsable de realizar una conexión C2 saliente

Aquí informamos de dos técnicas diferentes, porque también capturamos el número de puerto; para los puertos 80 y 443, informamos de T1071, y para los demás, informamos de T1095. Se trata principalmente de un escaneo asíncrono. Aquí no retenemos intencionadamente la ejecución del proceso, a diferencia de los dos escaneos anteriores, sino que cuando se dispara la detección de memoria, el proceso se terminaría inmediatamente.

Creds_2c (T1555.003) (publicado por primera vez en septiembre de 2021)

Esta regla se activa cuando un proceso toca archivos que contienen credenciales (como las credenciales del navegador) en el disco; escaneamos el proceso responsable en busca de cualquier código sospechoso. Normalmente, los procesos ajenos al navegador no tocarían estos archivos, por lo que son inmediatamente sospechosos.

A screenshot of computer code
Figura 5: Tesla RAT busca credenciales en el almacenamiento local

Memoria_1b (publicada por primera vez en septiembre de 2021)

Por último, se trata de un escaneo periódico de la memoria en segundo plano, que analiza todos los procesos en ejecución de un sistema a intervalos regulares. Proporciona una capa adicional de seguridad, asegurando que todos los procesos son escaneados, incluso si no hay desencadenantes de comportamiento.

Como se muestra en este ejemplo, disponer de varias capas de escaneado para distintos eventos y desencadenantes, complementadas con escaneados periódicos en todo el sistema, es una defensa clave contra las amenazas en memoria, ya que proporciona múltiples oportunidades para acabar con los procesos maliciosos.

Conclusión

Aunque el escaneado de la memoria no es una panacea para todos los ataques en memoria, es un arma importante en la batalla continua contra el malware cada vez más sofisticado. Como ocurre con cualquier forma de protección, las técnicas de escaneado de memoria deben adaptarse constantemente y responder a los avances del mundo real, a medida que los actores de las amenazas desarrollan nuevos métodos o se basan en los que ya existen.

Como hemos señalado antes, llevamos mucho tiempo haciendo esto, y a medida que el panorama de las amenazas ha ido cambiando y evolucionando, hemos seguido adaptando nuestras tecnologías para proteger contra las amenazas, manteniendo al mismo tiempo los gastos generales de rendimiento al mínimo y asegurándonos de incorporar redundancia en nuestros distintos tipos de escaneado para ofrecer una protección en profundidad. Estos son los principios centrales de las capacidades de escaneado de memoria de Sophos, y nuestra investigación actual así lo refleja.

Por ejemplo, un área que estamos investigando actualmente es el uso de los datos y la inteligencia que hemos recopilado a través de todos nuestros incidentes, investigaciones y análisis para identificar estadísticamente ciertos patrones en la memoria que sugieren una clase particular de malware. Varias familias de ransomware, por ejemplo, pueden tener bases de código y enfoques muy diferentes para enumerar y cifrar archivos, pero, desde una perspectiva en memoria, hay puntos en común entre muchos de ellos que podemos utilizar para crear protecciones más genéricas. Del mismo modo, las RAT y los ladrones de información pueden ser muy distintos en sí mismos, pero a menudo generan secuencias predecibles de comportamiento que, a nivel de memoria, pueden ser un buen indicador de que un hilo o proceso concreto ha sido secuestrado por una RAT o un ladrón de información.