¿Qué es el desbordamiento del búfer?

Un desbordamiento del búfer se produce cuando un programa que escribe datos en un búfer sobrecarga la capacidad de ese búfer. Es como echar 300 ml de leche en un vaso de con 200 ml de capacidad.

Objetivos de aprendizaje

Después de leer este artículo podrás:

  • Definir un búfer
  • Explicar el desbordamiento del búfer y cómo se puede utilizar en un ciberataque
  • Entender quién es más vulnerable y cómo protegerse de los ataques de desbordamiento del búfer

Contenido relacionado


¿Quieres saber más?

Suscríbase a theNET, el resumen mensual de Cloudflare sobre las ideas más populares de Internet.

Revisa la política de privacidad de Cloudflare para saber más sobre cómo Cloudflare gestiona tus datos personales.

Copiar enlace del artículo

¿Qué es el desbordamiento del búfer?

El 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 búfer, lo que provoca que se sobrescriban las ubicaciones de memoria adyacentes. En otras palabras, se pasa demasiada información a un contenedor que no cuenta con el espacio suficiente, y esa información acaba sustituyendo a los datos de los contenedores adyacentes.

Los atacantes pueden aprovecharse de los desbordamientos del búfer con el objetivo de modificar la memoria de un ordenador para socavar o tomar el control de la ejecución del programa.

Desbordamiento del búfer

¿Qué es un búfer?

Un búfer, o búfer de datos, es un área de almacenamiento de memoria física que se utiliza para almacenar temporalmente los datos mientras se trasladan de un lugar a otro. Estos búferes suelen estar en la memoria RAM. COn frecuencia, los ordenadores utilizan 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 quizás un 20 % del vídeo a la vez en un búfer y luego transmite desde ese búfer. De esta manera, las breves reducciones de la velocidad de la conexión o las interrupciones rápidas del servicio no afectarán al rendimiento de la transmisión de vídeo.

Los búferes están diseñados para contener cantidades específicas de datos. A menos que el programa que utilice el búfer tenga instrucciones incorporadas para descartar datos cuando se envíen demasiados al búfer, el programa sobrescribirá los datos de la memoria adyacente en el búfer.

Los atacantes pueden aprovecharse de los desbordamientos del búfer para corromper el software. A pesar de ser bien conocidos, los ataques de desbordamiento de búfer siguen siendo un importante problema de seguridad 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 del búfer en el software SSL .

¿Cómo se aprovechan los atacantes de los desbordamientos del búfer?

Un atacante puede introducir deliberadamente una entrada cuidadosamente elaborada en un programa que provocará que este intente almacenar esa entrada en un búfer que no sea 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. Entonces, el atacante puede sustituir este código por su propio código ejecutable, lo cual puede cambiar de forma drástica el funcionamiento del programa.

Por ejemplo, si la parte sobrescrita en la memoria contiene un indicador (un objeto que apunta a otro lugar de la memoria), el código del atacante podría sustituirlo por otro indicador que apunte a una carga útil de la vulnerabilidad. 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 que son muy vulnerables a ello, ya que no contienen protecciones integradas contra el acceso o la sobrescritura 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 funciones incorporadas que ayudan a reducir las posibilidades de desbordamiento del búfer, pero no pueden evitarlo completamente.

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 del búfer. Exploremos dos protecciones habituales que ayudan a mitigar el riesgo de que se aprovechen de tales vulnerabilidades:

  • Aleatorización del espacio de direcciones - Reorganiza de forma aleatoria las ubicaciones del espacio de direcciones de las áreas de datos clave de un proceso. Los ataques de desbordamiento del búfer se suelen basar en conocer la ubicación exacta del código ejecutable importante, la aleatorización de los espacios de direcciones lo hace 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 con una vulnerabilidad se ejecute 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 si escriben en lenguajes con protecciones incorporadas o si usan procedimientos especiales de seguridad en su código.

A pesar de las precauciones, los desarrolladores siguen descubriendo nuevas vulnerabilidades de desbordamiento del búfer, a veces después de que se haya aprovechado de una de ellas con éxito. Cuando se descubren nuevas vulnerabilidades, los ingenieros tienen que parchear el software afectado y asegurarse de que los usuarios del software tengan acceso al parche.

¿Cuáles son los diferentes tipos de ataques de desbordamiento del búfer?

Hay una serie de ataques de desbordamiento del búfer que emplean diferentes estrategias y tienen como objetivo diferentes fragmentos de código. A continuación, presentamos algunos de los más conocidos.

  • Ataque de desbordamiento de la pila - Este es el tipo más habitual de ataque de desbordamiento del búfer y consiste en desbordar un búfer en la pila de llamadas*.
  • Ataque de desbordamiento del montón - Este tipo de ataque tiene como objetivo los datos en la reserva de memoria abierta conocida como montón*.
  • Ataque de desbordamiento de enteros - En un desbordamiento de enteros (número entero), una operación aritmética da lugar a un entero que es demasiado grande para el tipo de entero destinado a almacenarlo; esto puede provocar 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 normas 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 solo incluyen los caracteres de las lenguas occidentales, el unicode puede crear caracteres para casi todas las lenguas escritas del planeta. Como hay muchos más caracteres disponibles en unicode, muchos caracteres de unicode son más grandes que el carácter más grande de ASCII).

*Los ordenadores se basan en dos modelos diferentes de asignación de memoria, conocidos como la pila y el montón; ambos están situados 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 dato que se haya colocado más recientemente en la pila será el primero en salir, de forma similar a como la última bala introducida 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 concreto. Ya 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 suele reservarse para los datos más grandes o para los datos que el programador quiere gestionar explícitamente.