防范Bind Mount被滥用的关键是切断特权容器利用路径,需组合使用noexec、nosuid、nodev挂载选项,并禁用--privileged与SYS_ADMIN能力,强制非root用户运行且匹配UID。
bind mount 本身不能启用特权模式,但若容器以 --privileged 或 --cap-add=sys_admin 启动,攻击者可利用 bind mount 配合内核接口修改宿主机,比如挂载 /proc、/sys 或设备文件系统。防范关键不是“在 bind mount 里加参数阻止特权”,而是**切断特权容器滥用 bind mount 的路径**——通过挂载选项从源头限制其能操作的范围和行为。
禁用危险能力的挂载选项必须组合使用
对所有非系统级 bind mount(尤其是映射到容器内 /tmp、/var/tmp、/mnt、/data 等目录),强制添加以下三项:
-
noexec:阻止在该挂载点运行任何二进制、脚本或解释器,即使容器有
SYS_ADMIN也无法执行提权 payload -
nosuid:忽略 SUID/SGID 位,防止借
/bin/mount、/usr/bin/newgrp等程序绕过权限检查 -
nodev:禁止识别设备节点,避免通过
mknod创建/dev/kmem或/dev/fuse进行内核内存读写或文件系统劫持
示例(宿主机执行):sudo mount --bind -o ro,noexec,nosuid,nodev /host/data /container/data
注意:ro(只读)应作为默认项启用,除非业务明确需要写入。
隔离敏感路径,避免 bind mount 成为跳板
特权容器最常利用 bind mount 覆盖关键系统路径(如 /proc/sys、/sys/fs/cgroup)。必须确保:
- 不将宿主机
/proc、/sys、/dev、/etc等目录 bind 到容器内——这是硬性红线 - 若需部分暴露(如只读共享配置),用
mount --bind+remount,ro,noexec,nosuid,nodev二次加固 - 对容器内挂载点所在父目录(如
/container)设置chown root:root且chmod 755,防止容器内用户创建子挂载点
用挂载传播控制(mount propagation)堵住逃逸链
默认 bind mount 是 rprivate,但若容器获得 SYS_ADMIN,可调用 mount --make-shared 反向影响宿主机挂载树。应在宿主机侧显式设为 rslave 或 rprivate:
- 挂载时指定:
sudo mount --bind -o rslave /host/path /container/path - 或 remount 锁定:
sudo mount --make-rslave /container/path - 验证:
findmnt -o TARGET,PROPAGATION /container/path,输出应为rslave或rprivate,不可是shared
配合用户与能力最小化,让 bind mount 失去攻击上下文
即使挂载参数到位,若容器以 root 运行并拥有 SYS_ADMIN,仍可能绕过部分限制。必须同步收紧运行时身份:
- 禁用
--privileged,改用精确授权:--cap-drop=ALL --cap-add=NET_BIND_SERVICE等按需添加 - 强制指定非 root 用户:
--user 1001:1001,并确保宿主机挂载源目录属主匹配该 UID - 启用用户命名空间重映射:
"userns-remap": "default"写入/etc/docker/daemon.json,使容器内 root 映射为宿主机普通用户


















