Linux eBPF JIT权限提升误差(CVE-2020-27194)剖析与验证
宣布时间 2020-11-03误差配景
克日,外洋清静研究职员披露一个Linux eBPF verifier组件过失验证误差,此误差源于bpf验证系统在Linux内核中没有准确盘算某些操作的寄存器界线跟踪,导致外地攻击者可以使用此缺陷举行内核信息泄露或特权提升,该误差编号为CVE-2020-27194。
影响规模与防护步伐
Linux-5.7 ~ Linux-5.8.14
Ubuntu 20.10
2、防护步伐
实时更新升级内核;
将kernel.unprivileged_bpf_disabled.sysctl设置为1,暂时限制通俗用户权限。
误差原理与调试剖析
1、误差原理
该误差和Pwn2own2020角逐中使用的CVE-2020-8835误差原理一致,均是过失盘算了寄存器界线跟踪,导致可以绕过验证器检查抵达越界读写。缺陷代码泛起在kernel/bpf/verifier.c的scalar32_min_max_or()函数中,该函数是在commit_id:3f50f132d840中引入的,该功效实现了显式的ALU32(32位盘算类操作)寄存器界线跟踪,处置惩罚OR运算时,挪用scalar32_min_max_or()函数举行32位寄存器界线跟踪,该函数实现如下:

行5365和行5366,直接将dst_reg寄存器中的64位无符号值赋值给32位有符号值,这显着是过失的。例如设置dst_reg->umin_value=1,dst_reg->umax_value=0x600000001,当举行如上操作后,dst_reg->s32_min_value为1,可是dst_reg->s32_max_value也将是1,由于0x600000001的高位将被截断,这时dst_reg寄存器的规模从[1,0x600000001]酿成了[1,1],这会被验证器识别为常数1,进而绕过验证器检查。误差补丁中,举行了准确的32位有符号值赋值操作,如下所示:
2、调试剖析
首先将寄存器的umin_value设置为0x1,可以通过如下BPF指令实现:

此时,寄存器的状态如下所示:

设置完umin_value后,设置umax_value为0x600000001,可以通过如下BPF指令实现:

断点掷中后,挪用栈如下所示:

执行完BPF_JMP_REG(BPF_JLT,BPF_REG_6,BPF_REG_5,1)指令后,将R6寄存器规模设置为0x1到0x600000001之间。R6寄存器状态如下所示:

接着,设置R6寄存器中32位的无符号最小值和最大值,

设置完之后,R6寄存器状态如下所示:

红框中设置的值是必需要包管的,需要提前举行设置,利便后面绕过if判断进入缺陷代码块中。接着设置R6寄存器32位有符号最小值和最大值,代码如下所示:

行5355,if语句判断不建设,会走到行5362分支中,调试情形如下所示:

触发误差后,R6寄存器状态如下:

此时s32_min_value和s32_max_value都为0x1,在验证器中,R6寄存器的32位有符号取值为常数1。但R6寄存器的取值现实是有规模的。接着将R6寄存器举行32位MOV到R7寄存器中,执行到如下代码所示:

此时,src_reg寄存器如下所示:

执行MOV操作之前,R7寄存器状态如下所示:

执行MOV操作后,R7寄存器状态如下所示:

R7寄存器为常量1,现实运行情形下是有规模的,可以设置为2。执行BPF_ALU64_IMM(BPF_RSH,BPF_REG_7,1)后,即R7 >>= 1,R7寄存器如下所示:

此时umin_value和umax_value为0,即为R7寄存器举行右移操作后,在验证器中被识别为常数0,此时R7寄存器举行加减运算都不会爆发越界,绕过了验证器的界线检查。可是若是R7寄存器现实设置为2,2>>1为1,R7寄存器为1,此时和R7寄存器举行加减运算,抵达越界读写。
误差复现
在Linux-5.7.7版本中举行误差使用,乐成提权。

参考链接:
[1] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-27194
[2] https://github.com/torvalds/linux/commit/5b9fbeb75b6a98955f628e205ac26689bcb1383e
[3] https://github.com/torvalds/linux/commit/3f50f132d8400e129fc9eb68b5020167ef80a244
[4] https://scannell.me/fuzzing-for-ebpf-jit-bugs-in-the-linux-kernel/
尊龙凯官网入口起劲防御实验室(ADLab)
ADLab建设于1999年,是中国清静行业最早建设的攻防手艺研究实验室之一,微软MAPP妄想焦点成员,“黑雀攻击”看法首推者。阻止现在,ADLab已通过CVE累计宣布清静误差近1100个,通过 CNVD/CNNVD累计宣布清静误差900余个,一连坚持国际网络清静领域一流水准。实验室研究偏向涵盖操作系统与应用系统清静研究、移动智能终端清静研究、物联网智能装备清静研究、Web清静研究、工控系统清静研究、云清静研究。研究效果应用于产品焦点手艺研究、国家重点科技项目攻关、专业清静服务等。



京公网安备11010802024551号