近期看到了Ubuntu本地提权漏洞CVE-2017-16995, 所以自己在本地搭建了环境分析了一下,现在将该漏洞的成因、复现、修复方案进行简单的介绍。
漏洞描述
Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统,基于Debian GNU/Linux 。近期有白帽子爆出 ubuntu 的最新版本(Ubuntu 16.04)存在本地提权漏洞,漏洞编号为CVE-2017-16995。该漏洞存在于调用eBPF bpf(2)的Linux内核系统中,当用户提供恶意BPF程序使eBPF验证器模块产生计算错误,导致任意内存读写问题, 低权限用户可使用此漏洞获得管理权限。
该漏洞虽然在老版本中已经得到了修复,但是在最新版本中仍然可以被利用,官方已发布补丁!
漏洞环境搭建
目标主机:Ubuntu 192.168.11.158
攻击主机:在本次漏洞复现过程中攻击主机只是起到一个上传exploit到目标主机以及实现远程操作的功能,这里为了方便就不再使用其他主机作为攻击机了,直接在Ubuntu中操作,如果读者想要体验一下可以使用一台Kali 主机,之后使用SFTP或SSH进行上传文件,之后再继续下面的操作。
Ubuntu IP 地址:
Ubuntu 当前系统版本、当前用户权限、当前内核版本
这里的内核版本是4.13.0-36-generic,该Ubuntu 16.04 是从官方网站下载的纯净版,无其他任何安装程序,但是这里的内核版本不再影响范围内,所以为了演示我们需要修改以下内核版本,修改方式如下:
搜索内核版本信息:
下载在漏洞影响范围之内的内核版本,这里选择4.4.0-92版本(读者可以自己选择内核版本进行复现)
修改内核配置信息
修改前信息
修改后的版本信息
保存之后重启一下(reboot命令即可):
再次确认当前内核版本信息
漏洞复现
上传Exploit到Ubuntu中
编译exploit
运行exploit程序
查看当前用户权限
成功提权!
漏洞修复方案
方法一:目前暂未有明确的补丁升级方案提出,但是建议用户通过修改内核参数限制普通用户使用bpf(2)系统调用来缓解:
设置参数“kernel.unprivileged_bpf_disabled = 1”通过限制对bpf(2)调用了访问来防止这种特权升级
之后再次以一个普通用户权限执行exploit时:
可以看到无法完成提权了!
方法二:升级Linux Kernel 版本,需要重启服务器之后生效:
说到这一步,我之前使用纯净的Ubuntu 16.04版本当时的内核是4.13.0-36-generic,然而在进行这一项操作的时候直接显示“error:not permited”,当时我还以为是权限问题,但是赋予了“r\w\x”权限之后运行exploit的时候也不行。经过笔者亲自验证发现修改内核版本是一个非常不错的修复方式,当然也可以升级Linux Kernel版本,使其不再漏洞影响范围之内就好。
方法三:使用官方补丁进行修复
代码补丁 :https://github.com/torvalds/linux/commit/95a762e2c8c942780948091f8f2a4f32fce1ac6f
总结
一个内核漏洞可能会对用户、企业等造成巨大损失,所以建议存在该漏洞的用户或企业需要尽快的完成修复,避免产生始料未及的损失。同时在修复时也最好采用可以从根本上解决问题的方法为好!