Ataque de Buffer Overflow
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.