¿Qué es el buffer overflow?
El buffer overflow (en español: desbordamiento del búfer) es una anomalía que se produce cuando el software que escribe datos en un búfer desborda la capacidad del mismo, lo que provoca que se sobrescriban las ubicaciones de memoria adyacentes. En otras palabras, se pasa demasiada información a un contenedor que no tiene suficiente espacio, y esa información acaba sustituyendo los datos de los contenedores adyacentes.
Los desbordamientos del búfer pueden ser explotados por atacantes con el objetivo de modificar la memoria de un ordenador para socavar o tomar el control de la ejecución del programa.
¿Qué es un buffer?
Un búfer, o memoria intermedia de datos, es un área de almacenamiento de memoria física que se utiliza para almacenar temporalmente los datos mientras se mueven de un lugar a otro. Estos búferes suelen estar en la memoria RAM. Los ordenadores utilizan con frecuencia los búferes para ayudar a mejorar el rendimiento; la mayoría de los discos duros modernos aprovechan el búfer para acceder a los datos de forma eficiente, y muchos servicios en línea también utilizan búferes. Por ejemplo, los búferes se utilizan con frecuencia en la transmisión de vídeo en línea para evitar interrupciones. Cuando se transmite un vídeo, el reproductor de vídeo descarga y almacena tal vez un 20% del vídeo a la vez en un búfer y luego transmite desde ese búfer. De este modo, las pequeñas caídas en la velocidad de conexión o las interrupciones rápidas del servicio no afectarán al rendimiento del flujo de vídeo.
Los búferes están diseñados para contener cantidades específicas de datos. A menos que el programa que utiliza el búfer tenga instrucciones incorporadas para descartar los datos cuando se envían demasiados al búfer, el programa sobrescribirá los datos en la memoria adyacente al búfer.
Los desbordamientos de búfer pueden ser explotados por los atacantes para corromper el software. A pesar de ser bien conocidos, los ataques de desbordamiento de búfer siguen siendo un problema de seguridad importante que atormenta a los equipos de ciberseguridad. En 2014, una amenaza conocida como «heartbleed» expuso a cientos de millones de usuarios a un ataque debido a una vulnerabilidad de desbordamiento de búfer en el software SSL.
¿Cómo explotan los atacantes los desbordamientos de búfer?
Un atacante puede introducir deliberadamente una entrada cuidadosamente elaborada en un programa que hará que éste intente almacenar esa entrada en un búfer que no es lo suficientemente grande, sobrescribiendo partes de la memoria conectadas al espacio del búfer. Si la disposición de la memoria del programa está bien definida, el atacante puede sobrescribir deliberadamente áreas que se sabe que contienen código ejecutable. El atacante puede entonces sustituir este código por su propio código ejecutable, lo que puede cambiar drásticamente el funcionamiento del programa.
Por ejemplo, si la parte sobrescrita en la memoria contiene un puntero (un objeto que apunta a otro lugar en la memoria) el código del atacante podría reemplazar ese código con otro puntero que apunte a una carga útil de explotación. Esto puede transferir el control de todo el programa al código del atacante.
¿Quién es vulnerable a los ataques de desbordamiento del búfer?
Algunos lenguajes de codificación son más susceptibles al desbordamiento del búfer que otros. C y C++ son dos lenguajes populares con alta vulnerabilidad, ya que no contienen protecciones integradas contra el acceso o la sobreescritura de datos en su memoria. Windows, Mac OSX y Linux contienen código escrito en uno o ambos lenguajes.
Los lenguajes más modernos, como Java, PERL y C#, tienen características incorporadas que ayudan a reducir las posibilidades de desbordamiento del búfer, pero no pueden evitarlo por completo.
Cómo protegerse de los ataques de desbordamiento del búfer
Por suerte, los sistemas operativos modernos tienen protecciones en tiempo de ejecución que ayudan a mitigar los ataques de desbordamiento de búfer. Exploremos dos protecciones comunes que ayudan a mitigar el riesgo de explotación:
- Aleatorización del espacio de direcciones – Reorganiza aleatoriamente las ubicaciones del espacio de direcciones de las áreas de datos clave de un proceso. Los ataques de desbordamiento del búfer generalmente se basan en conocer la ubicación exacta del código ejecutable importante, la aleatorización de los espacios de direcciones hace que esto sea casi imposible.
- Prevención de la ejecución de datos: marca ciertas áreas de la memoria como ejecutables o no ejecutables, lo que impide que un exploit ejecute el código encontrado en un área no ejecutable.
Los desarrolladores de software también pueden tomar precauciones contra las vulnerabilidades de desbordamiento del búfer escribiendo en lenguajes que tienen protecciones incorporadas o utilizando procedimientos especiales de seguridad en su código.
A pesar de las precauciones, los desarrolladores siguen descubriendo nuevas vulnerabilidades de desbordamiento de búfer, a veces tras una explotación exitosa. Cuando se descubren nuevas vulnerabilidades, los ingenieros tienen que parchear el software afectado y asegurarse de que los usuarios del software tienen acceso al parche.
¿Cuáles son los diferentes tipos de ataques de desbordamiento de búfer?
Hay una serie de ataques de desbordamiento de búfer que emplean diferentes estrategias y tienen como objetivo diferentes partes del código. A continuación se presentan algunos de los más conocidos.
- Ataque de desbordamiento de pila – Este es el tipo más común de ataque de desbordamiento de búfer e implica el desbordamiento de un búfer en la pila de llamadas*.
- Ataque de desbordamiento de la pila – Este tipo de ataque tiene como objetivo los datos en la reserva de memoria abierta conocida como la pila*.
- Ataque de desbordamiento de enteros – En un desbordamiento de enteros, una operación aritmética resulta en un entero (número entero) que es demasiado grande para el tipo de entero destinado a almacenarlo; esto puede resultar en un desbordamiento del búfer.
- Desbordamiento de Unicode – Un desbordamiento de unicode crea un desbordamiento del búfer al insertar caracteres unicode en una entrada que espera caracteres ASCII. (ASCII y unicode son estándares de codificación que permiten a los ordenadores representar texto. Por ejemplo, la letra «a» se representa con el número 97 en ASCII. Mientras que los códigos ASCII sólo cubren los caracteres de las lenguas occidentales, unicode puede crear caracteres para casi todas las lenguas escritas del planeta. Como hay muchos más caracteres disponibles en unicode, muchos de ellos son más grandes que el mayor de los caracteres ASCII).
*Los ordenadores se basan en dos modelos diferentes de asignación de memoria, conocidos como la pila y el montón; ambos viven en la memoria RAM del ordenador. La pila está bien organizada y mantiene los datos en un modelo de «último en entrar, primero en salir». Cualquier pieza de datos que se haya colocado recientemente en la pila será la primera en salir, del mismo modo que la última bala insertada en un cargador de munición será la primera en ser disparada. El montón es un conjunto desorganizado de memoria extra, los datos no entran ni salen del montón en ningún orden particular. Dado que el acceso a la memoria desde la pila es mucho más rápido que el acceso desde el montón, el montón se reserva generalmente para los datos más grandes o los datos que un programador quiere gestionar explícitamente.
Mi opinión final sobre este método de ataque.
Se trata de un metodo de ataque muy complejo y dificil de usar.
Normalmente quienes usan este tipo de ataques tiene un nivel de conocimiento en C y C++ como expertos o disponen de un equipo completo de personas que conocen todos los diferentes modos de uso de estos lenguajes, aparte tambien un conocimiento muy alto de manejo de la memoria de un equipo ( algo que muy poco gente tiene un nivel alto).
Es uno de los ataques mas efectivos, pero a la vez extremadamente complejo con lo que yo nunca he profundizado mucho sobre este ataque.
Si desean conocer un poco mas y probar, os recomiendo esta guia:
Es bastante completa para el uso en linux y ideal para la primera toma de contacto con este tipo de ataque.
Espero que les guste es post.