简介

此漏洞为Ubuntu本地提权漏洞,该漏洞产生在调用eBPF bpf(2)的Linux内核系统中,当用户提供恶意BPF程序使eBPF验证器模块产生计算错误,导致任意内存读写问题,低权限用户可使用此漏洞向系统发起拒绝服务攻击(内存破坏)或者提升系统权限。

影响版本为Ubuntu 16.04及以下的版本,仅影响Ubuntu/Debian发行版本


靶场下载地址https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.110.tar.gz


第一部分

关于EBPF(extended Berkeley Packet Filter):

一般来说,要向内核添加新功能,需要修改内核源代码或者编写内核模块来实现。而 eBPF 允许程序在不修改内核源代码,或添加额外的内核模块情况下运行。

EBPF是BPF的进阶版本,BPF 是专门为过滤网络数据包而创造的,其两大核心功能是过滤和复制,它也是tcpdump和wireshark实现的基础,以tcpdump为例,BPF一方面接受tcpdump经过libpcap转码后的滤包条件,根据这些规则过滤报文;另一方面也将符合条件的报文复制到用户空间,最终由libpcap发送给tcpdump。

漏洞复现报告:CVE-2017-16995_内核模块


ebpf架构图



第二部分

了解EBPF原理以及架构后,开始对Ubuntu 的靶机进行内核提权

漏洞复现报告:CVE-2017-16995_内核模块_02



靶场配置信息



exploit-dbhttps://www.exploit-db.com/exploits/45010 上的poc源码(.c后缀)复制下来,

上传到Ubuntu中


使用gcc编译exploit

漏洞复现报告:CVE-2017-16995_Ubuntu_03



(3)执行exploit程序

漏洞复现报告:CVE-2017-16995_内核模块_04


(4)查看当前用户权限

漏洞复现报告:CVE-2017-16995_寄存器_05



漏洞分析主要是do_check中使用的模拟寄存器类型和实际执行函数中的寄存器类型不同,导致一些判断可以绕过do_check,执行攻击者注入的任意eBPF指令。


修复方法

  1. 建议用户升级至
  2. 系统调用来缓解:设置参数“kernel.unprivileged_bpf_disabled = 1”通过限制对ebpf 调用了访问来防止这种特权升级
  3. 打补丁