要更好的理解容器逃逸的手法,应该知道本质上容器内的进程只是一个受限的普通 Linux 进程,容器内部进程的所有行为对于宿主机来说是透明的,这也是众多容器 EDR 产品可以直接在主机或 SideCar 内做容器运行时安全的基础之一。

我们可以很容易在宿主机用 ps 看到容器进程信息:

图片
所以,容器逃逸的本质和硬件虚拟化逃逸的本质有很大的不同 (不包含 Kata Containers 等),我的理解里容器逃逸的过程是一个受限进程获取未受限的完整权限,又或某个原本受 Cgroup/Namespace 限制权限的进程获取更多权限的操作,更趋近于提权。

而在对抗上,不建议将逃逸的行为当成可以写入宿主机特定文件 (如 /etc/cron*, /root/.ssh/authorized_keys 等文件) 的行为,应该根据目标选择更趋近与业务行为的手法,容器逃逸的利用手段会比大部分情况下的命令执行漏洞利用要灵活。

以目标 “获取宿主机上的配置文件” 为例,以下几种逃逸手法在容易在防御团队中暴露的概率从大到小,排序如下(部分典型手法举例,不同的 EDR 情况不同):

  1. mount /etc + write crontab

  2. mount /root/.ssh + write authorized_keys

  3. old CVE/vulnerability exploit

  4. write cgroup notify_on_release

  5. write procfs core_pattern

  6. volumeMounts: / + chroot

  7. remount and rewrite cgroup

  8. create ptrace cap container

  9. websocket/sock shell + volumeMounts: /path

我们来一一看一下利用场景和方法:

最后编辑: kuteng  文档更新时间: 2022-06-01 16:15   作者:kuteng