cve-2021-30465本质是runc在rootfs挂载阶段对符号链接“信任式解析”缺陷,因preparerootfs()遍历mounts时默认跟随symlink,导致攻击者通过竞争条件将宿主机目录挂载进容器实现逃逸。
在 bind mount 架构中防范容器逃逸导致宿主机被篡改,核心不是“堵住所有挂载”,而是控制挂载行为本身是否可被恶意复用。bind mount 本身是合法机制,但一旦与符号链接、权限提升或运行时缺陷叠加,就会成为逃逸跳板——比如 cve-2021-30465 就专攻 runc 对 未解引用符号链接 的错误处理。
严格限制挂载目标路径的可写性与解析深度
Bind Mount 若指向一个容器内可控的路径(如 /tmp/mount),而该路径下存在符号链接(如 ln -sf /etc /tmp/mount/host-etc),runc 在 mount --bind 阶段可能直接将宿主机 /etc 解析为实际挂载源。防御关键在于切断这种“动态路径解析”链:
- 避免在容器内创建或接收用户可控的挂载点目录,尤其禁用临时目录(/tmp、/var/tmp)作为 bind mount 目标
- 对宿主机侧挂载源路径做静态校验:使用 realpath -m 确保其不包含符号链接,且最终路径在白名单范围内(如仅允许 /opt/config、/data/shared)
- 在容器启动前,用脚本扫描挂载源目录是否存在 dangling symlink:find /host/config -type l ! -exec test -e {} \; -print
启用只读挂载 + 用户命名空间映射
即使攻击者获得容器内 root 权限,也无法通过 bind mount 覆盖宿主机文件,前提是挂载本身不可写、且 UID 映射隔离生效:
- 所有 bind mount 默认加 :ro 后缀,例如 -v /host/logs:/app/logs:ro;确需写入时,单独授权最小目录并配 umask 或 chown 初始化
- 启用 Docker 的 user namespace remap(--userns-remap=default),使容器内 UID 0 映射为宿主机上无特权的 UID(如 100000+),即便挂载了 /host/etc,也无法修改其属主或权限位
- 配合 --read-only 启动容器,再用 --tmpfs 单独放开必要可写路径(如 /run、/tmp),从文件系统层阻断持久化篡改
运行时层加固:升级 + 能力裁剪 + 挂载白名单
Bind Mount 的风险最终由 runc 执行,因此运行时配置比容器参数更底层有效:
- 升级 runc 至 ≥ 1.0.0-rc93,彻底修复符号链接挂载解析缺陷;检查方式:runc --version
- 在 containerd 或 Docker daemon 配置中启用 default_runtime → runc + seccomp profile,禁止 mount、openat、chroot 等高危系统调用
- 使用 OCI runtime hook(如 oci-seccomp-bpf-hook)在容器启动前拦截含符号链接的 mounts 字段,直接拒绝启动











