Hasty Briefsbeta

双语

Backtrace is finally cheap by abusing x86/Linux's shadow stack

a year ago
  • #performance
  • #debugging
  • #shadow-stack
  • 回溯(Backtrace)是原生编程中强大但昂贵的调试工具,因其需要读取DWARF调试段和追踪栈帧指针的高昂开销。
  • 影子栈(Shadow Stack)是一种安全机制,通过单独存储返回地址来防御栈缓冲区溢出攻击,同时避免链表遍历以提升性能。
  • 英特尔和AMD近期宣布了硬件级影子栈支持,Linux内核6.4版本已添加支持(需配置`CONFIG_X86_USER_SHADOW_STACK=y`)。
  • GCC可通过`-fcf-protection=return`或`=full`启用影子栈,该选项会向`.note.gnu.property`段添加`SHSTK`特性标记。
  • Glibc(2.28+版本)基于硬件检测和可调参数(`glibc.cpu.x86_shstk`)动态启用影子栈,支持`on`、`off`和`permissive`三种模式。
  • 当前限制包括:硬件检测不完善(需手动设置`GLIBC_TUNABLES='glibc.cpu.hwcaps=SHSTK'`),且要求所有链接库必须使用`-fcf-protection=full`编译。
  • 影子栈能加速回溯过程——直接读取返回地址而无需慢速的帧指针追踪,结合`/proc/self/map`可辅助调试。
  • 开发者可通过`arch_prctl`系统调用手动控制影子栈,但需谨慎处理上下文切换库(如glibc的`makecontext`/`swapcontext`/`longjmp`)。
  • 虽然影子栈用于回溯的功能尚不成熟且需临时方案,但随着上游支持完善,其有望显著提升调试性能。