Linux eBPF JIT权限提升误差(CVE-2020-27194)剖析与验证

宣布时间 2020-11-03

误差配景


克日 ,外洋清静研究职员披露一个Linux eBPF verifier组件过失验证误差 ,此误差源于bpf验证系统在Linux内核中没有准确盘算某些操作的寄存器界线跟踪 ,导致外地攻击者可以使用此缺陷举行内核信息泄露或特权提升 ,该误差编号为CVE-2020-27194。


影响规模与防护步伐


1、影响规模
  • 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清静研究、工控系统清静研究、云清静研究。研究效果应用于产品焦点手艺研究、国家重点科技项目攻关、专业清静服务等。


1.jpg