Vulnerabilidades de bajo nivel y software malicioso

Índice
- Introducción
- Objetivos
- 1.Vulnerabilidades de bajo nivel
- 1.1.Conceptos previos
- 1.1.1.Organización de la memoria de los procesos
- 1.1.2.Llamadas a funciones
- 1.1.3.Buffers
- 1.2.Buffers overflow
- 1.1.Conceptos previos
- 2.Software malicioso
- 2.1.Taxonomía del malware
- 2.1.1.Malware de propagación automática
- 2.1.2.Malware oculto
- 2.1.3.Malware lucrativo
- 2.2.Vectores de infección
- 2.3.Mecanismos de prevención
- 2.1.Taxonomía del malware
- 3.Detección de malware
- 3.1.Detección sintáctica basada en firmas
- 3.1.1.Tipos de firmas
- 3.1.2.Ámbitos de búsqueda
- 3.2.Detección semántica
- 3.2.1.Análisis dinámico
- 3.2.2.Análisis estático
- 3.1.Detección sintáctica basada en firmas
- 4.Mecanismos de evasión
- Resumen
- Actividades
- Ejercicios de autoevaluación
- Bibliografía
Introducción
Objetivos
-
Aprender las bases teóricas de las vulnerabilidades de tipo desbordamiento de buffer.
-
Identificar los diferentes tipos de malware en función de sus características.
-
Conocer los mecanismos básicos de prevención contra el software malicioso.
-
Tener una visión completa de las estrategias de detección de código malicioso.
-
Saber cuáles son los mecanismos de evasión utilizados por el malware para evitar su detección y erradicación
1.Vulnerabilidades de bajo nivel
1.1.Conceptos previos
1.1.1.Organización de la memoria de los procesos

1.1.2.Llamadas a funciones
-
Llamada: los parámetros de la función son almacenados en la pila así como el contenido del registro instruction pointer (1) , lo que permitirá determinar la dirección de retorno tras la llamada. Seguidamente se ajusta el instruction pointer con la dirección de memoria de la función que se desea llamar, redirigiendo así el flujo de ejecución hacia ésta.
-
Prólogo: el registro frame pointer (2) que contiene la dirección base de las variables locales, es almacenado en la pila y modificado para que apunte a las variables locales de la función que se está llamando. Se reserva el espacio necesario en la pila para las variables locales de la función llamada, ajustando el registro stack pointer (3) que apunta a la cima de la pila. Tras el prólogo se ejecutará el código de la función en sí
-
Retorno (o epílogo): se retorna al estado previo de la pila antes de la ejecución, restaurando el frame pointer y el intruction pointer. La restauración del instruction pointer permite redirigir el flujo de ejecución al código que realizó la llamada
void function(int a, int b, int c) { char buffer1[7]; char buffer2[9]; } int main(void) { function(1,2,3); return 0; }
0x080483bc <+0>: push ebp 0x080483bd <+1>: mov ebp,esp 0x080483bf <+3>: sub esp,0xc 0x080483c2 <+6>: mov DWORD PTR [esp+0x8],0x3 0x080483ca <+14>: mov DWORD PTR [esp+0x4],0x2 0x080483d2 <+22>: mov DWORD PTR [esp],0x1 0x080483d9 <+29>: call 0x80483b4 <function> 0x080483de <+34>: mov eax,0x0 0x080483e3 <+39>: leave 0x080483e4 <+40>: ret
mov esp,ebp pop ebp
0x080483b4 <+0>: push ebp 0x080483b5 <+1>: mov ebp,esp 0x080483b7 <+3>: sub esp,0x10 0x080483ba <+6>: leave 0x080483bb <+7>: ret
1.1.3.Buffers
#include <stdio.h> #include <string.h> int main(void) { char buffer1[4] = "111"; char buffer2[4] = "222"; strcpy(buffer2, "123456"); printf("%s\n", buffer1); return 0; }
student@uoc ~ $ gcc strbof.c -o strbof student@uoc ~ $ ./strbof 56 student@uoc ~ $

1.2.Buffers overflow
-
Stack overflow
-
Heap overflow
-
String format
-
Integer overflow
-
Return into libc
-
Return into environment
-
Return into got
#include <stdio.h> #include <string.h> int main(int argc, char **argv) { char buf[256]; if(argc > 1) { strcpy(buf, argv[1]); printf("%s", buf); } return 0; }
student@uoc ~ $ gcc -fno-stack-protector -z execstack -o bof bof.c student@uoc ~ $ ./bof `python -c "print 'A' * 300;" ´ Violación de segmento student@uoc ~ $
student@uoc ~ $ gdb ./bof [...] (gdb) run `python -c "print 'A'*300;" ´ Starting program: /home/student/bof `python -c "print 'A'*300;" ´ Program received signal SIGSEGV, Segmentation fault. 0x41414141 in ?? () (gdb) info registers eip eip 0x41414141 0x41414141


2.Software malicioso
Virus informático según CohenCohen define un virus informático (computer virus, N. del T.) como un "programa que puede infectar a otros incluyendo una copia posiblemente evolucionada de sí mismo".
Cohen (1984)
2.1.Taxonomía del malware
2.1.1.Malware de propagación automática
-
Malware de propagación por infección vírica. Es aquel en el que el código malicioso se replica a sí mismo al añadirse a archivos ejecutables, o con la capacidad de ejecutar algún tipo de código. Asimismo, este modifica el código del programa original para que, en algún instante, el flujo de ejecución sea redirigido a las instrucciones del malware. Cada vez que el código malicioso toma el control, busca nuevos archivos no contaminados con la intención de infectarlos y, tras esto, devuelve el control al programa original. A esta misma categoría, y de forma análoga al caso anterior, pertenece el malware que infecta el master boot record (MBR) de los discos duros, lo que le permite ejecutarse tras las pertinentes operaciones de la BIOS, y tomar el control antes de que se cargue el sistema operativo. Al malware que emplea este tipo de propagación se le conoce tradicionalmente como virus, y su nombre se debe a la analogía que existe con los virus biológicos, y a cómo estos infectan y se multiplican dentro de las células de otros organismos. En ocasiones, el término virus se utiliza de forma errónea para referirse a otros tipos de malware, tales como el spyware o los troyanos, que no deben ser confundidos dado que estos no infectan a otros archivos.
-
Malware de propagación como gusano. Es aquel que se replica a sí mismo empleando la red a la que está conectado el sistema infectado, enviando copias de sí mismo a otros sistemas de la red que no están contaminados. Este envío se realiza sin la intervención del usuario, y puede emplear varias estrategias para propagarse, tales como la explotación remota de un desbordamiento de buffer conocido, el envío indiscriminado de correos electrónicos infectados con el malware, las redes P2P, o los clientes de mensajería instantánea entre otros. Al malware que emplea este tipo de propagación se le conoce tradicionalmente como gusanos
2.1.2.Malware oculto
-
Rootkits. Este tipo de código malicioso tiene sus orígenes en los sistemas Unix, y su denominación se utilizaba para hacer referencia al conjunto de herramientas que permitían a un atacante obtener privilegios de administrador (root). Hoy en día, el término rootkit se emplea de forma más generalizada para designar al conjunto de técnicas que permiten eludir la detección y la eliminación de cualquier malware. Estas técnicas se basan en la modificación del sistema operativo de la máquina infectada a bajo nivel, permitiendo la ocultación de procesos, archivos o conexiones de red utilizadas por el software malicioso.
-
Troyanos. El software malicioso que pertenece a esta categoría se caracteriza por estar enmascarado detrás de un supuesto programa legítimo. La víctima, previo a la instalación de dicho software, lo percibe como un programa que proporciona unas funcionalidades de su interés. Sin embargo, tras la instalación, y sin el consentimiento del usuario y sin que este sea consciente, el malware actúa escondiéndose detrás de un software aparentemente lícito. La actividad oculta que lleva a cabo el código malicioso puede ser de distinta índole, aunque normalmente suele estar enfocada al control remoto de la máquina infectada, o bien al robo de información. Para forzar a la instalación del troyano, el atacante puede emplear técnicas de ingeniería social para convencer al usuario, ya sea a través de un correo o de una página web, por ejemplo.
-
Puertas traseras (backdoors). Esta categoría engloba a todo software malicioso que es instalado en un sistema ya comprometido, y que permite eludir los mecanismos de autenticación a la vez que permanece oculto a los administradores del sistema. De esta manera, una puerta trasera en una máquina infectada permite a un atacante garantizar el acceso al sistema en un futuro de una manera sencilla y rápida. A pesar de que la existencia de las puertas traseras no es una idea nueva, la proliferación de este tipo de código malicioso ha tenido especial relevancia desde la explosión de Internet. La red de redes ha permitido a los atacantes instalar puertas traseras que garantizan el acceso a sistemas comprometidos de forma remota. En ocasiones las puertas traseras pueden adoptar forma de troyano e incluso puede incluir técnicas de rootkits
2.1.3.Malware lucrativo
-
Spyware. Es un software malicioso que registra información sensible de usuarios sin su consentimiento, violando la privacidad de estos. La información recogida por este tipo de aplicaciones puede ser de distinta índole, como por ejemplo, datos personales, números de tarjeta de crédito, hábitos de navegación web, contraseñas, pulsaciones de teclas, o incluso capturas de pantalla. Esta información se transmite a terceras partes con finalidades como son el fraude electrónico, el marketing a través de publicidad web no consentida, u otras actividades maliciosas.
-
Ransomware. Es un tipo de malware que extorsiona a los usuarios propietarios de una máquina infectada, exigiendo algún tipo de pago tras cifrar archivos, o bien desactivar o bloquear partes del sistema. Si el usuario realiza el pago –usualmente vía transferencia bancaria o SMS con cargo adicional–, el atacante proporciona algún mecanismo para eliminar el perjuicio causado por el mismo código malicioso. En el caso particular del malware que hace uso de la criptografía para cifrar archivos se le conoce como criptovirus. Estos suelen basarse en esquemas criptográficos asimétricos o híbridos, lo que impide el acceso al contenido de los archivos cifrados al no disponer la víctima de la clave privada.
-
Scareware. Es un código malintencionado que, basándose en estrategias de ingeniería social, puede proporcionar beneficios económicos al atacante. En concreto, explota el engaño, la persuasión, la coacción o el miedo a través de mensajes de alarma o de amenaza para forzar a la víctima a realizar un pago. El ejemplo más común es el de programas que detrás de la apariencia de software para la detección de malware esconden este tipo de código malicioso. Una vez instalado, el programa reporta la existencia de una cantidad elevada de software malicioso en el sistema, cuando la realidad no es así. Entonces, el scareware brinda la posibilidad al usuario de eliminar las amenazas detectadas pagando por una versión diferente del software de detección. A este tipo de scareware se le conoce con el nombre de rogueware. Otras formas de scareware se basan en explotar el sentimiento de culpa y el miedo que pueden sentir algunos usuarios al descargar software ilegal. En particular, una vez instalado, este tipo de scareware muestra mensajes de advertencia indicando que se están violando las leyes del copyright y que se tiene identificada la IP del usuario. Seguidamente, propone evitar un juicio realizando un pago como forma de solventar la situación.
-
Bot. Es un código malicioso que permite a un atacante controlar de forma remota la máquina que lo ejecuta. Al conjunto de máquinas distribuidas e infectadas por bots, y controladas por un atacante, se le conoce con el nombre de botnet. La suma de recursos proporcionados por cada máquina infectada permiten realizar actividades fraudulentas, como son ataques de denegación de servicio distribuidos o el envío masivo de SPAM.
-
Adware. Es un tipo de malware que de forma automática muestra publicidad no consentida al usuario, con la finalidad de que realice algún tipo de compra. Esta publicidad suele aparecer en los navegadores web como ventanas emergentes, siendo un comportamiento molesto e indeseable para el usuario. Algunos tipos de adware pueden ser clasificados también como spyware, ya que la publicidad mostrada va acorde con información registrada de la actividad del usuario.
-
Dialers. Es un tipo de software malintencionado cuyo objetivo es modificar la configuración del programa de marcado de los módems. En particular, modifican el número de teléfono a marcar por otro cuya tarifa es más elevada en comparación con la asociada al número legítimo. Esto supone un aumento en el importe de la factura telefónica del usuario, siendo el atacante el beneficiario. Este tipo de malware tuvo éxito cuando el acceso a Internet se realizaba con un módem conectado a la red de telefonía conmutada. Hoy en día, este tipo de software está en declive, ya que la mayoría de tecnologías actuales para el acceso a la red Internet funcionan de forma diferente
2.2.Vectores de infección
2.3.Mecanismos de prevención
3.Detección de malware
3.1.Detección sintáctica basada en firmas
3.1.1.Tipos de firmas

3.1.2.Ámbitos de búsqueda
3.2.Detección semántica
-
La primera de ellas modela el comportamiento legítimo sobre la base de aplicaciones conocidas y no maliciosas. A partir de aquí, cualquier desviación con respecto a esta referencia se considera como acciones ejecutadas por malware. Esta primera aproximación tiene la capacidad de detectar cualquier tipo de software malicioso no conocido. Sin embargo, la complejidad de esta propuesta radica en definir dicho modelo de comportamiento legítimo. Esto cobra especial sentido si tenemos en cuenta la multitud de aplicaciones que existen y sus diferentes naturalezas, lo que conduce a que no sea posible extraer un perfil legítimo y único común a todas ellas. Por este motivo, esta estrategia siempre se basa en modelos estadísticos y es proclive a falsos positivos
-
La segunda aproximación, en contraposición con la anterior, se basa en modelar el comportamiento sospechoso de las aplicaciones maliciosas. En este caso, cualquier tipo de acciones detectadas que se aproximen a este modelo de referencia inducirán a la identificación del código malicioso. Esta segunda opción, a pesar de no poder detectar nuevo malware con tanta facilidad, se utiliza de forma más habitual al no ser tan sensible a los falsos positivos

3.2.1.Análisis dinámico
Técnicas heurísticas
-
La primera estrategia se basa en otorgar a cada acción atómica un valor cuantitativo en forma de peso. Este peso, obtenido a partir de la experimentación previa, expresa la gravedad de la acción de manera numérica. En este caso, desde la perspectiva del motor de detección, las firmas se corresponden precisamente a la asociación entre acciones y pesos. Cuando la suma acumulativa de estos pesos supera un determinado umbral para un programa específico, se considera que éste es código malicioso.
-
La segunda técnica se basa en identificar cada acción atómica con una etiqueta en función de un conocimiento previo. Cada una de estas etiquetas estará asociada a un tipo de acción. El motor de detección tendrá como firmas secuencias de etiquetas que identifican diferentes tipos de malware. Cuando una secuencia de acciones llevadas a cabo por un programa originen un conjunto de etiquetas ordenadas y correspondientes a una firma, se identificará al código que las originó como malicioso. Por tanto, con cada nueva acción será necesario guardar su etiqueta asociada junto a las anteriores. Usualmente, el conjunto de todas la firmas pueden ser representadas en forma de árbol, donde cada nodo se corresponde a una etiqueta, y los nodos hoja identifican un malware particular. De esta manera, la identificación de software malicioso pasa por recorrer el árbol en función de la secuencia de etiquetas que se van generando, hasta llegar a un nodo hoja.
Máquinas de estados
-
Los estados Q del autómata se corresponden a los estados internos del comportamiento malicioso.
-
El estado inicial se corresponde al inicio del análisis.
-
El alfabeto está compuesto por símbolos que consideraremos como llamadas al sistema.
-
La función de transición describe los cambios de estado en base a llamadas sospechosas.
-
Los estados de finales implican la detección del comportamiento malicioso que define el autómata

Sistemas expertos
3.2.2.Análisis estático
4.Mecanismos de evasión
4.1.Técnicas de ofuscación
4.1.1.Malware cifrado, oligomorfismo, polimorfismo ymetamorfismo
Técnicas de ofuscación del polimorfismo y del metamorfismo
4.1.2.Compresión de ejecutables

4.1.3.Entry point obscuring
4.1.4.Ofuscación por virtualización
4.2.Técnicas de ocultación y autoprotección
4.3.Mecanismos antidebugging
-
ejecutar código complejo sin ninguna finalidad para desalentar al analista,
-
exhibir un comportamiento legítimo en vez de malicioso, o
-
finalizar su ejecución
Resumen
Actividades
Ejercicios de autoevaluación
a) prólogo
a) suele venir precedido de instrucciones NOP para maximizar el éxito del ataque
a) se sobreescribe la dirección de retorno de alguna función
a) Las firmas pueden incluir expresiones regulares
a) es un problema indecidible
a) es una técnica antidebugging
a) Puede utilizar la ingeniería social en un correo para propagarse
a) aceleran el proceso de detección en términos generales
a) el malware cifrado
a) No requiere firmas
Solucionario
1. a) Incorrecto.b) Incorrecto.
c) Correcto.
d) Incorrecto.
2. a) Incorrecto.
b) Incorrecto.
c) Incorrecto.
d) Correcto.
3. a) Incorrecto.
b) Incorrecto.
c) Incorrecto.
d) Correcto.
4. a) Incorrecto.
b) Incorrecto.
c) Correcto.
d) Incorrecto.
5. a) Correcto.
b) Incorrecto.
c) Incorrecto.
d) Incorrecto.
6. a) Incorrecto.
b) Incorrecto.
c) Incorrecto.
d) Correcto.
7. a) Incorrecto.
b) Incorrecto.
c) Incorrecto.
d) Correcto.
8. a) Incorrecto.
b) Incorrecto.
c) Incorrecto.
d) Correcto.
9. a) Incorrecto.
b) Incorrecto.
c) Correcto.
d) Incorrecto.
10. a) Incorrecto.
b) Correcto.
c) Incorrecto.
d) Incorrecto.