环境搭建
系统选择的是Ubuntu16.04-desktop-amd64.iso安装的环境,安装过程不用安装更新软件包。
漏洞分析&利用
在该环境下直接利用编译好之后的程序并不成功(4.4.0-21-generic),如下:
然后在Ubuntu14.04、16.04.4都试着还是不成功!都是报错,如下是14环境报错信息:
缺失头文件,然后在16.04.4下尝试:
很显然该版本4.13高于4.4.0,所以并没有漏洞,也许是我下载的16.04.4的镜像比较新导致的:
在16.04.1和16.04.1中没有尝试。因此个人认为网上的文章说明的范围稍微偏大
我们还是用16.04测试。查找该漏洞的详情,漏洞编号是:CVE-2017-16995
在seebug有详细的说明:https://www.seebug.org/vuldb/ssvid-97183
这里查看漏洞详情,可以看到作者分析了具体的详情,由于Linux内核带有的eBPF bpf(2)系统调用中,当用户提供恶意BPF程序使eBPF验证器模块产生计算错误,导致任意内存读写问题。 非特权用户可以使用此漏洞获得权限提升,代码我们就不分析了,作者在不断尝试得到引起内存地址变换几个变量R0/R1/R10是需要在gcc编译的过程中调试,所以最后的代码是正确的:crasher_badtrunc.c
我们将这个crash代码在ubuntu下编译执行,引起变化之后在执行exp:
gcc -ocrasher_badtrunc crasher_badtrunc.c -Wall && ./crasher_badtrunc
可以看到提权成功,获得root的权限,从利用过程来看,利用条件还算是较小,所以应该属于一个高危的漏洞了!
漏洞修复
目前暂未有明确的补丁升级方案。 建议用户在评估风险后,通过修改内核参数限制普通用户使用bpf(2)系统调用:
# echo 1 >/proc/sys/kernel/unprivileged_bpf_disabled