Una Shadow Stack es una técnica de seguridad que mantiene una copia independiente y protegida de las direcciones de retorno de las llamadas a funciones. Cuando se realiza una llamada a una función, tanto la dirección de retorno real como una copia de esta se guardan en la pila principal y en la Shadow Stack, respectivamente. Al regresar de una función, el sistema compara la dirección de retorno obtenida de la pila principal con la almacenada en la Shadow Stack. Si ambas direcciones no coinciden, se detecta una alteración maliciosa del flujo de control, como las causadas por ataques de Return-Oriented Programming (ROP) o sobrescrituras de búfer que manipulan la pila.

La implementación de Shadow Stacks se ha explorado y adoptado en diversos contextos para fortalecer la seguridad de los sistemas. Intel, por ejemplo, ha introducido la tecnología Control-flow Enforcement Technology (CET) en sus arquitecturas de CPU, que incluye una implementación de Shadow Stack a nivel de hardware para proteger contra ataques de flujo de control. Microsoft Windows ha incorporado soporte para CET en sus versiones más recientes, permitiendo a las aplicaciones aprovechar esta protección. En el ámbito de la investigación y sistemas operativos, proyectos como OpenBSD han explorado mecanismos similares para reforzar la seguridad de sus pilas de llamadas, aunque las implementaciones pueden variar en su granularidad (software vs. hardware) y el rendimiento asociado.

Para un Arquitecto de Sistemas, la Shadow Stack es una consideración crucial en el diseño de arquitecturas de seguridad robustas, especialmente en sistemas que manejan datos sensibles o ejecutan código de alto riesgo. Su valor estratégico radica en la capacidad de mitigar una clase significativa de exploits basados en la manipulación del flujo de control, mejorando la resiliencia del sistema. Sin embargo, existen trade-offs importantes: las implementaciones de Shadow Stack, particularmente las basadas en software, pueden introducir una sobrecarga de rendimiento debido a la duplicación de operaciones de pila y las verificaciones adicionales. Las soluciones basadas en hardware, como Intel CET, ofrecen un mejor rendimiento pero requieren soporte específico del procesador y del sistema operativo. Un arquitecto debe evaluar el balance entre la postura de seguridad deseada, el impacto en el rendimiento y la compatibilidad con la infraestructura existente al decidir si y cómo integrar esta tecnología.