影子栈
影子栈 是什么?
影子栈影子栈是一条独立且受保护的栈,用于保存返回地址副本,使 CPU 能在正常栈被篡改时检测并阻止 ROP 攻击。
影子栈与传统调用栈并行运行:每次函数调用都会将返回地址同时压入两条栈,返回时比较两者是否一致,不一致则触发陷阱并终止进程,以避免使用被篡改的返回地址。该机制由 CFI 研究论文推广,如今在硬件中分别由 Intel CET 影子栈和 Arm v8.5-A Guarded Control Stack(GCS)实现。也存在纯软件实现(LLVM SafeStack、clang -fsanitize=safe-stack),但性能与隔离成本较高。影子栈解决了 CFI 的后向边问题,前向边的间接调用仍需 CFI/IBT 等机制配合。
● 示例
- 01
Windows 11 在支持 CET 的 CPU 上强制启用用户态影子栈。
- 02
Arm GCS 检测到栈缓冲区溢出篡改了保存的 LR。
● 常见问题
影子栈 是什么?
影子栈是一条独立且受保护的栈,用于保存返回地址副本,使 CPU 能在正常栈被篡改时检测并阻止 ROP 攻击。 它属于网络安全的 应用安全 分类。
影子栈 是什么意思?
影子栈是一条独立且受保护的栈,用于保存返回地址副本,使 CPU 能在正常栈被篡改时检测并阻止 ROP 攻击。
影子栈 是如何工作的?
影子栈与传统调用栈并行运行:每次函数调用都会将返回地址同时压入两条栈,返回时比较两者是否一致,不一致则触发陷阱并终止进程,以避免使用被篡改的返回地址。该机制由 CFI 研究论文推广,如今在硬件中分别由 Intel CET 影子栈和 Arm v8.5-A Guarded Control Stack(GCS)实现。也存在纯软件实现(LLVM SafeStack、clang -fsanitize=safe-stack),但性能与隔离成本较高。影子栈解决了 CFI 的后向边问题,前向边的间接调用仍需 CFI/IBT 等机制配合。
如何防御 影子栈?
针对 影子栈 的防御通常结合技术控制与运营实践,详见上方完整定义。
影子栈 还有哪些其他名称?
常见的别称包括: 返回栈, 安全栈, GCS。
● 相关术语
- appsec№ 217
控制流完整性(CFI)
控制流完整性(CFI)将程序的间接调用和返回限制在预先计算的合法目标集合内,阻断 ROP 与 JOP 等控制流劫持利用。
- appsec№ 545
Intel CET
Intel CET(控制流强制技术)是一项 CPU 功能,结合硬件影子栈与间接分支跟踪(IBT)以阻断 ROP、JOP 和 COP 利用。
- appsec№ 925
面向返回的编程(ROP)
ROP 是一种代码复用利用技术,通过把以 RET 结尾的短指令序列(gadget)串成链来执行任意计算,而无需注入新代码。
- appsec№ 1095
栈金丝雀
栈金丝雀是函数局部缓冲区与保存的返回地址之间放置的秘密值,用于在攻击者劫持控制流之前检测栈溢出。
- appsec№ 064
地址空间布局随机化(ASLR)
ASLR 在每次运行时随机化代码、栈、堆和共享库的内存地址,使攻击者无法可靠预测利用所需的目标地址。
- appsec№ 670
内存安全
内存安全指程序绝不读取、写入或执行未合法分配的内存,从而消除整类漏洞的属性。