Stack Smashing describe un tipo de ataque de seguridad en el que el atacante corrompe o sobrescribe datos en la pila, con el fin de tomar el control del programa o hacer que se caiga. El atacante puede hacer esto inyectando código malicioso en el programa, o desbordando el buffer del programa con demasiados datos.
El Stack Smashing puede prevenirse utilizando una técnica llamada "stack canary", que es un pequeño trozo de datos que se coloca en la pila y se comprueba si está corrupto antes de ejecutar el programa. Si se encuentra que el canario de la pila está corrupto, el programa abortará antes de que el atacante pueda tomar el control.
¿Qué es el desbordamiento de pila?
Un desbordamiento de pila ocurre cuando se intenta sacar un elemento de una pila vacía. Esto puede ocurrir de varias maneras, como cuando un error de programación resulta en un bucle infinito que repetidamente saca elementos de la pila sin volver a poner ninguno. Un desbordamiento de pila también puede ocurrir cuando un usuario malintencionado intenta explotar una vulnerabilidad de desbordamiento de búfer desbordando la pila y luego saltando elementos de ella hasta que el programa se bloquea.
¿Qué es la vulnerabilidad de desbordamiento de pila?
Una vulnerabilidad de desbordamiento de pila es un tipo de fallo de seguridad que puede ocurrir en el software informático. Se produce cuando un programa intenta almacenar demasiados datos en la pila, que es una sección de la memoria utilizada para el almacenamiento temporal. Si los datos superan el tamaño de la pila, pueden desbordarse hacia otras áreas de la memoria, pudiendo corromper o sobrescribir datos importantes. Esto puede provocar fallos o, en el caso de código malicioso, permitir a un atacante tomar el control del programa.
Las vulnerabilidades de desbordamiento de pila son relativamente comunes, especialmente en programas antiguos o mal diseñados. Pueden ser difíciles de explotar, pero pueden ser muy perjudiciales si tienen éxito. Muchos lenguajes de programación modernos incluyen características que ayudan a prevenir los desbordamientos de pila, pero sigue siendo importante ser consciente del potencial de estas vulnerabilidades al desarrollar o revisar el código.
¿Qué es el stack bashing?
"Stack bashing" se refiere a la práctica de desbordar el buffer de la pila para modificar el flujo de ejecución del programa. Esto puede ser utilizado para lograr la ejecución de código, la escalada de privilegios, o ataques de denegación de servicio.
Los desbordamientos del búfer de la pila pueden ocurrir cuando el programa no comprueba adecuadamente los límites del búfer antes de escribir en él. Esto puede ocurrir cuando el programa copia la entrada de una fuente no fiable (como la entrada del usuario) en el búfer sin comprobar primero el tamaño de la entrada. Si la entrada es mayor que el tamaño del búfer, se desbordará en la memoria adyacente, pudiendo sobrescribir estructuras de datos importantes utilizadas por el programa.
Una técnica común para explotar un desbordamiento del búfer de pila es desbordar el búfer con código que redirigirá el flujo de ejecución del programa a una sección de código bajo el control del atacante. Esto puede ser utilizado para ejecutar código arbitrario, escalar privilegios o bloquear el programa (denegación de servicio).
Para evitar el desbordamiento del búfer de la pila, es importante comprobar siempre los límites de los búferes antes de escribir en ellos. Esto puede hacerse utilizando una función de la biblioteca como strncpy() en lugar de strcpy(), o comprobando manualmente el tamaño de la entrada antes de copiarla en el búfer.
¿Qué es el desbordamiento de pila? Un desbordamiento de pila ocurre cuando el puntero de la pila alcanza el fondo de la misma. Esto puede ocurrir cuando el programa intenta saltar un elemento de la pila cuando ésta está vacía, o cuando el programa intenta acceder a un elemento desde el fondo de la pila sin saltar primero todos los elementos por encima de él.
¿Cuáles son los ataques de flujo de búfer más comunes?
Hay muchos tipos diferentes de ataques de flujo de búfer, pero los más comunes incluyen desbordamientos de búfer, ataques de cadena de formato y condiciones de carrera.
El desbordamiento del búfer se produce cuando un programa intenta almacenar más datos en un búfer de los que puede contener. Esto puede hacer que el programa se bloquee o, en el caso del código malicioso, permitir que el atacante obtenga el control del programa.
Los ataques de cadena de formato explotan la forma en que algunos lenguajes de programación manejan las cadenas. Al elaborar cuidadosamente una cadena, un atacante puede hacer que el programa muestre información sensible o incluso tomar el control del programa.
Las condiciones de carrera ocurren cuando dos o más hilos de ejecución acceden a datos compartidos e intentan modificarlos al mismo tiempo. Esto puede conducir a la corrupción de datos o, en el caso de código malicioso, permitir al atacante obtener el control del programa.