什么是容器逃逸?
·
什么是容器逃逸?
容器逃逸是指攻击者或恶意代码突破容器隔离限制,获取宿主机操作系统权限或访问其他容器资源的行为。简单来说,就像是“监狱里的囚犯打破了牢房,进入了监狱管理系统中心”。
核心比喻:
想象一栋公寓楼(宿主机),每个公寓(容器)都有独立空间和资源。容器逃逸就像是:
-
一个住户(容器内进程)破坏了公寓的墙壁/管道(隔离机制)
-
成功进入了整栋楼的管理中心(宿主机内核)
-
甚至能进入其他住户的房间(其他容器)
为什么会发生容器逃逸?
1. 隔离机制存在缺陷
-
Linux命名空间(Namespace)隔离不彻底
-
控制组(Cgroup)资源限制被绕过
-
内核漏洞(如Dirty Cow、CVE-2021-22555等)
2. 配置不当
-
容器以
--privileged(特权模式)运行 -
挂载敏感目录:
docker run -v /:/host ... -
授予不必要的Linux Capabilities
3. 攻击路径示例
# 典型攻击场景: 1. 攻击者入侵Web应用容器(如通过SQL注入) 2. 在容器内发现挂载的Docker Socket文件(/var/run/docker.sock) 3. 通过该Socket直接控制宿主机Docker守护进程 4. 创建新容器挂载宿主机根目录,获得完全控制权
常见逃逸技术分类
1. 基于配置错误的逃逸
| 类型 | 示例 | 防护方案 |
|---|---|---|
| 特权容器 | docker run --privileged | 避免特权模式运行 |
| 敏感挂载 | 挂载Docker Socket、/proc、/dev | 最小化挂载目录 |
| Capabilities过多 | 授予CAP_SYS_ADMIN等 | 遵循最小权限原则 |
2. 基于内核漏洞的逃逸
-
脏牛漏洞(CVE-2016-5195):利用竞争条件提权
-
CVE-2022-0185:通过unshare逃逸
-
通常需要容器内具有
CAP_SYS_ADMIN能力
3. 基于容器组件的逃逸
-
攻击runc(CVE-2019-5736):覆盖宿主机runc二进制文件
-
攻击containerd(CVE-2020-15257):通过host网络连接控制containerd
4. 其他攻击面
-
共享命名空间逃逸:
--net=host共享网络命名空间 -
恶意镜像:镜像中预置后门
-
资源限制绕过:通过DoS攻击影响其他容器
实际案例演示(仅用于学习)
案例1:通过挂载Docker Socket逃逸
# 错误配置示例 docker run -v /var/run/docker.sock:/var/run/docker.sock alpine # 容器内攻击步骤 # 1. 安装Docker客户端 yum install docker -y # 2. 通过Socket控制宿主机Docker docker -H unix:///var/run/docker.sock run -v /:/host alpine chroot /host sh
案例2:特权容器逃逸
docker run --privileged --pid=host alpine # 在容器内: nsenter --mount=/proc/1/ns/mnt sh # 进入宿主机挂载命名空间
如何检测容器逃逸?
监控指标
-
容器内执行宿主机命令(如
kubectl、docker) -
容器访问
/etc/shadow、/root/.ssh等宿主机文件 -
异常进程树:容器内进程的父进程是宿主机进程
-
网络连接:容器直接连接宿主机服务端口
检测工具
# 开源安全工具 - Falco:运行时安全监控 - Tracee:eBPF驱动的安全检测 - Kube-hunter:K8s集群安全扫描
更多推荐
所有评论(0)