paper : https://h0ngkai.github.io/papers/sec25_System_Register_Hijacking.pdf
摘要
对系统寄存器进行综合分析,从CFHP出发,借助系统寄存器进行后续利用;
CFI
Linux内核支持一种基于软件的控制流完整性校验,叫做kCFI,目的是防止前向控制流劫持。kCFI在编译时给每一个函数和间接引用的调用点分配一个标签,然后比较调用点和目标点的标签,确保这是一个合法地目标。
现代x86-64处理器支持基于硬件的CFI。通过IBT实现前向边保护,通过Shadow Stack实现后向边保护。
IBT通过保证一个控制流前向边的目标指向的是endbr64指令;
ShadowStack通过维护一个第二栈来工作,第二栈中存放返回地址,且不可以被一般的访存指令修改,如果ret指令pop出来的返回地址和第二栈中pop出来的地址不一致,就认为出错了。
威胁模型
考虑三种不同的场景:
- base:SMEP, SMAP, KPTI, NX-physmap, CR Pinning, STATIC_USERMODE_HELPER, RANDKSTACK, and STACK CANARY.
- FineIBT-Protected.
- kCFI-Protected.
系统寄存器劫持
有的系统寄存器被篡改了可以改变CPU特性,比如cr4寄存器,可以关闭SMEP、SMAP,还有些系统寄存器用于指向许多重要的系统结构体,如果篡改了可以伪造一个顶上去,例如IDT;