Cómo prevenir los ataques de desbordamiento de buffer

Los ataques de desbordamiento de pila hacen que los sistemas derramen datos, provocando el caos.
Por hobie anthony

Paso 1

Escribe el código de seguridad para evitar ataques de desbordamiento. En C, hay una serie de funciones de vulnerabilidad que los hackers pueden explotar para sobrellenar los búferes. Minimiza tu uso de strcpy (), strcat (), sprintf () y vsprintf (), que no se realiza comprobación de límites. Si es posible, evita usar gets (), que no especifica cuántos caracteres se van a leer y así dejan vulnerable tu código. Si utilizas scanf (), asegúrate de especificar un ancho para el formato %s para evitar desbordamientos.


Paso 2

Revisa a ver si puedes utilizar trampolines para evitar desbordamiento de búfer. Desde que ocurre el desbordamiento de búfer en las pilas de memoria y no en el código, la solución más sencilla parece ser prevenir que tus pilas ejecuten cualquier código mediante la inserción de un pequeño fragmento de código para prohibir estas acciones. Esto es posible en Linux, pero es muy difícil. Sólo unos pocos compiladores utilizan los pequeños trozos de código llamados trampolines, que actúan como una barrera entre el código de llamada a una función y la función misma. Por lo tanto, si el código malicioso intenta reemplazar un búfer, el trampolín puede interceptar y neutralizar los intentos de los hackers.


Paso 3

Implementa herramientas de compilación para darte advertencias cuando usas código que te deja vulnerable a los ataques. Algunas de estas herramientas va a generar código que prohíbe que personas ajenas tengan acceso a direcciones ilegales y apaguen código que intenta dicha ejecución. Productos como StackShield y StackGuard son una gran ayuda. StackSheild analizará la dirección de retorno de una función y la terminará en el caso de una irregularidad. StackGuard coloca una palabra canario en la dirección del remitente y comprueba si la palabra ha sido alterada, terminando una función cuando la tiene.


Paso 4

Instala herramientas como libsafe para comprobar la seguridad de una manera dinámica, en tiempo de ejecución medio ambiente. Libsafe se ejecuta en Linux y comprueba la dirección más cercana de retorno de un marco de pila, entonces se asegura de que la dirección no se sobrescriba. Libsafe también reemplazará las funciones no seguras, como gets (), strcpy () y scanf ().