天天看点

CVE-2017-16995-Ubuntu本地提权漏洞复现echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

环境搭建

系统选择的是Ubuntu16.04-desktop-amd64.iso安装的环境,安装过程不用安装更新软件包。

漏洞分析&利用

在该环境下直接利用编译好之后的程序并不成功(4.4.0-21-generic),如下:

CVE-2017-16995-Ubuntu本地提权漏洞复现echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

然后在Ubuntu14.04、16.04.4都试着还是不成功!都是报错,如下是14环境报错信息:

CVE-2017-16995-Ubuntu本地提权漏洞复现echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

缺失头文件,然后在16.04.4下尝试:

CVE-2017-16995-Ubuntu本地提权漏洞复现echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

很显然该版本4.13高于4.4.0,所以并没有漏洞,也许是我下载的16.04.4的镜像比较新导致的:

CVE-2017-16995-Ubuntu本地提权漏洞复现echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

在16.04.1和16.04.1中没有尝试。因此个人认为网上的文章说明的范围稍微偏大

CVE-2017-16995-Ubuntu本地提权漏洞复现echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

我们还是用16.04测试。查找该漏洞的详情,漏洞编号是:CVE-2017-16995

在seebug有详细的说明:https://www.seebug.org/vuldb/ssvid-97183

CVE-2017-16995-Ubuntu本地提权漏洞复现echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

这里查看漏洞详情,可以看到作者分析了具体的详情,由于Linux内核带有的eBPF bpf(2)系统调用中,当用户提供恶意BPF程序使eBPF验证器模块产生计算错误,导致任意内存读写问题。 非特权用户可以使用此漏洞获得权限提升,代码我们就不分析了,作者在不断尝试得到引起内存地址变换几个变量R0/R1/R10是需要在gcc编译的过程中调试,所以最后的代码是正确的:crasher_badtrunc.c

CVE-2017-16995-Ubuntu本地提权漏洞复现echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

我们将这个crash代码在ubuntu下编译执行,引起变化之后在执行exp:

gcc -ocrasher_badtrunc crasher_badtrunc.c -Wall && ./crasher_badtrunc

CVE-2017-16995-Ubuntu本地提权漏洞复现echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

可以看到提权成功,获得root的权限,从利用过程来看,利用条件还算是较小,所以应该属于一个高危的漏洞了!

漏洞修复

目前暂未有明确的补丁升级方案。 建议用户在评估风险后,通过修改内核参数限制普通用户使用bpf(2)系统调用:

echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled

获取更多漏洞复现知识请关注WX公众号【安全漏洞环境学习】

继续阅读