docker逃逸漏洞复现(CVE-2019-5736)
字数 896 2025-08-15 21:33:02

Docker逃逸漏洞CVE-2019-5736复现与分析

漏洞概述

CVE-2019-5736是2019年2月11日由runC维护团队报告的一个严重漏洞,由SUSE Linux GmbH高级软件工程师Aleksa Sarai发现。该漏洞影响Docker、containerd、Podman、CRI-O等使用runc作为默认运行时的容器平台,对AWS、Google Cloud等主流云平台也造成威胁。

漏洞影响

  • 影响范围:允许攻击者通过特定容器镜像或exec操作获取宿主机runC执行时的文件句柄
  • 危害:可修改runc二进制文件,获取宿主机root权限,实现容器逃逸
  • 受影响版本
    • Docker version ≤ 18.09.2
    • RunC version ≤ 1.0-rc6

漏洞原理

runC是一个低级别容器运行时,最初作为Docker的一部分开发,后被提取为独立工具。高级别容器运行时(如Docker)使用runC处理容器运行相关任务。漏洞存在于runC中,允许攻击者重写宿主机上的runc二进制文件,从而以root身份在宿主机上执行任意命令。

环境准备

1. 卸载现有Docker

sudo apt-get remove docker docker-engine docker-ce docker.io

2. 安装前准备

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-get update

3. 安装指定漏洞版本

# 列出可用版本
apt-cache madison docker-ce

# 安装指定版本(示例)
sudo apt-get install docker-ce=18.06.1~ce~3-0~ubuntu

# 验证安装
sudo systemctl start docker
docker info

漏洞复现

1. 生成Payload

从GitHub获取PoC代码:

https://github.com/Frichetten/CVE-2019-5736-PoC

修改go脚本中的命令为反弹shell命令,设置nc监听地址。

编译生成payload(需要go环境):

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

注意:建议在复现前打快照,漏洞复现会导致docker无法使用。

2. 实施攻击

  1. 将payload拷贝到docker容器中(模拟攻击者已获取容器权限)
  2. 在容器中执行payload
  3. 等待受害者启动docker容器(管理员操作会触发payload)
  4. 攻击者开启nc监听
  5. 当受害者启动docker容器时,触发payload反弹shell

修复方案

升级Docker到最新版本,确保runc版本高于1.0-rc6。

总结

CVE-2019-5736是一个严重的容器逃逸漏洞,允许攻击者从容器内获取宿主机root权限。通过理解其原理和复现过程,可以更好地认识容器安全风险,并采取适当防护措施。

Docker逃逸漏洞CVE-2019-5736复现与分析 漏洞概述 CVE-2019-5736是2019年2月11日由runC维护团队报告的一个严重漏洞,由SUSE Linux GmbH高级软件工程师Aleksa Sarai发现。该漏洞影响Docker、containerd、Podman、CRI-O等使用runc作为默认运行时的容器平台,对AWS、Google Cloud等主流云平台也造成威胁。 漏洞影响 影响范围 :允许攻击者通过特定容器镜像或exec操作获取宿主机runC执行时的文件句柄 危害 :可修改runc二进制文件,获取宿主机root权限,实现容器逃逸 受影响版本 : Docker version ≤ 18.09.2 RunC version ≤ 1.0-rc6 漏洞原理 runC是一个低级别容器运行时,最初作为Docker的一部分开发,后被提取为独立工具。高级别容器运行时(如Docker)使用runC处理容器运行相关任务。漏洞存在于runC中,允许攻击者重写宿主机上的runc二进制文件,从而以root身份在宿主机上执行任意命令。 环境准备 1. 卸载现有Docker 2. 安装前准备 3. 安装指定漏洞版本 漏洞复现 1. 生成Payload 从GitHub获取PoC代码: 修改go脚本中的命令为反弹shell命令,设置nc监听地址。 编译生成payload(需要go环境): 注意 :建议在复现前打快照,漏洞复现会导致docker无法使用。 2. 实施攻击 将payload拷贝到docker容器中(模拟攻击者已获取容器权限) 在容器中执行payload 等待受害者启动docker容器(管理员操作会触发payload) 攻击者开启nc监听 当受害者启动docker容器时,触发payload反弹shell 修复方案 升级Docker到最新版本,确保runc版本高于1.0-rc6。 总结 CVE-2019-5736是一个严重的容器逃逸漏洞,允许攻击者从容器内获取宿主机root权限。通过理解其原理和复现过程,可以更好地认识容器安全风险,并采取适当防护措施。