要更好的理解容器逃逸的手法,应该知道本质上容器内的进程只是一个受限的普通 Linux 进程,容器内部进程的所有行为对于宿主机来说是透明的,这也是众多容器 EDR 产品可以直接在主机或 SideCar 内做容器运行时安全的基础之一。
我们可以很容易在宿主机用 ps 看到容器进程信息:
所以,容器逃逸的本质和硬件虚拟化逃逸的本质有很大的不同 (不包含 Kata Containers 等),我的理解里容器逃逸的过程是一个受限进程获取未受限的完整权限,又或某个原本受 Cgroup/Namespace 限制权限的进程获取更多权限的操作,更趋近于提权。
而在对抗上,不建议将逃逸的行为当成可以写入宿主机特定文件 (如 /etc/cron*, /root/.ssh/authorized_keys 等文件) 的行为,应该根据目标选择更趋近与业务行为的手法,容器逃逸的利用手段会比大部分情况下的命令执行漏洞利用要灵活。
以目标 “获取宿主机上的配置文件” 为例,以下几种逃逸手法在容易在防御团队中暴露的概率从大到小,排序如下(部分典型手法举例,不同的 EDR 情况不同):
mount /etc + write crontab
mount /root/.ssh + write authorized_keys
old CVE/vulnerability exploit
write cgroup notify_on_release
write procfs core_pattern
volumeMounts: / + chroot
remount and rewrite cgroup
create ptrace cap container
websocket/sock shell + volumeMounts: /path
我们来一一看一下利用场景和方法: