Ataque por desbordamiento de búfer: qué es y cómo evitarlo
Los ataques por "desbordamiento de búfer" (también denominado saturación de búfer) están diseñados para activar la ejecución de un código arbitrario en programas que admiten datos de entrada con parámetros, como Excel o Google Sheets, al enviar un caudal de datos mayor que el que estos pueden recibir.
¿Qué es un ataque por desbordamiento o saturación de búfer?
Los programas que admiten datos de entrada con parámetros (como Excel) los almacenan temporalmente en una zona de la memoria denominada búfer. Pero algunas funciones de lectura, como las strcpy() del lenguaje C, no admiten este tipo de desbordamiento y causan el bloqueo de la aplicación, lo que puede provocar la ejecución del código arbitrario y permitir el acceso al sistema.
La implementación de este tipo de ataques es extremadamente complicada, ya que requiere un conocimiento exhaustivo de la arquitectura del programa y del procesador. Sin embargo, existen varios puntos vulnerables capaces de automatizar este tipo de ataques, haciéndolos accesibles incluso a atacantes con poca experiencia.
¿Cómo se produce un ataque por desbordamiento de búfer?
El principio operativo de un desbordamiento de búfer guarda una relación muy estrecha con la arquitectura del procesador en la que se ejecuta una aplicación vulnerable.
Los datos ingresados en una aplicación se almacenan en la memoria de acceso aleatorio en una zona que se conoce como búfer. Un programa con un diseño correcto debería estipular un tamaño máximo para los datos de entrada y garantizar que no superen ese valor.
Las instrucciones y los datos de un programa en ejecución se almacenan temporalmente de forma adyacente en la memoria, en una zona llamada pila. Los datos ubicados después del búfer contienen una dirección de retorno (que se denomina puntero de instrucción) que le permite al programa continuar su tiempo de ejecución. Si el tamaño de los datos es mayor que el del búfer, la dirección de retorno se sobrescribe y el programa leerá una dirección de memoria no válida generando una violación de segmento en la aplicación.
Un atacante con conocimientos técnicos sólidos puede asegurarse de que la dirección de memoria sobrescrita corresponda a una real, por ejemplo, una que esté ubicada en el mismo búfer. Como tal, al ingresar las instrucciones en el búfer (el código arbitrario), es fácil para él ejecutar este procedimiento.
Por lo tanto, es posible incluir instrucciones en el búfer que permitan abrir un intérprete de comandos (shell) permitiendo que el atacante tome control del sistema. Este código arbitrario que posibilita la ejecución del intérprete de comandos se conoce como código de shell o shellcode.
¿Cómo proteger un sistema contra el desbordamiento de búfer?
Para protegerse contra este tipo de ataques, es importante desarrollar aplicaciones que utilicen lenguajes de programación avanzados que garanticen una administración precisa de la memoria asignada o que usen un lenguaje de bajo nivel con bibliotecas de función seguras (por ejemplo, las funciones strncpy()).
Con frecuencia, los expertos advierten sobre la vulnerabilidad de ciertas aplicaciones a los ataques por desbordamiento de búfer. En reacción, los editores de software afectados por la vulnerabilidad generalmente publican revisiones (patch) para corregir el problema. Es recomendable que todos los administradores de sistema y red se mantengan informados acerca de las alertas de seguridad y que apliquen las revisiones lo antes posible.