dockercp一个命令,宿主机就被接管:CVE-2026-17106逃逸漏洞复盘

admin 2026-08-21 06:59:40 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: CVE-2026-17106是Dockercp命令的容器逃逸漏洞,利用TOCTOU竞争条件与符号链接,使CLI解包时向宿主机任意路径写文件从而接管宿主机。该漏洞影响DockerEngine29.7.0以下版本。建议立即升级Docker至29.7.0及以上版本,避免对不可信容器执行dockercp,并在运行时启用只读模式增加利用难度。 综合评分: 95 文章分类: 漏洞分析,漏洞POC,漏洞预警,供应链安全,云安全


cover_image

docker cp一个命令,宿主机就被接管:CVE-2026-17106逃逸漏洞复盘

零日手记 零日手记

随笔漫记安全路

2026年8月12日 08:37 北京

在小说阅读器读本章

去阅读

Docker的docker cp命令,每个用Docker的人都用过。复制文件进出容器,日常操作。

现在这个命令可以被恶意容器利用,往宿主机任意路径写文件——包括覆盖/usr/bin/runc,直接接管整台宿主机。

CVE-2026-17106,Imperva红队研究员Ron Masas发现,命名为CopyEscape


漏洞原理:竞争条件+符号链接

docker cp的工作流程是这样的:Docker CLI向daemon请求容器内某个路径的文件,daemon把文件打包成tar流发回来,CLI在宿主机上解包。

问题出在打包和解包之间。

恶意容器在daemon打包文件的时候,跑一个竞争线程:daemon的文件系统遍历器走过的路径上,容器内进程把一个目录替换成一个绝对路径的符号链接。daemon打包出来的tar流里就同时包含了符号链接和它下面的子条目。

Docker CLI解包时,先创建了符号链接,然后解包子条目——顺着符号链接写到了宿主机上的任意路径。

这是一个TOCTOU(Time-of-Check-Time-of-Use)竞争条件。 daemon检查文件类型的时候看到的是目录,打包到一半容器把目录换成符号链接,CLI解包时跟随了符号链接。

写入的文件带着执行docker cp的用户的权限。如果用户是root,写入的文件就是root所有。


两个PoC:从创建文件到覆盖runc

研究员提供了两个演示。

macOS版:在宿主机home目录创建~/pwnd文件。非破坏性,证明逃逸可行。

cd macos
./demo-macos.sh
#&nbsp;docker&nbsp;cp&nbsp;<container>:/watched/file.txt&nbsp;./file.txt
#&nbsp;结果:宿主机上多了一个&nbsp;~/pwnd

Linux版:覆盖/usr/bin/runc

sudo&nbsp;-s
cd&nbsp;linux
docker&nbsp;build&nbsp;-t&nbsp;copyescape-linux&nbsp;.
docker&nbsp;run&nbsp;--name&nbsp;copyescape-linux&nbsp;copyescape-linux

#&nbsp;另一个终端触发
docker&nbsp;cp&nbsp;copyescape-linux:/watched/file.txt&nbsp;./file.txt

#&nbsp;/usr/bin/runc&nbsp;已被替换为攻击者脚本
#&nbsp;下一次Docker执行任何容器命令时,以root身份运行攻击者代码
ls&nbsp;-l&nbsp;/imperva_red_team&nbsp;&nbsp;#&nbsp;攻击标记文件

容器里的/watched/file.txt看起来是个正常文件——容器内进程cat它返回”top-level file”。但底层实际上是个目录,daemon遍历时容器内监控线程把它换成指向/usr/bin/runc的绝对路径符号链接。tar流里带了符号链接+子条目,CLI解包时通过符号链接把攻击者的shell脚本写进了/usr/bin/runc

runc是Docker运行容器的底层runtime。 它被替换后,下一次Docker启动任何容器,执行的就是攻击者的代码,root权限。

不需要利用daemon权限提升,不需要逃逸容器namespace,只需要诱导有Docker CLI权限的用户执行一次docker cp


影响版本和修复

漏洞在moby/go-archive库中,影响UnpackUnpackLayerUntarUntarUncompressedApplyLayer等函数。

| 组件 | 受影响版本 | 修复版本 | | — | — | — | | moby/go-archive | < v0.3.0 | v0.3.0(7月30日) | | Docker Engine | < 29.7.0 | 29.7.0(7月30日) | | Docker Desktop | < 4.82.0 | 4.82.0 |

PoC测试环境:Docker Engine/CLI 29.6.1、Docker Desktop 4.81.0。

修复方式:升级到go-archive v0.3.0+,解包时拒绝跟随逃逸目标目录的符号链接。后续v0.3.1、v0.3.2、v0.3.3修了几个回归bug(绝对符号链接和硬链接的处理)。


攻击场景

这个漏洞的利用前提是:攻击者已经控制了容器内部,且能诱导宿主机上有Docker CLI权限的用户执行docker cp从该容器复制文件。

典型场景:

  1. 供应链攻击:攻击者在Docker Hub或私有镜像仓库上传恶意镜像,用户拉取后运行,然后docker cp日志文件出来查看——触发逃逸
  2. 多租户环境:云平台上用户有Docker CLI访问权,平台用docker cp做文件传输,恶意容器趁机逃逸
  3. CI/CD管道:构建脚本用docker cp从构建容器里复制产物,如果镜像是第三方的,每次cp都是一次赌博
  4. 运维操作:管理员习惯用docker cp从容器里拷日志、配置文件出来排查问题——这是最常见的触发方式

修复建议

  1. 立即升级Docker Engine到29.7.0+,Docker Desktop到4.82.0+
  2. 如果已经升级到29.7.0但遇到docker cp报错,升级到29.7.1或29.7.2修复回归bug
  3. 不要从不信任的镜像运行容器后执行docker cp
  4. CI/CD管道中如果必须从容器复制文件,确保镜像来源可信
  5. 运行容器时加--read-only或限制容器内文件系统操作能力,增加竞争条件利用难度

参考链接

  • PoC仓库:github.com/masasron/CopyEscape-CVE-2026-17106
  • go-archive修复:github.com/moby/go-archive/releases/tag/v0.3.0
  • GHSA-hfg8-hc9c-6c3h
  • Docker Engine 29.7.0发布说明:github.com/moby/moby/releases/tag/docker-v29.7.0
  • 研究员:Ron Masas(Imperva红队)

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:随笔漫记安全路 零日手记 零日手记《docker cp一个命令,宿主机就被接管:CVE-2026-17106逃逸漏洞复盘》

评论:0   参与:  0