文章详情
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 */
相关推荐
- 11-10半途而废的测试(二)
- 10-26安全技术|域渗透之SPN
- 05-18lightcms后台RCE漏洞挖掘
- 05-12web安全之iframe标签安全防御问题
- 10-20公众号排名优化怎么做?搜一搜排名优化
- 11-12chromesandboxescapecasestudyandplaidctf2
- 10-21深入挖掘.NET注入
- 11-16CVE-2020-25291:金山WPSOffice远程堆损坏漏
- 10-27记一次红队经历
- 10-21让渗透从黑盒变为“灰盒”
- 10-28实战讲解TP3框架下的渗透思路
- 05-11CSS提取图片主题色功能方法
- 11-02从JS敏感信息泄露到GETSHELL
- 04-26宕机是什么意思?宕机怎么读