黑客
登录
客服
网络安全,渗透测试

LinuxkernelBPF模块的相关漏洞分析

日期:2020/11/11 10:49:21

今年pwn2own上的linux kernel提权漏洞是linux kernel bpf模块的漏洞 ---CVE-2020-8835,更早听说过的与bpf相关的漏洞是CVE-2017-16995。然后在上海参加GeekPwn 云靶场线下挑战赛的时候,也是一道bpf相关的内核题。我和我们队长通宵学习相关知识,最后拿到了这道题全场唯一的一血。 然后紧接着在11月1号,又有国外研究者爆出了bpf的又一个漏洞--CVE-2020-27194,也是内核提权。CVE-2020-27194是linux kernel 5.8.x的通杀洞,和GeekPwn的kernel题一个环境。事后和队长感慨,还好这个洞晚了几天公开,不然我们就拿不到第2名的好名次了(同时损失奖金)。

360团队和漏洞研究者都已经写了CVE-2020-27194的writeup,但是没公布exp(那我就公开一下?)。这个漏洞和GeekPwn那道题的利用原理类似,于是想一起写一篇Writeup描述一下这种漏洞的利用。

BPF基础

关于BPF的相关基础知识,ZDI上CVE-2020-8835的Writeup已经写的足够清晰。然后另外比较一个重要的资料就是 kernel的文档,所以这里不再复述过多。

简单地说, 就是内核里实现了bpf字节码的JIT compiler, 用户可以在用户态编写bpf代码然后经Jit compiler后执行。但是如果不加以限制,就相当于用户可以在内核执行任意代码,显然不符合权限管理模型。于是需要有一个verify的机制(相当于静态程序分析),去检查一些不合法的行为。

其中一个很重要的点就是会对常数变量设置一个取值范围。struct bpf_reg_state里存储着这样8个变量:

s64 smin_value; /* minimum possible (s64)value */
    s64 smax_value; /* maximum possible (s64)value */
    u64 umin_value; /* minimum possible (u64)value */
    u64 umax_value; /* maximum possible (u64)value */
    s32 s32_min_value; /* minimum possible (s32)value */
    s32 s32_max_value; /* maximum possible (s32)value */
    u32 u32_min_value; /* minimum possible (u32)value */
    u32 u32_max_value; /* maximum possible (u32)value */

最新教程

最新文章

推荐文章

热门文章

黑客技术 黑客软件 黑客教程 黑客书籍

关于我们 | 免责声明 | 学员守则 | 广告服务 | 联系我们

©2013-2021 xf1433.com 版权所有

本站资源仅供用于学习和交流,请遵循相关法律法规