随着Linux6.6的发布,主线内核终于落地在Intel/AMD CPU上支持卷影堆栈这最初是作为英特尔控制流执行技术(CET)的一部分推出的,目的是更好地抵御ROP攻击。GNU C库“glibc”最近更新了一些围绕CET/Shadow Stack支持的更改。
最新的Glibc开发代码现在具有已同步针对x86_64上的Linux 6.6+发现的卷影堆栈接口。这项工作继续进行到启用阴影堆栈启动期间:
“以前,CET是由内核在将控制权传递给用户空间之前启用的,如果应用程序或共享库没有启用CET,则启动代码必须禁用CET。 由于当前内核只支持影子堆栈,并且在将控制权传递给用户空间之前不会启用影子堆栈,因此如果应用程序和所有共享库都启用了影子堆栈,则需要在启动时启用影子堆栈。 没有必要在启动时禁用影子堆栈。 阴影堆栈只能在永远不会返回的函数中启用。 否则,影子堆栈将在函数返回时下溢。”
但随后的一个后续补丁清楚地表明, 默认情况下未将CET设置为活动:
“并非所有支持CET的应用程序和库都在支持CET的环境中经过了正确的测试。 当启用CET时,某些启用CET的应用程序或库将崩溃或行为不当。 默认情况下不要将CET设置为活动状态,这样无论CET是否处于活动状态,所有应用程序和库都将正常运行。 阴影堆栈可以通过以下方式启用:
$EXPORT GLIBC_TUNABLES=glibc.cpu.hwcaps=SHSTK
在运行时,如果内核可以启用影子堆栈。
注意:如果默认为所有应用程序和库启用CET,则可以恢复此提交。”
These CET Shadow Stack additions for the GNU C Library will be part of the glibc 2.39 release due out roughly next month.