作者: janw
创建: 2021-09-17 15:49
http://scz.617.cn:8/misc/202109171549.txt
参看
What does the endbr64 instruction actually do - [2019-07-05]
https://stackoverflow.com/questions/56905811/what-does-the-endbr64-instruction-actually-do$ objdump -j .text --disassemble=readline /usr/bin/bash | less
...
00000000000d5690 <readline@@Base>:
d5690: f3 0f 1e fa endbr64
d5694: 41 54 push %r12
d5696: 53 push %rbx
endbr64、endbr32指令是Intel CET(Control-Flow Enforcement Technology)技术的一部分,endbr64是"End Branch"的意思。CET的出场是为了对付ROP、JOP、COP攻击技术。据说GCC 8缺省在函数入口放置endbr64指令。endbr64指令的机器码在不支持CET的老版CPU中视作nop指令。
下面有两个函数,some_function通过函数指针间接调用check_login
some_function:
mov rax, qword [vtable+8]
call rax
...
check_login:
endbr64
...
authenticated:
mov byte [is_admin], 1
...
ret
a) 正常流程
some_function从虚函数表中获取check_login地址,间接调用。对于所有间接调用,CET状态机从IDLE状态转移至WAIT_FOR_ENDBRANCH状态,检查当前PC所在指令,若是endbr64则继续,与nop无二。CET状态机转移至IDLE状态。
b) 攻击流程
攻击者设法修改了虚函数表中的函数指针,假设[vtable+8]现在指向authenticated。发生间接调用,CET状态机转移至WAIT_FOR_ENDBRANCH状态,检查当前PC所在指令,是mov而非endbr64,CPU触发Control Protection Exception (#CP),攻击流程中止。若未启用CET,攻击者直接获取管理员权限。
简而言之,启用CET后,间接转移(call/jmp/ret)的目标地址处必须是endbr64指令,该指令正常情况下只出现在函数入口,从而对抗转移到函数中部、指令中部的各种非正常转移。显然,CET有效缓解了ROP、JOP、COP攻击效果,但不能完全阻止它们。