什么是容器逃逸?

容器逃逸是指攻击者或恶意代码突破容器隔离限制,获取宿主机操作系统权限或访问其他容器资源的行为。简单来说,就像是“监狱里的囚犯打破了牢房,进入了监狱管理系统中心”。

核心比喻:

想象一栋公寓楼(宿主机),每个公寓(容器)都有独立空间和资源。容器逃逸就像是:

  1. 一个住户(容器内进程)破坏了公寓的墙壁/管道(隔离机制)

  2. 成功进入了整栋楼的管理中心(宿主机内核)

  3. 甚至能进入其他住户的房间(其他容器)

为什么会发生容器逃逸?

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  # 进入宿主机挂载命名空间

如何检测容器逃逸?

监控指标

  • 容器内执行宿主机命令(如kubectldocker

  • 容器访问/etc/shadow/root/.ssh等宿主机文件

  • 异常进程树:容器内进程的父进程是宿主机进程

  • 网络连接:容器直接连接宿主机服务端口

检测工具

# 开源安全工具
- Falco:运行时安全监控
- Tracee:eBPF驱动的安全检测
- Kube-hunter:K8s集群安全扫描

 

更多推荐