En seguridad informática , una pila de sombra es un mecanismo para proteger la dirección de retorno almacenada de un procedimiento , [1] como, por ejemplo, de un desbordamiento de búfer de pila . La pila de sombra en sí es una segunda pila separada que " hace sombra " de la pila de llamadas del programa . En el prólogo de la función , una función almacena su dirección de retorno tanto en la pila de llamadas como en la pila de sombra. En el epílogo de la función , una función carga la dirección de retorno tanto de la pila de llamadas como de la pila de sombra, y luego las compara. Si los dos registros de la dirección de retorno difieren, se detecta un ataque; el curso de acción típico es simplemente terminar el programa o alertar a los administradores del sistema sobre un posible intento de intrusión. Una pila de sombra es similar a los canarios de pila en que ambos mecanismos apuntan a mantener la integridad del flujo de control del programa protegido detectando ataques que alteran la dirección de retorno almacenada por un atacante durante un intento de explotación .
Las pilas de sombras se pueden implementar recompilando programas con prólogos y epílogos modificados, [2] mediante técnicas de reescritura binaria dinámica para lograr el mismo efecto, [3] o con soporte de hardware. [4] A diferencia de la pila de llamadas, que también almacena variables de programa locales, argumentos pasados, registros derramados y otros datos, la pila de sombras normalmente solo almacena una segunda copia de la dirección de retorno de una función.
Las pilas de sombras brindan más protección para las direcciones de retorno que los canarios de pila, que dependen del secreto del valor canario y son vulnerables a ataques de escritura no contiguos. [5] Las pilas de sombras en sí mismas pueden protegerse con páginas de protección [6] o con ocultamiento de información, de modo que un atacante también necesitaría localizar la pila de sombras para sobrescribir una dirección de retorno almacenada allí.
Al igual que los canarios de pila, las pilas de sombra no protegen los datos de la pila excepto las direcciones de retorno y, por lo tanto, ofrecen protección incompleta contra vulnerabilidades de seguridad que resultan de errores de seguridad de la memoria .
En 2016, Intel anunció el próximo soporte de hardware para pilas de sombra con su tecnología de cumplimiento de flujo de control. [7]
Las pilas de sombras enfrentan algunos problemas de compatibilidad. Después de que un programa lanza una excepción o se produce un longjmp , la dirección de retorno en la parte superior de la pila de sombras no coincidirá con la dirección de retorno extraída de la pila de llamadas. La solución típica para este problema es extraer entradas de la pila de sombras hasta que se encuentre una dirección de retorno coincidente y finalizar el programa solo cuando no se encuentre ninguna coincidencia en la pila de sombras. [3]
Un programa multiproceso , que tendría una pila de llamadas para cada hilo en ejecución, también tendría una pila de sombras que sombrearía cada una de las pilas de llamadas.