Desbordamiento de búfer (Buffer overflow)
El desbordamiento de búfer ocurre cuando un programa escribe en un área de memoria temporal más datos de los que caben, y sobrescribe lo que hay al lado. Es una de las formas más antiguas de conseguir que una máquina ejecute instrucciones ajenas.
El desbordamiento de búfer es una clase de vulnerabilidad de software que lleva décadas siendo una preocupación constante en seguridad.
Ocurre cuando se escriben en un área de memoria temporal, el búfer, más datos de los que esa área estaba dimensionada para guardar.
Aprovechándose de eso, un atacante puede conseguir que se ejecute código malicioso, cambiar el comportamiento del programa o, en algunos casos, tomar el control de la máquina.
Ha sido el mecanismo que hay detrás de una larga lista de ataques, y entenderlo sigue formando parte de entender cómo se toman los sistemas.
Qué lo caracteriza
Se sobrescribe memoria. Entran más datos de los que caben, y el sobrante aterriza en memoria contigua que pertenecía a otra cosa.
Se puede acabar ejecutando código. Un atacante puede colocar instrucciones en memoria y hacer que se ejecuten, que es de donde sale el control no autorizado del sistema.
Es una vía de entrada, no el final. El desbordamiento suele ser el primer paso de una cadena más larga, y no el objetivo.
Por qué cuesta tanto quitárselo de encima
Afecta a software muy variado. Cualquier cosa escrita en un lenguaje que deja al programador gestionar la memoria directamente puede tener uno, desde una utilidad pequeña hasta un producto grande.
Detectarlo no es evidente. El comportamiento es sutil, y las técnicas que se usan para llegar a memoria explotable varían muchísimo.
Las actualizaciones son la respuesta práctica. Las actualizaciones de software, los parches de seguridad y unas prácticas de programación más seguras son lo que de verdad reduce la exposición, porque cierran los defectos concretos que ya se conocen.
Un ejemplo práctico
Un procesador de textos tiene una función que recibe una cadena de texto y la guarda en un búfer temporal.
Si esa función no comprueba la longitud de la cadena, un atacante puede darle a propósito una más larga de lo que el búfer puede guardar.
El sobrante sobrescribe la memoria contigua, incluidas las zonas que controlan por dónde sigue el programa.
A partir de ahí, el atacante puede colocar sus propias instrucciones en memoria y conseguir que se ejecuten.
Si eso funciona, tiene acceso no autorizado al sistema, y con ello se van la confidencialidad y la integridad de todo lo que ese proceso pudiera alcanzar.
Desbordamiento de búfer y ejecución remota de código
Se confunden porque casi siempre aparecen juntos, y son dos capas distintas.
El desbordamiento de búfer es el mecanismo: se escribe más de lo que cabe y se pisa la memoria de al lado.
La ejecución remota de código (RCE) es el resultado: el atacante consigue que la máquina ejecute sus instrucciones. Se llega ahí por varias rutas y el fallo de memoria es solo una. También se llega porque una entrada no fiable acaba en un intérprete o en un shell, porque unos bytes no fiables llegan a un deserializador, o porque un fichero subido acaba en un sitio donde el servidor lo ejecuta.
Y no todo desbordamiento acaba en ejecución. Muchos solo tumban el proceso, que es una denegación de servicio y no lo mismo.
Lo que decide la severidad no es el mecanismo. Es con qué identidad corre el proceso, qué secretos guarda y qué salida a la red tiene: el mismo defecto dentro de un contenedor sin credenciales y sin salida es un hallazgo serio, y en un proceso que guarda la contraseña de la base de datos es una brecha en marcha.