Ataque de Buffer Overflow

01/12/2022

Una de las vulnerabilidades más difícil de mitigar son los ataques de Buffer Overflow o Desbordamiento de Búfer el cual mediante un error de codificación de software los atacantes pueden explotar para obtener acceso no autorizado a los sistemas informáticos. Dicha vulnerabilidad es difícil de mitigar debido a que los desbordamientos de búfer pueden ocurrir de varias maneras y las técnicas utilizadas para evitarlos pueden omitir detalles de importancia que toman tiempo en ser detectados.

El error del software se centra en los búferes, que son secciones secuenciales de la memoria que contienen datos temporales. El desbordamiento de búfer ocurre cuando la cantidad de datos dentro de la memoria excede su capacidad de almacenamiento. Esos datos adicionales se desbordan en ubicaciones de memoria adyacentes y corrompen o sobrescriben los datos en esas ubicaciones.

Figura 01 – Ejemplo de Búfer Overflow

Así el atacante puede ejecutar código malicioso que se escribió en la memoria del software comprometido, cuando se desbordó el búfer de memoria del programa, permitiendo incrementar sus privilegios dentro del sistema para poder obtener acceso remoto al mismo.

Este tipo de ataque es codificado mediante lenguaje de bajo nivel, es decir, comúnmente se utiliza lenguaje ensamblador el cual implementa una representación simbólica de los códigos de máquina binarios necesarios para programar una arquitectura de algún procesador. El siguiente diagrama muestra una representación de la memoria el cual mediante instrucciones del procesador es modificado el software y por ende la inyección de código malicioso.

Figura 02 – Ejemplo en direcciones de memoria de ataque Búfer Overflow (32-bit Stack-based Buffer Overflow - Red Team Notes)

¿Cómo funciona?

En el ejemplo mencionado, la dirección de retorno apunta a una dirección de memoria que contiene la instrucción “jmp esp”. Una vez que la función del programa regresa después de procesar nuestro búfer sobrecargado, saltará a "jmp esp", que transferirá el control del programa al ESP, donde se ejecutará el código malicioso.

Siguiendo con este ejemplo, adentrándose al código ensamblador del software vulnerable y enviando un numero arbitrario de caracteres (“A”) hace que el programa falle, apuntando a una dirección de memoria definida para ese proceso.

Figura 03 – Ejemplo en lenguaje ensamblador de ataque Búfer Overflow 01 (32-bit Stack-based Buffer Overflow - Red Team Notes)

Como se observa en la imagen, el registro EIP apunta a la dirección 778F54EE en el que a pesar de observar que se está sobrescribiendo la memoria con los caracteres enviados, aun no es suficiente para volcar la memoria, por lo que se tendría que incrementar el número de datos enviados para tener control del registro EIP y hacer que apunte a cualquier dirección de memoria.

Figura 04 – Ejemplo en lenguaje ensamblador de ataque Búfer Overflow 02 (32-bit Stack-based Buffer Overflow - Red Team Notes)

 

Al incrementar los caracteres enviados, se observa que el registro EIP ahora apunta a 0A0D4141 lo que sugiere que ahora el atacante pueda regresar cualquier dirección de memoria, pudiendo ejecutar su código malicioso.

Figura 05 – Ejemplo en lenguaje ensamblador de ataque Búfer Overflow – control de los registros EIP y ESP (32-bit Stack-based Buffer Overflow - Red Team Notes)

Como comprobación final, añadiendo una palabra clave al final de los caracteres enviados, se puede observar que se han modificado los registros de las direcciones de memoria, dándonos la ubicación en la cual se necesitaría escribir el código malicioso para que se ejecutado de manera correcta.

Con lo anterior, mediante exploits y mecanismos de inyección de código se puede insertar un programa malicioso en el que se especifiquen de manera precisa las direcciones de memoria en el que se deben escribir, aunado al desbordamiento de búfer provocado por el envió masivo de caracteres para provocar la sobreescritura de memoria.

¿Cómo solucionarlo?

Los desarrolladores pueden protegerse contra las vulnerabilidades de desbordamiento de búfer a través de medidas de seguridad en su código o mediante el uso de lenguajes que ofrecen protección integrada.

Las prevenciones más comunes son:

  • Aleatorización del espacio de direcciones (ASLR): se asignan de manera aleatoria las direcciones de memoria alrededor de toda la memoria disponible.
  • Prevención de ejecución de datos: marca ciertas áreas de la memoria como ejecutables o no ejecutables, lo que evita que un ataque ejecute código en una región no ejecutable.
  • Protección contra sobreescritura del controlador de excepciones estructurado (SEHOP): ayuda a evitar que el código malicioso controle el manejo de excepciones.
  • Uso de lenguajes de programación que permitan el llamado de funciones seguras que previamente han sido probadas
  • Comprobación de límites de matriz en lenguaje C
  • Comprobación de acceso a la memoria

En la actualidad existen herramientas de compilación sistemática como StackGuard el cual evita la ejecución de una amplia clase de ataques de desbordamiento de búfer. Este tipo de herramientas logra modificar el rendimiento de los sistemas computacionales para salvaguardar el correcto funcionamiento del equipo.

Referencias:

  • 32-bit Stack-based Buffer Overflow - Red Team Notes. (s. f.). https://www.ired.team/offensive-security/code-injection-process-injection/binary-exploitation/stack-based-buffer-overflow
  • Cowan, Pu & Maier. (1998). StackGuard: Automatic Adaptive Detection  and Prevention of Buffer-Overflow Attacks. USENIX Security Symposium, 7. https://www.usenix.org/legacy/publications/library/proceedings/sec98/full_papers/cowan/cowan.pdf
  • Hewitt, N., Hasson, E., Hewitt, N., Hasson, E., Winiarski, K., Stapel, G. & Masas, R. (2019, 29 diciembre). What is a Buffer Overflow | Attack Types and Prevention Methods | Imperva. Learning Center. Recuperado 1 de diciembre de 2022, de https://www.imperva.com/learn/application-security/buffer-overflow/
  • Veracode. (s. f.). What Is a Buffer Overflow? Learn About Buffer Overrun Vulnerabilities, Exploits & Attacks. https://www.veracode.com/security/buffer-overflow
  • What Is Buffer Overflow? Attacks, Types & Vulnerabilities. (s. f.). Fortinet. https://www.fortinet.com/resources/cyberglossary/buffer-overflow

 

 

Se describe el ataque Buffer Overflow