一文读懂 DirtyPipe(CVE-2022-0847):container-escape-check 检测逻辑与逃逸利用原理

📅 发布时间:2026/8/20 21:38:39
一文读懂 DirtyPipe(CVE-2022-0847):container-escape-check 检测逻辑与逃逸利用原理
一文读懂 DirtyPipeCVE-2022-0847container-escape-check 检测逻辑与逃逸利用原理【免费下载链接】container-escape-checkdocker container escape check || Docker 容器逃逸检测项目地址: https://gitcode.com/gh_mirrors/co/container-escape-checkDirtyPipeCVE-2022-0847曾被称为新一代 DirtyCow是一个影响 Linux 内核 5.8 及以上版本的本地提权漏洞而container-escape-check 容器逃逸检测工具从 v0.1 版本起就把它列入检测清单通过比对内核版本号快速判断容器是否存在逃逸风险。这篇文章将用通俗的语言讲清楚 DirtyPipe 的漏洞成因、逃逸利用原理以及 container-escape-check 的具体检测逻辑与它的局限性。DirtyPipeCVE-2022-0847是什么能改写只读文件的 Linux 内核漏洞DirtyPipe 由安全研究员 Max Kellermann 于 2022 年初发现并公开编号 CVE-2022-0847核心信息如下影响范围Linux 内核 5.8 及以后版本5.8 之前不受影响漏洞本质管道pipe缓冲区中的PIPE_BUF_FLAG_CAN_MERGE标志未被正确清除导致普通进程可以往只读文件的页缓存page cache中写入数据危害程度攻击者能修改/etc/passwd等只读文件、改写 setuid 程序把普通用户直接提权到 root属于典型的本地提权LPE漏洞它之所以叫 DirtyPipe是为了致敬 2016 年的脏牛漏洞DirtyCowCVE-2016-5195——两者都能改写只读文件只是 DirtyPipe 利用的是全新的内核管道机制。为什么 DirtyPipe 会成为 Docker 容器逃逸的入口很多新手会疑惑一个提权漏洞和容器逃逸有什么关系关键在于——容器与宿主机共享同一个内核。容器本身只是宿主机内核之上的隔离进程无论容器内权限多低只要内核存在漏洞攻击者就能在容器内触发漏洞、直接影响宿主机内核。DirtyPipe 正是典型的内核级漏洞攻击者在容器内获得任意代码执行权限哪怕只是低权限用户利用 DirtyPipe 改写宿主机上的关键文件如 root 密码、SSH 公钥等拿到宿主机 root 权限完成容器逃逸因此检测容器所在内核是否存在 DirtyPipe是容器安全巡检中至关重要的一环。container-escape-check 如何检测 DirtyPipecontainer-escape-check 的检测思路非常直接读取当前内核版本号再与已知的受影响版本区间做比对。整个过程分为两步。第一步解析内核版本号脚本通过uname -r拿到内核版本再拆解为主版本号、次版本号和修订号三部分见 container-escape-check.shKernelVersionuname -r | awk -F - {print $1} | awk -F . {print $1} MajorRevisionuname -r | awk -F - {print $1} | awk -F . {print $2} MinorRevisionuname -r | awk -F - {print $1} | awk -F . {print $3}第二步比对受影响版本区间CheckCVE_2022_0847函数见 container-escape-check.sh只对5.x 内核做判断核心逻辑是# 5.8 ver 5.10 if [[ $MajorRevision -ge 8 $MajorRevision -lt 10 ]];then echo [] 当前容器存在 CVE-2022-0847 DirtyPipe 漏洞 fi # 5.10.x 5.10.102 if [[ $MajorRevision -eq 10 $MinorRevision -lt 102 ]];then echo [] 当前容器存在 CVE-2022-0847 DirtyPipe 漏洞 fi # 5.10 ver 5.15 if [[ $MajorRevision -gt 10 $MajorRevision -lt 15 ]];then echo [] 当前容器存在 CVE-2022-0847 DirtyPipe 漏洞 fi只要命中任意一个区间脚本就会输出[]结果并把漏洞标记置为存在。受影响内核版本速查表内核版本是否受影响说明 5.8❌ 不受影响漏洞在 5.8 引入5.8 ~ 5.9✅ 受影响全部存在漏洞5.10.0 ~ 5.10.101✅ 受影响5.10.102 修复5.11 ~ 5.14✅ 受影响该分支未单独修复5.15.0 ~ 5.15.24✅ 受影响5.15.25 修复5.16.0 ~ 5.16.10✅ 受影响5.16.11 修复≥ 5.17❌ 不受影响新版本已修复 官方修复版本为5.16.11 / 5.15.25 / 5.10.102如果你的内核版本高于这些版本理论上已免疫。这种检测方式的优点与局限优点无需任何攻击载荷一条命令、几毫秒就能完成检测非常适合批量巡检与自动化安全扫描。局限作者在 README 中也明确提醒过基于版本号推断可能存在误报脚本采用宁滥勿缺的策略部分已修复的 5.10.x、5.15.x 版本也会被标记为存在漏洞需要人工二次确认可能存在漏报不同发行版会自行 backport 安全补丁内核版本号相同不代表修复状态相同不验证 Docker 版本作者在 README_ZH.md 中提到暂时还没有找到从容器内部获取 Docker 版本的方法因此部分与 Docker 版本相关的逃逸检测暂不支持简单来说它告诉你大概率有风险但最终结论仍需人工研判。DirtyPipe 逃逸利用原理速览为了便于理解这里用三步走概括整个利用过程省略具体攻击代码准备管道创建管道并写入 1 字节数据让管道缓冲区进入可合并状态污染标志用splice()把只读文件的 1 字节拼接进管道利用内核 bug 让该缓冲区残留CAN_MERGE标志覆写文件再向管道写入恶意数据内核会把数据直接写进文件对应的页缓存——于是只读文件被悄悄改写配合这三步攻击者就能改掉/etc/passwd或 setuid 程序在容器内直接拿下宿主机 root 权限。在容器中一键运行检测在目标 Docker 容器内执行以下命令即可完成全部检测git clone https://gitcode.com/gh_mirrors/co/container-escape-check cd container-escape-check chmod x container-escape-check.sh ./container-escape-check.sh脚本会自动检测特权模式、Docker Socket 挂载、procfs 挂载、DirtyCow、DirtyPipe 等 15 项风险并汇总输出全程无需人工干预。如何防御 DirtyPipe 容器逃逸最后给出一份可直接落地的加固清单升级内核第一时间升级到 5.16.11 / 5.15.25 / 5.10.102 及以上的修复版本并重启宿主机最小权限原则避免使用特权容器严格控制 Linux Capability 与危险目录挂载️启用安全机制配置 seccomp、AppArmor / SELinux限制容器系统调用定期巡检把 container-escape-check 集成进 CI/CD 或安全巡检流程内核升级后第一时间复查总结一下DirtyPipe 是一个影响面极广的 Linux 内核提权漏洞在容器场景下天然是逃逸的高危入口container-escape-check 用版本比对这种轻量方式把它纳入自动化检测虽然存在一定误报率但胜在快速、零依赖、适合批量巡检。看懂它的检测逻辑你就能在安全巡检时更准确地判断结果而不是被满屏的[]吓到。【免费下载链接】container-escape-checkdocker container escape check || Docker 容器逃逸检测项目地址: https://gitcode.com/gh_mirrors/co/container-escape-check创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考