摘要: 无需竞态条件,一行代码改写只读文件。带你复盘这个让 Linux 内核开发者"老脸一红"的高危漏洞。
前言
在 Linux 安全圈,提到"脏"(Dirty)这个字眼,大家首先想到的往往是 2016 年那个威震天下的 Dirty COW (脏牛)。
然而,2022 年爆出的 DirtyPipe (CVE-2022-0847),在利用效率和稳定性上,完全超越了它的前辈。它利用了内核管道(Pipe)机制的逻辑缺陷,让普通用户能像"神"一样,无需权限即可改写系统中的任何只读文件。
今天,我们就来深度拆解这个被戏称为"脏牛 2.0"的内核提权核弹。
1. 什么是 DirtyPipe?
DirtyPipe 是由 Max Kellermann 发现的一个 Linux 内核本地提权漏洞。它的"魅力"在于:极其稳定且利用简单。
* 漏洞编号:CVE-2022-0847
* 影响版本:Linux 内核 5.8 及以上版本(直到 5.16.11, 5.15.24, 5.10.102 修复)。
* 杀伤力:CVSS 7.8。本地普通用户可以瞬间篡改 /etc/passwd、/etc/shadow 或是任何二进制程序,直接获取 Root 权限。
2. 核心原理:管道里的"脏东西"
这个漏洞的根源在于 Linux 内核处理 管道缓冲区(Pipe Buffer) 的一个小失误。
在 Linux 中,管道不仅用于进程间通信,还可以通过 splice() 系统调用将文件内容"零拷贝"到管道中。
* 历史原因:从内核 5.8 开始,为了提升性能,引入了一个新标志 PIPE_BUF_FLAG_CAN_MERGE。它告诉内核:这个缓冲区是可合并的。
* 漏洞触发:当攻击者使用 splice() 将一个只读文件的数据拉入管道时,内核错误地保留了上一个操作留下的"可合并"标志。
* 移花接木:接下来,攻击者向管道写入恶意数据。内核看到"可合并"标志,就直接把数据写到了刚才那个只读文件对应的**页面缓存(Page Cache)**里。
结果就是: 虽然你没有写权限,但内核被你欺骗,亲手帮你把恶意数据改写到了只读文件的物理内存页中。
> 比喻: 就像你租了一个公共储物柜(管道),里面放着别人的贵重文件副本(Page Cache)。因为管理员(内核)忘了清理"可写"标签,你可以直接在那个副本上涂鸦,而这个涂鸦会直接同步到原始文件中。
>
3. 与 Dirty COW 的对决
| 特性 | Dirty COW (脏牛) | DirtyPipe |
|---|---|---|
| [可靠性]{path-to-node="24,1,0,0"} | [依赖竞态条件,可能失败]{path-to-node="24,1,1,0"} | [逻辑漏洞,100% 成功]{path-to-node="24,1,2,0"} |
| [复杂度]{path-to-node="24,2,0,0"} | [需要复杂的内存操作]{path-to-node="24,2,1,0"} | [几行简单的 C 代码即可]{path-to-node="24,2,2,0"} |
| [性能]{path-to-node="24,3,0,0"} | [消耗 CPU 资源进行竞争]{path-to-node="24,3,1,0"} | [瞬间完成,无感操作]{path-to-node="24,3,2,0"} |
- 谁会受到影响?
由于该漏洞存在于 5.8 之后的内核,因此绝大多数现代发行版都曾身陷囹圄:
* Ubuntu 20.04/21.10/22.04
* Debian 11
* Android 设备(特别是使用 5.10+ 内核的新手机)
* 容器环境:如果宿主机内核易受攻击,容器内的进程可能实现逃逸。
5. 修复与防护建议
LeisureLinux 提醒您:安全第一,升级为王!
* 内核升级:这是最根本的解决办法。请确保内核版本高于:
* 5.16.11 / 5.15.24 / 5.10.102
* 临时缓解:如果无法重启升级,可以尝试限制非特权用户使用 user namespaces:
sysctl -w kernel.unprivileged_userns_clone=0
注意:这可能会导致 Docker 或 Chrome 某些功能异常。
结语
DirtyPipe 的出现再次提醒我们:即便是在像 Linux 内核这样被无数眼睛盯着的开源项目中,哪怕是一个标志位的逻辑错误,也可能引发巨大的安全隐患。
如果你对该漏洞的 Exploit 代码演示或底层技术细节感兴趣,欢迎关注我们的 B 站同名频道:LeisureLinux,我们将通过视频演示带你直观感受这个漏洞的威力。
想了解更多 Linux 黑科技和运维干货?
* 关注公众号:LeisureLinux
* 视频教程:B 站搜索"LeisureLinux"
互动一下: 你在实际生产中遇到过最棘手的 Linux 漏洞是什么?欢迎在评论区留言交流!