Un desbordamiento de búfer (buffer overflow) es un fallo de seguridad de memoria en el que un programa escribe en un búfer más datos de los que caben y sobrescribe la memoria contigua.
Cómo se produce un desbordamiento de búfer
Los programas escritos en C y C++ reservan búferes de tamaño fijo para cadenas, paquetes de red y otros datos. Si el código copia la entrada sin comprobar su longitud —con funciones como strcpy o sprintf—, los bytes sobrantes invaden la memoria vecina. En un desbordamiento de pila pueden sobrescribir la dirección de retorno de la función; en uno de montículo (heap) corrompen otros objetos y los metadatos del asignador de memoria.
Un atacante que controla esos datos puede desviar la ejecución hacia su propio código o reutilizar fragmentos existentes (programación orientada al retorno, ROP). El resultado suele ser la ejecución remota de código o una escalada de privilegios; en el mejor de los casos, un cierre del programa.
Por qué es importante
Los desbordamientos de búfer son una de las clases de vulnerabilidades más antiguas y explotadas. El gusano Morris usó uno en 1988, y Code Red (2001) y SQL Slammer (2003) se propagaron por todo el mundo gracias a desbordamientos en servidores de Microsoft. La escritura fuera de límites (CWE-787) sigue entre las primeras posiciones del CWE Top 25 de debilidades de software más peligrosas. Según Microsoft y Google, los fallos de memoria, junto con el use-after-free, suponen la mayoría de las vulnerabilidades críticas en grandes bases de código C/C++.
Cómo prevenirlos
- Escribir el código nuevo en lenguajes con seguridad de memoria como Rust, Go, Java o C#, como recomiendan CISA y la NSA.
- En C/C++, usar funciones con comprobación de límites y contenedores modernos, y probar con fuzzers y AddressSanitizer.
- Mantener activas las protecciones del compilador y del sistema: stack canaries, DEP/NX, ASLR e integridad del flujo de control.
- Aplicar parches cuanto antes: los exploits públicos para desbordamientos aparecen rápido.