Pila no ejecutable
Alrededor de 100.000 canarios que han perdido su empleo a causa del coronavirus no pueden beneficiarse de las ayudas extraordinarias que los gobiernos central y autonómico han puesto en marcha. Son los que trabajan en negro, un problema que en el Archipiélago es especialmente preocupante por el extraordinario peso que tiene la economía sumergida en la región.
Y, además, con el agravante de que se trata de personas que, en su mayoría, compaginan varias ocupaciones para poder reunir unos ingresos mínimos con los que pasar el mes. Entre ellos se encuentran las empleadas del hogar, muchas de las cuales no podrán cobrar el subsidio que el Ejecutivo central acaba de reconocer por no tener contrato. En el caso de las Islas, aproximadamente una de cada dos se queda sin ayuda.
El economista José Miguel González, que ocupó el cargo de director general de Trabajo en la anterior legislatura autonómica, explicó ayer que el peso de la economía sumergida en el Archipiélago oscila actualmente entre el 15 y el 23% del empleo y del Producto Interior Bruto (PIB).
Stackshield
Antes de hablar de los canarios de pila, debemos presentar los desbordamientos de búfer. Esta clase de ataques hace uso de funciones inseguras (normalmente en C o C++) que permiten escribir contenido arbitrario fuera de un área designada de la memoria.
Este es un simple programa en C que tiene una función main() y una función askUser(). La función main() llama a askUser(), que a su vez tiene una variable local llamada name[] de tamaño 100 en la que se está leyendo una entrada del usuario a través de gets().
Cuando se llama a una función en un binario compilado (ver línea 2), la dirección de la siguiente instrucción dentro de main() será primero empujada a la pila. Esto servirá como el puntero de retorno. Cuando la instrucción de retorno (RET) es llamada al final de askUser(), el puntero de retorno será sacado de la pila y colocado en el puntero de instrucción (EIP en la arquitectura de 32 bits). Si un atacante puede sobreescribir este puntero de retorno, puede redirigir el flujo de ejecución del programa, a menudo a una ubicación que el atacante desee.
Estas sobreescrituras son posibles cuando una función de biblioteca llamada dentro de askUser() no realiza una comprobación correcta de los límites, a menudo en operaciones de cadena. Funciones como gets() y strcpy() no realizan ninguna comprobación de límites durante su operación. La función read() toma un tamaño como argumento, pero no comprueba si este tamaño se corresponde con el tamaño del buffer donde se escriben los datos. Figura 1. La función vulnerable en el depurador de GNU (GDB). Los dos rectángulos indican los puntos de interrupción de la siguiente figura.Figura 2. La pila antes y después de la escritura en el buffer vulnerable. Las flechas indican el puntero de retorno antes y después de la sobreescritura.
Canario Stackguard
La protección contra el desbordamiento del búfer es cualquiera de las diversas técnicas utilizadas durante el desarrollo de software para mejorar la seguridad de los programas ejecutables mediante la detección de desbordamientos del búfer en las variables asignadas a la pila, y evitar que causen un mal comportamiento del programa o que se conviertan en graves vulnerabilidades de seguridad. Un desbordamiento del búfer de la pila se produce cuando un programa escribe en una dirección de memoria de la pila de llamadas del programa fuera de la estructura de datos prevista, que suele ser un búfer de longitud fija. Los errores de desbordamiento del búfer de la pila se producen cuando un programa escribe más datos en un búfer situado en la pila de lo que realmente está asignado para ese búfer. Esto casi siempre da lugar a la corrupción de los datos adyacentes en la pila, lo que podría provocar el bloqueo del programa, un funcionamiento incorrecto o problemas de seguridad.
Normalmente, la protección contra el desbordamiento del búfer modifica la organización de los datos asignados a la pila para que incluya un valor canario que, al ser destruido por un desbordamiento del búfer de la pila, muestre que un búfer que lo precede en la memoria ha sido desbordado. Al verificar el valor canario, se puede terminar la ejecución del programa afectado, impidiendo que se comporte mal o que un atacante tome el control sobre él. Otras técnicas de protección contra el desbordamiento del búfer son la comprobación de límites, que verifica los accesos a cada bloque de memoria asignado para que no puedan ir más allá del espacio realmente asignado, y el etiquetado, que garantiza que la memoria asignada para almacenar datos no puede contener código ejecutable.
Debilidad de los canarios Terminator
Antes de hablar de los canarios de pila, debemos introducir primero los desbordamientos de búfer. Esta clase de ataques hace uso de funciones inseguras (normalmente en C o C++) que permiten escribir contenido arbitrario fuera de un área designada de la memoria.
Este es un simple programa en C que tiene una función main() y una función askUser(). La función main() llama a askUser(), que a su vez tiene una variable local llamada name[] de tamaño 100 en la que se está leyendo una entrada del usuario a través de gets().
Cuando se llama a una función en un binario compilado (ver línea 2), la dirección de la siguiente instrucción dentro de main() será primero empujada a la pila. Esto servirá como el puntero de retorno. Cuando la instrucción de retorno (RET) es llamada al final de askUser(), el puntero de retorno será sacado de la pila y colocado en el puntero de instrucción (EIP en la arquitectura de 32 bits). Si un atacante puede sobreescribir este puntero de retorno, puede redirigir el flujo de ejecución del programa, a menudo a una ubicación que el atacante desee.
Estas sobreescrituras son posibles cuando una función de biblioteca llamada dentro de askUser() no realiza una comprobación correcta de los límites, a menudo en operaciones de cadena. Funciones como gets() y strcpy() no realizan ninguna comprobación de límites durante su operación. La función read() toma un tamaño como argumento, pero no comprueba si este tamaño se corresponde con el tamaño del buffer donde se escriben los datos. Figura 1. La función vulnerable en el depurador de GNU (GDB). Los dos rectángulos indican los puntos de interrupción de la siguiente figura.Figura 2. La pila antes y después de la escritura en el buffer vulnerable. Las flechas indican el puntero de retorno antes y después de la sobreescritura.