Introducción al desbordamiento del búfer

El desbordamiento del búfer también se conoce como desbordamiento del búfer, es un estado de la computadora donde una aplicación intenta almacenar más datos en la memoria del búfer que el tamaño de la memoria. Esto lleva a que los datos se almacenen en un almacenamiento adyacente que a veces puede sobrescribir los datos existentes, lo que provoca una posible pérdida de datos y, a veces, un bloqueo del sistema. Es un error de programación común que la mayoría de los desarrolladores cometen sin saberlo. Los piratas informáticos lo explotan con mayor frecuencia para obtener acceso a datos no solicitados.

¿Qué es la memoria intermedia?

Excelente pregunta Una memoria intermedia, o memoria intermedia, es simplemente una porción secuencial de la RAM reservada para almacenar datos temporalmente mientras se transfiere de un lugar a otro, el lugar generalmente es un dispositivo de entrada o salida. Esto se hace para compensar la diferencia en las velocidades a las que funcionan los dispositivos.

Por ejemplo, cuando entrega algunos documentos para imprimir, su último procesador i7 es lo suficientemente rápido como para ejecutar el comando de impresión en nanosegundos, mientras que la impresora antigua no está equipada con ese procesador rápido. Por lo tanto, los documentos se guardan en la memoria intermedia y se pasan a la impresora a una velocidad que la impresora acepta. Esto libera la RAM de tu CPU para otras tareas.

Ataque de desbordamiento de búfer

Ahora que se ha identificado una vulnerabilidad con las computadoras, los piratas informáticos están obligados a explotarla e intentar atacar varios sistemas mediante ataques de desbordamiento de búfer. Ahora surge la pregunta, ¿cómo ejecuta un pirata informático tal ataque y cuáles son las consecuencias?

En un ataque de desbordamiento de búfer, los datos adicionales incluyen instrucciones destinadas a desencadenar actividades dañinas, como dañar archivos, cambiar datos, enviar información privada a través de Internet, etc. Un atacante simplemente aprovecharía cualquier programa que esté esperando a cierto usuario ingresar e inyectar datos excedentes en el búfer.

El ataque de desbordamiento del búfer se puede clasificar principalmente en dos tipos

  • Basado en pila : cuando el ataque está en la asignación de memoria basada en pila. Esto es más simple de explotar y, por lo tanto, es más propenso a los ataques.
  • Basado en el montón : cuando el ataque está en la asignación de memoria basada en el montón. Esto no es tan fácil de explotar y, por lo tanto, es mucho menos frecuente.

Los lenguajes más vulnerables a los ataques de desbordamiento de búfer son C, C ++, Fortran y Assembly, ya que utilizan técnicas de asignación de memoria basadas en pila.

La cura

Una vez que los datos están corruptos, simplemente no hay cura para restaurar los datos originales. Además, la intensidad del ataque determina en gran medida la cura. Si el ataque es escaso y afecta solo a una parte de la memoria de una máquina aislada, un formato de sistema simple puede ser la cura. Mientras que, si el ataque es generalizado y ha comprometido los datos en varias máquinas, formatear toda la red no ayudaría a menos que el programa que inyecta el código malicioso sea reparado.

Es mejor prevenir que curar

Como desarrolladores, es nuestra responsabilidad verificar si hay desbordamientos de búfer en nuestro código. Si los desbordamientos del búfer se manejan en el código mismo, la seguridad del sistema no se ve obstaculizada por los ataques de desbordamiento del búfer.

Los siguientes son algunos pasos simples de precaución que pueden ayudar a prevenir el desbordamiento del búfer.

  • El manejo de excepciones debe aprovecharse para detectar desbordamientos de búfer y evitar la ejecución de código en caso de que ocurra.
  • Asigne un tamaño lo suficientemente grande como para almacenar en el búfer de manera que los grandes volúmenes de datos no deseados se traten de manera adecuada.
  • Evite el uso de funciones de biblioteca o métodos de terceros que no estén controlados por desbordamientos de búfer. Ejemplos comunes de tales funciones para evitar son gets (), scanf (), strcpy () Estos están principalmente en lenguaje C / C ++.
  • Las pruebas de código deben tener en cuenta dichas vulnerabilidades y probar rigurosamente el código y corregir los errores que pueden provocar un desbordamiento.
  • Los lenguajes de programación modernos, los sistemas operativos y los compiladores de código han evolucionado para detener la ejecución del comando en caso de desbordamiento del búfer. Esta se ha convertido en la forma más confiable de detectar automáticamente desbordamientos de búfer.

Inténtalo tú mismo…

He entendido tanto sobre el desbordamiento de búfer y los ataques de búfer, ¿por qué no intentar codificar algo malicioso?

Descargo de responsabilidad: el siguiente programa es solo para fines ilustrativos y no debe utilizarse para causar daños de ningún tipo. Cualquier parecido con el código malicioso es mera coincidencia. Además, los sistemas operativos de hoy en día son lo suficientemente inteligentes como para tener controles preventivos de ataque de búfer en su lugar.

A continuación se muestra el programa C que puede causar una posible saturación del búfer. ¿Por qué la elección del lenguaje C? Esto se debe a que los lenguajes de programación más avanzados se desarrollaron para tratar los desbordamientos del búfer solo durante el tiempo de compilación. Aunque, hoy en día los compiladores de C también tienen ciertas comprobaciones para evitar detectar el desbordamiento del búfer. Por lo tanto, solo verá un mensaje de error que indica que se detectó un desbordamiento del búfer.

#include
#include
#include
int main(int argc, char *argv())
(
char mybuffer(8);
// copy the user input to mybuffer, without any bound checking
printf("Storing user input to mybuffer…\n");
strcpy(mybuffer, argv(1));
printf("mybuffer content= %s\n", mybuffer);
return 0;
)

¿Qué sucedió cuando se dio 123456789 como argumento de línea de comando al programa? El programa generó un error que se produce cuando el compilador detecta el desbordamiento del búfer. Los compiladores y sistemas operativos de hoy en día tienen una capa de protección adicional. Esta capa no es nada, sino variables llamadas Canarias que se inician a ciertos valores en el momento de la compilación. Estas variables se almacenan en unidades de memoria adyacentes al búfer. Entonces, cada vez que el búfer se desborda, los datos adicionales fluyen hacia la memoria adyacente y corrompen el valor de Canarias. Tan pronto como se detecta cualquier canario corrupto, el sistema aborta la ejecución.

Otro ejemplo en lenguaje C ++:

#include
using namespace std;
int main()
(
char buf(8);
cin>>buf;
return 0;
)

Entrada - 123456789

Salida -

Conclusión: desbordamiento de búfer

Entonces, ahora estoy seguro de que habrás entendido la importancia del manejo del búfer en tu programa. Incluya esta práctica para verificar los límites del búfer mientras escribe y prueba su código. Esto te ayudará a escribir código seguro.

Artículos recomendados

Esta ha sido una guía de Qué es el desbordamiento del búfer. Aquí discutimos la Definición, prevención, memoria, ataque en Buffer Overflow. También puede consultar nuestros otros artículos sugeridos para obtener más información:

  1. ¿Qué es JavaScript?
  2. ¿Qué es Django?
  3. ¿Qué es el desarrollador SQL?
  4. ¿Qué es el azul?