容器逃逸攻击向量
容器逃逸是严重安全威胁,下面分析常见攻击路径与防御策略。
特权容器逃逸
攻击原理
Bash
# 特权容器可访问宿主设备
docker run --rm --privileged my-app
# 挂载宿主根文件系统
docker run --rm --privileged -v /:/host my-app
cat /host/etc/shadow
防御
Bash
# 禁用特权
docker run --rm --privileged=false my-app
# 移除所有 capabilities
docker run --rm --cap-drop ALL my-app
# 仅添加需要的
docker run --rm --cap-drop ALL --cap-add NET_BIND_SERVICE my-app
Docker Socket 逃逸
攻击原理
Bash
# 挂载 Docker Socket
docker run -v /var/run/docker.sock:/var/run/docker.sock my-app
# 控制宿主 Docker Daemon
docker exec my-app docker ps
docker exec my-app docker run -v /:/host ubuntu chroot /host cat /etc/shadow
防御
Bash
# 不挂载 Docker Socket
docker run my-app
# 使用 TCP Socket(远程访问)
dockerd -H tcp://0.0.0.0:2375 # 不推荐,无认证
内核漏洞逃逸
攻击原理
Bash
容器共享宿主内核 → 内核漏洞可逃逸到宿主
示例:
CVE-2022-0847 (Dirty Pipe)
- 利用内核管道漏洞
- 容器内提权到宿主 root
防御
Bash
# 及时升级内核
sudo apt-get update
sudo apt-get install linux-generic
# 使用 USER Namespace
docker run --userns=host # 默认
docker run --userns=keep-id # 隔离 UID
数据卷逃逸
攻击原理
Bash
# 挂载敏感目录
docker run -v /etc:/host/etc my-app
# 修改宿主配置
docker exec my-app echo "backdoor" >> /host/etc/passwd
防御
Bash
# 仅挂载必要目录
docker run -v /app/data:/data my-app
# 只读挂载
docker run -v /app/config:/config:ro my-app
Seccomp/AppArmor 逃逸
攻击原理
Bash
# 禁用 Seccomp
docker run --security-opt seccomp=unconfined my-app
# 禁用 AppArmor
docker run --security-opt apparmor=unconfined my-app
防御
text
# 启用 Seccomp
docker run --security-opt seccomp=default my-app
# 启用 AppArmor
docker run --security-opt apparmor=docker-default my-app
安全加固清单
- [ ] 禁用
--privileged - [ ] 不挂载 Docker Socket
- [ ] 使用非 root 用户运行
- [ ] 启用 Seccomp/AppArmor
- [ ] 只读根文件系统
- [ ] 限制 capabilities
- [ ] 限制进程数 (
--pids-limit) - [ ] 及时升级内核
- [ ] 最小化镜像(Alpine/Distroless)
要点总结
- 特权容器可访问宿主设备,是最危险的逃逸路径
- Docker Socket 挂载可完全控制宿主 Docker
- 内核漏洞利用共享内核逃逸,需及时升级
- 数据卷挂载不当可修改宿主配置
- 防御策略:最小权限、启用 Seccomp/AppArmor、非 root 运行
📝 发现内容有误?点击此处直接编辑