Control-Flow Enforcement,在Intel 11th 和 Zen 3或更新的的处理器上可用,硬件的shadow stack+IBT,防止ROP/COP/JOP这些控制流劫持技术。

主要分为两个部分

shadow stack

call时会自动将返回地址多存放一份到ssp寄存器指向的shadow stack,ret时自动检查栈上存储的值是否与shadow stack上的结果相同

shadow stack在特殊页上,页表会确保不能用普通store指令写入(这确保了机制不依赖于secret,即使shadow stack地址泄露,攻击者也无法通过常规的任意读写原语修改)

主要是longjmp/context switch时需要特殊处理,存储/还原ssp寄存器,或者调整shadow stack,intel提供了新的指令用于操作shadow stack

fork/vfork也存在一些特殊处理

Indirect Branch Tracking (IBT)

在函数开头添加ENDBR64/ENDBR32 指令,指示其为合法的间接跳转地址

在发生间接跳转时(call rax/jmp rax )检查目标地址指令是否为ENDBR64/ENDBR32

新增了notrack prefix,可添加在间接跳转指令前指示不进行IBT检查

Intel 的模拟器可以模拟CET,能类似qemu-user直接运行用户态程序(可能的出题点子)

Intel® Software Development Emulator

Emulating Applications with Intel® SDE and Control Flow Enforcement...

参考:

  1. Enable intel CET in linuxOS