随着容器化技术在企业级部署中的广泛应用,Docker 作为主流的容器引擎,其安全边界问题愈发受到关注。Docker 依托 Linux 内核的隔离机制实现资源分隔,但这种隔离并非绝对安全------攻击者可通过多种手段突破容器限制,获取宿主机的 root 权限,这一过程被称为"Docker 逃逸"。本文将从 Docker 安全隔离的核心原理出发,梳理常见的逃逸利用方式。
一、Docker 安全隔离机制的底层逻辑
要理解 Docker 逃逸的原理,首先需明确其隔离机制的核心依赖------Linux 内核的三大核心技术:Namespace、Cgroups 与 Capabilities。这三者共同构建了容器的安全边界,但也存在各自的局限性,为逃逸提供了可乘之机。
(一)Namespace:命名空间隔离
Namespace 是 Linux 内核提供的一种进程隔离技术,通过为进程创建独立的"命名空间",实现进程、网络、文件系统等资源的隔离。Docker 正是通过创建 6 种不同类型的 Namespace(PID、Network、Mount、UTS、IPC、User),让容器内的进程误以为自己运行在独立的系统中。例如,PID Namespace 使容器内的进程拥有独立的进程 ID 编号(容器内的 PID 1 对应宿主机的某个普通进程),Network Namespace 为容器分配独立的网络接口与端口空间。
但 Namespace 隔离存在天然缺陷:所有容器共享宿主机的内核,容器内的进程仍运行在宿主机的内核空间中。若内核存在漏洞,攻击者可通过内核态操作突破 Namespace 限制;同时,部分 Namespace 隔离并非完全严格,例如 User Namespace 若配置不当,容器内的 root 用户可能直接映射为宿主机的 root 用户。
(二)Cgroups:控制组限制
Cgroups(Control Groups)的核心作用是"限制资源使用",而非"隔离权限"。它通过对 CPU、内存、磁盘 I/O 等资源的配额控制,防止单个容器过度占用宿主机资源。但 Cgroups 不具备权限隔离能力,无法阻止容器内进程通过其他途径获取超越资源限制的权限。例如,即使限制了容器的 CPU 使用率,若容器拥有特权,仍可执行挂载宿主机磁盘等高危操作。
(三)Capabilities:权限精细化控制
Linux 内核的 Capabilities 机制将传统的"root 全权限"拆分为 37 种独立的权限单元(如 CAP_SYS_ADMIN 对应系统管理权限、CAP_NET_RAW 对应原始网络访问权限)。Docker 容器默认仅保留基础 Capabilities,禁用大部分高危权限,从而降低容器内 root 用户的风险。但如果管理员为容器添加了不必要的高危 Capabilities(如 CAP_SYS_ADMIN),容器内的进程将获得执行挂载、修改内核参数等操作的权限,为逃逸创造条件。
综上,Docker 的隔离机制本质是"内核级的逻辑隔离",而非虚拟机的"硬件级完全隔离"。当隔离机制存在缺陷、配置不当,或底层内核/运行时存在漏洞时,攻击者即可突破容器边界,实现逃逸。
二、Docker 逃逸的常见利用方式与原理
根据逃逸依赖的核心条件,可将 Docker 逃逸分为四大类:配置错误导致的逃逸、隔离机制缺陷导致的逃逸、内核漏洞导致的逃逸,以及容器运行时(Runtime)漏洞导致的逃逸。其中,配置错误类逃逸在实际环境中最为常见,而内核与运行时漏洞类逃逸则具有更强的隐蔽性与破坏性。
(一)配置错误导致的逃逸:最易触发的高危场景
这类逃逸并非依赖技术漏洞,而是源于管理员对 Docker 安全配置的忽视,导致隔离机制被直接绕过。常见的配置错误包括特权容器启动、敏感目录不当挂载、过度授予 Capabilities 权限等。
1. 特权容器(--privileged)逃逸
这是最典型的配置错误类逃逸场景。当使用 docker run --privileged 命令启动容器时,Docker 会为容器授予宿主机的几乎所有 Capabilities 权限,解除对设备文件的访问限制,使容器内的 root 用户等价于宿主机的 root 用户。
逃逸原理 :特权容器可直接访问宿主机的所有设备文件(如 /dev/sda1 宿主机根分区),通过挂载宿主机磁盘到容器内,即可突破文件系统隔离,直接修改宿主机文件。
利用步骤:
- 容器内执行
lsblk或fdisk -l命令,识别宿主机的根分区设备(通常为/dev/sda1或/dev/mapper/ubuntu--vg-ubuntu--lv); - 在容器内创建挂载目录:
mkdir -p /tmp/host_root; - 挂载宿主机根分区到该目录:
mount /dev/sda1 /tmp/host_root -o rw(-o rw确保可写权限); - 通过
chroot /tmp/host_root bash切换到宿主机的根文件系统,此时已完全逃逸,可直接访问宿主机的/root目录、修改/etc/passwd添加用户等。
2. Docker Socket 挂载逃逸
/var/run/docker.sock 是 Docker 守护进程(dockerd)的 Unix 域套接字,是 Docker 客户端与守护进程通信的核心接口。若管理员将该套接字以可写权限挂载到容器内(如 docker run -v /var/run/docker.sock:/var/run/docker.sock),攻击者可通过该套接字完全控制宿主机的 Docker 服务。
逃逸原理:Docker 守护进程以宿主机 root 权限运行,能访问该套接字的进程即可通过 Docker API 执行任意操作(如创建特权容器、挂载宿主机根目录)。
利用步骤:
- 容器内安装 Docker 客户端(如
apt install -y docker.io); - 通过套接字验证对宿主机 Docker 的控制权限:
docker -H unix:///var/run/docker.sock ps,若输出宿主机的容器列表则验证成功; - 利用宿主机 Docker 创建特权容器,并挂载宿主机根目录:
docker -H unix:///var/run/docker.sock run -it --privileged -v /:/host alpine chroot /host bash; - 直接进入宿主机根环境,完成逃逸。这种方式无需直接操作设备文件,隐蔽性更强,是实际渗透测试中最常用的逃逸手段之一。
3. 过度授予 Capabilities 权限逃逸
Docker 容器默认仅保留基础 Capabilities,但部分场景下管理员会为容器添加高危权限(如 --cap-add=SYS_ADMIN)。CAP_SYS_ADMIN 权限允许容器内进程执行系统管理操作(如挂载文件系统、修改内核参数),结合其他配置缺陷即可实现逃逸。
逃逸原理:CAP_SYS_ADMIN 权限突破了 Docker 的默认权限限制,使容器内进程可执行挂载宿主机 proc 文件系统、修改 Cgroups 配置等高危操作,进而突破 Namespace 隔离。
典型利用:Cgroups Release Agent 逃逸。Cgroups 的 Release Agent 是当 Cgroups 内进程全部退出时触发执行的脚本,若容器拥有 CAP_SYS_ADMIN 权限,攻击者可修改 Release Agent 路径为容器内的恶意脚本,当 Cgroups 触发释放时,宿主机将以 root 权限执行该脚本。
(二)隔离机制缺陷导致的逃逸:利用设计漏洞突破边界
这类逃逸依赖 Docker 隔离机制(Namespace、Cgroups)的设计缺陷或实现漏洞,即使配置正确,攻击者仍可通过特定技术手段绕过隔离。
1. PID Namespace 逃逸
PID Namespace 实现进程 ID 的隔离,但如果容器启动时未严格隔离 PID(如 --pid=host 参数),容器内将直接看到宿主机的所有进程。攻击者可通过向宿主机的 root 进程注入信号或代码,实现权限提升与逃逸。
逃逸原理 :--pid=host 参数使容器与宿主机共享同一个 PID Namespace,容器内的进程可直接与宿主机进程交互。若宿主机存在运行的 root 进程(如 systemd),攻击者可通过 ptrace 系统调用注入恶意代码,或利用进程崩溃触发核心转储执行恶意脚本。
2. OverlayFS 权限绕过逃逸
OverlayFS 是 Docker 最常用的存储驱动,通过"上层可写层+下层只读层"的叠加机制实现容器文件系统。CVE-2022-0492 漏洞就暴露了 OverlayFS 的设计缺陷:当容器内修改具有特殊权限的文件时,copy_up 机制(将下层只读文件复制到上层可写层的过程)存在权限绕过,导致攻击者可修改宿主机的文件系统。
逃逸原理:OverlayFS 的 copy_up 机制未正确验证文件权限,容器内的低权限进程可通过修改特定文件的属性,间接操控宿主机的底层文件系统,最终突破挂载隔离。
(三)Linux 内核漏洞导致的逃逸:突破内核级隔离
Docker 容器共享宿主机的内核,若宿主机内核存在未修复的高危漏洞(如权限绕过、缓冲区溢出、使用后释放等),攻击者可在容器内触发漏洞,获取内核态权限,进而突破所有用户态隔离机制。这类逃逸的危害最大,且不受 Docker 配置的限制。
1. 脏牛漏洞(CVE-2016-5195)逃逸
脏牛(Dirty COW)是 Linux 内核的经典权限绕过漏洞,影响 2.6.22 至 4.8.3 版本的内核。该漏洞源于内核的 Copy-On-Write(写时复制)机制存在竞争条件,攻击者可利用该漏洞修改宿主机的只读文件(如 /etc/passwd)。
逃逸原理 :容器内的普通用户进程可通过触发脏牛漏洞,绕过文件系统的只读限制,修改宿主机的 /etc/passwd 文件,添加具有 root 权限的恶意用户,进而登录宿主机获取权限。由于该漏洞直接作用于内核态,无论容器配置多么严格,只要宿主机内核未修复,即可实现逃逸。
2. Netfilter 漏洞(CVE-2022-2588)逃逸
CVE-2022-2588 是 Linux 内核 Netfilter 模块的使用后释放(UAF)漏洞,影响 5.4 至 5.16 版本的内核。Netfilter 是 Linux 内核的网络过滤框架,Docker 的网络隔离依赖该模块实现。
逃逸原理:攻击者可在容器内构造特殊的 Netfilter 规则,触发内核的 UAF 漏洞,执行任意内核态代码。通过内核态代码,攻击者可直接切换到宿主机的 Namespace,获取宿主机的 root 权限。这类内核漏洞逃逸的技术门槛较高,但破坏力极强,可突破所有用户态的隔离措施。
(四)容器运行时漏洞导致的逃逸:攻击核心组件
容器运行时(如 RunC、Containerd)是管理容器生命周期的核心组件,负责容器的创建、启动、停止等操作。若运行时存在漏洞,攻击者可通过容器内的操作篡改运行时逻辑,实现逃逸。
1. RunC 漏洞逃逸(CVE-2019-5736)
RunC 是 Docker、Kubernetes 等容器平台的默认运行时,CVE-2019-5736 漏洞暴露了 RunC 的严重安全缺陷:容器内的进程可通过 /proc/self/exe(指向宿主机的 runc 二进制文件)获取文件句柄,并修改 runc 程序。
逃逸原理 :当宿主机管理员执行 docker exec 等命令时,会调用 runc 程序进入容器。若容器内的 runc 二进制已被篡改,宿主机将执行恶意代码,导致攻击者获取宿主机的 root 权限。该漏洞的攻击链条简洁:容器内修改 runc → 诱使宿主机执行 runc → 触发恶意代码执行。
2. 2025 年 RunC 系列漏洞(CVE-2025-31133 等)
2025 年 11 月,SUSE 安全研究员披露了 RunC 的三个高危漏洞(CVE-2025-31133、CVE-2025-52565、CVE-2025-52881),均源于 RunC 在挂载操作与文件保护机制上的缺陷。
逃逸原理 :攻击者可通过符号链接操控、挂载验证不充分、共享挂载竞态条件等手段,绕过 RunC 的安全限制,向宿主机的关键系统文件(如 /proc/sys/kernel/core_pattern、/proc/sysrq-trigger)写入恶意数据。例如,CVE-2025-31133 可通过替换 /dev/null 为符号链接,诱使 RunC 挂载任意宿主机路径,进而修改核心配置文件触发逃逸。这类漏洞的攻击向量多为恶意容器镜像,启动时即可自动触发,隐蔽性极强。
三、小结
Docker 逃逸的本质是"突破 Linux 内核提供的逻辑隔离边界",其利用方式虽多样,但核心均围绕"权限滥用、机制缺陷、漏洞利用"三大逻辑展开。配置错误类逃逸因操作简单、场景普遍,成为实际环境中最主要的逃逸风险;而内核与运行时漏洞类逃逸则因隐蔽性强、破坏力大,需要重点防御。