Linux 6.2 为 AArch64 实现动态 ShadowCallStack 支持

来源: OSCHINA
编辑:
2022-11-16 08:53:29
AI总结

使用 Clang 构建的 Linux 内核在 5.8 版本中已支持 ShadowCallStack (SCS)。ShadowCallStack 是一种 LLVM 插桩模式,可将函数的返回地址保存到非叶函数的函数 prolog 中单独分配的 ShadowCallStack,并从函数 epilog 中的 ShadowCallStack 加载返回地址,从而防止返回地址覆盖(比如堆栈缓冲区溢出)。返回地址也存储在常规堆栈中,以便与展开程序兼容,但除此之外就没有用处。这样可以确保攻击行为(修改常规堆栈上的返回地址)不会对程序控制流造成任何影响。

在 aarch64 上,此插桩机制使用x18寄存器来引用 ShadowCallStack,这意味着不必将对 ShadowCallStack 的引用存储在内存中。因此,实现的运行时可避免将 ShadowCallStack 地址暴露给能够读取任意内存的攻击者 。

目前尚处于开发阶段的 Linux 6.2 正在实现动态 ShadowCallStack,以避免 SCS 在支持指针身份认证 (PAC) 的处理器上的开销。

正如上文所提到的,ShadowCallStack 对于防止返回地址覆盖(比如堆栈缓冲区溢出)很有用。但是在具有指针身份验证的 AArch64 处理器上,很难证明 SCS 的有用性。因此对于 Linux 6.2,计划启用动态 SCS 支持,允许它在启动时进行启用/禁用。此项动态 SCS 支持特性是在启动/运行时通过代码修补完成的。

因此,对于那些由于其他硬件保护已经到位而不想为其 AArch64 SoC 提供此安全功能的用户来说,不需要禁用 SCS 的替代内核构建。通过 Clang 为 ARM64 实现动态 SCS 支持的代码如果没有出现任何问题,将在下个月提交到 Linux 6.2 合并窗口。

展开阅读全文
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
分享
AI总结
返回顶部
顶部