El ataque Return -to -libc es uno de los tipos de ataques informáticos que son populares en máquinas compatibles con x86 y similar a ellos, relacionado con el desbordamiento de búfer , cuando la dirección de retorno de una función en la pila se reemplaza por la dirección de otra función. en el programa, y los parámetros para la función llamada se escriben en la parte subsiguiente de la pila. Esta técnica permite que un atacante ejecute alguna función existente sin tener que inyectar código malicioso en el programa.
GNU , GNU /Linux y otros sistemas operativos similares a UNIX tienen una biblioteca compartida, libc, que proporciona funciones C y POSIX , como system()para ejecutar programas arbitrarios. Existen bibliotecas similares en la familia de sistemas operativos Windows. Aunque un atacante puede obligar a un programa a saltar a cualquier dirección, la mayoría de los programas usan (vinculados a) libc, que tiene funciones convenientes para iniciar programas arbitrarios. Por lo tanto, las funciones de la biblioteca estándar son el objetivo más probable de tales exploits , que dieron nombre a la clase de ataques. Sin embargo, se pueden usar otras direcciones de retorno, incluidas funciones de otras bibliotecas y/o fragmentos de código (incluido el retorno a la mitad de una instrucción [1] ); consulte Programación orientada al retorno para obtener más detalles .
La pila protegida de ejecución de código puede evitar algunas explotaciones de desbordamientos de búfer, pero no volver a la biblioteca, porque este ataque explota el código ejecutable que ya existe en el espacio de direcciones del proceso . Por otro lado, a diferencia del shellcode clásico , este ataque solo puede usar funciones existentes. La protección de destrucción de pilas de GCC (conocida como ProPolice ) y protecciones similares de otros sistemas pueden prevenir o complicar en gran medida este ataque, ya que detectan violaciones de pilas y posiblemente notan datos inyectados.
La tecnología de aleatorización del diseño del espacio de direcciones (ASLR), que agrega aleatoriedad a la ubicación de las bibliotecas dentro del espacio de direcciones de los procesos, hace que este tipo de ataque sea extremadamente difícil y casi inútil en los sistemas de 64 bits, ya que las direcciones de las funciones se vuelven aleatorias. Para sistemas con direccionamiento de 32 bits, ASLR es menos útil, ya que solo están disponibles alrededor de 16 bits para agregar aleatoriedad, y dicha aleatoriedad se puede tratar con fuerza bruta en cuestión de minutos. [2]
Al igual que con los desbordamientos de búfer regulares, este ataque es mucho más difícil para las arquitecturas que no almacenan la dirección de retorno en la misma pila que los datos. Estas arquitecturas son, por ejemplo, SPARC [1] , que almacena la dirección de retorno de la función actual en el registro %i7 y MIPS (registro $ra ). El ataque puede no ser posible para los procesadores que almacenan ventanas de registro de funciones anteriores en registros de sombra, como PowerPC, donde la pila de llamadas se implementa como un registro apilable (almacenamiento de valores antiguos en un área de sombra inaccesible para el programador).
La técnica de " Programación orientada al retorno " es un desarrollo de las ideas detrás de este ataque y le permite realizar acciones más complejas combinando secuencialmente varios ataques más pequeños, cada uno de los cuales ejecuta una pequeña cantidad de instrucciones a la vez. En esta técnica, no es necesario usar transiciones al comienzo de las funciones, pero está permitido "regresar" a una instrucción ubicada no lejos de la instrucción de control de retorno de la función (ret). Después de ejecutar un fragmento, el comando ret tomará la siguiente dirección de la pila e iniciará otro fragmento con su devolución. Por lo tanto, con la ayuda de un diseño cuidadoso de la pila, es posible crear secuencias de instrucciones bastante complejas.