【漏洞复现】Docker runC 容器逃逸漏洞(CVE-2019-5736)

news2025/2/24 23:32:51

文章目录

  • 声明
  • 一、漏洞描述
  • 二、漏洞原理
  • 三、漏洞分析
  • 四、POC分析
  • 五、利用方式
  • 六、影响版本
  • 七、环境搭建
  • 八、漏洞复现
  • 九、修复建议


声明

本篇文章仅用于技术研究和漏洞复现,切勿将文中涉及攻击手法用于非授权下渗透攻击行为,操作有风险,出现任何后果与本作者无关,谨慎操作!!!

重点看Tips提示

一、漏洞描述

2019年2月11日,runC的维护团队报告了一个新发现的漏洞,SUSE Linux GmbH高级软件工程师Aleksa Sarai公布了影响Docker, containerd, Podman, CRI-O等默认运行时容器runc的严重漏洞CVE-2019-5736。漏洞会对IT运行环境带来威胁,漏洞利用会触发容器逃逸、影响整个容器主机的安全,最终导致运行在该主机上的其他容器被入侵。漏洞影响AWS, Google Cloud等主流云平台。日前,该容器逃逸漏洞的PoC利用代码已在GitHub上公布。这是CVE-2019-5736漏洞利用的Go语言实现。漏洞利用是通过覆写和执行主机系统runc二进制文件完成的。


二、漏洞原理

漏洞点在于runC,runC是一个容器运行时,最初是作为Docker的一部分开发的,后来作为一个单独的开源工具和库被提取出来。作为 “低级别” 容器运行时,runC主要由 “高级别” 容器运行时(例如Docker)用于生成和运行容器,尽管它可以用作独立工具。像Docker这样的 “高级别” 容器运行时通常会实现镜像创建和管理等功能,并且可以使用runC来处理与运行容器相关的任务:创建容器、将进程附加到现有容器等。在Docker18.09.2之前的版本中使用的runC版本小于1.0-rc6,因此允许攻击者重写宿主机上的runC二进制文件,攻击者可以在宿主机上以root身份执行任意命令。


三、漏洞分析

  • runC
    runC是docker中最为核心的部分,容器的创建、运行、销毁等操作都是通过runC程序来完成的。我们来看一下runC文件,如下所示:
    在这里插入图片描述
    当我们运行docker run等命令的时候实际上在底层调用的是runC程序,所以整个流程大概如下:
    在这里插入图片描述
    其中虚线位置表示,当runC生成一个子进程后runC程序将会结束占用。
    当触发POC后,runC程序会被重写并执行:
    在这里插入图片描述

  • /proc/

    根据官方文档,/proc/文件夹类似于一个文件系统,其中存放着各个进程与本地文件之间的映射,其中:

    /proc/[PID]/exe: 一种特殊的软连接,是该进程自身对应的本地文件

    /proc/[PID]/fd/: 这个目录下存放了该进程打开的所有文件描述符

    /proc/self/: 不同的进程访问该目录时获得的信息是不同的,内容等价于/proc/本进程pid/

    /proc/[PID]/exe的特殊之处在于当权限通过的情况下打开这个文件,内核将会之间返回一个指向该文件的文件描述符,并非按照传统的打开方式做路径分析和文件查找,这就会导致绕过了mnt命名空间和chroot的限制。

    当执行docker exec命令的时候,runc启动并加入到容器的命名空间中去,其实这个时候,容器内的进程已经能够通过内部的/proc/观察到它,因此通过打开/proc/[runc-PID]/exe可以获取宿主机上的runc文件标识符,由此能够达到覆盖的能力。

四、POC分析

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

  • #!

    在unix中,凡是被#!注释的,统统是加载器的路径,常见的有#!/bin/sh,表示将该注释后的代码交给/bin/sh处理,我们常见的处理python脚本一般在bash中输入python run.py,而如果在run.py中将注释换成#!/path/to/python,则在bash中执行run.py即可。

    在此poc中,作者将/bin/sh进行了覆盖,修改成了#!/proc/self/exe,意义在于当宿主机执行docker exec -it ID /bin/sh时,/bin/sh将会替换成执行调用者自己,也就是宿主机下的runc文件,此时将会执行runc文件。

  • 两个for循环

    在第一个for循环中,攻击者持续监测/proc/目录,当产生runc进程时,以可读的方式打开runc文件夹获取文件标识符。

    在第二个for循环中,攻击者持续监听等待runc程序结束占用后就能够用之前循环获得的文件标识符以可写的方式向runc文件内写入payload。

攻击链流程图
在这里插入图片描述

五、利用方式

宿主机利用攻击者提供的image来创建一个新的container,拥有container root权限,并且该container后续被docker exec attach。一句话描述,docker 18.09.2之前的runC存在漏洞,攻击者可以修改runC的二进制文件导致提权。

六、影响版本

  • Docker Version <=18.09.2
  • runC Version <=1.0-rc6

七、环境搭建

下载地址:前往下载
在这里插入图片描述
添加更新源到 /etc/apt/source.list文件中
Sudo apt-get update ##更新apt软件包索引
在这里插入图片描述
Sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common ##安装软件包,以允许apt通过HTTPS使用镜像仓库。
在这里插入图片描述
Curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add – ##添加Docker的官方GPG密钥
在这里插入图片描述
Sudo apt-key fingerprint 0EBFCD88 ## 验证密钥指纹是否为 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
在这里插入图片描述
Sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” ##设置稳定存储库,直接写入到/etc/apt/source.list文件中。

Sudo apt-get update ##再次更新apt软件包索引,可以看出新增docker镜像仓库。
在这里插入图片描述
到这里环境均已准备完毕!!!

八、漏洞复现

Tips:建议提前拍好快照,漏洞复现完成之后可能会造成docker无法使用

卸载已经安装的docker
sudo apt-get remove docker docker-engine docker-ce docker.io
列出docker可用版本
apt-cache madison docker-ce
在这里插入图片描述
以下列表中选择低于18.09.2版本进行安装
Sudo apt-get install docker-ce=18.06.1-ce-3-0-ubuntu
在这里插入图片描述
启动docker并查看docker和runc版本(均在漏洞影响范围内)
在这里插入图片描述
下载CVE-2019-5736漏洞POC
git clone https://github.com/Frichetten/CVE-2019-5736-PoC.git
在这里插入图片描述
修改payload内容
在这里插入图片描述
此时编译payload需要go环境,直接安装即可,生成可执行脚本main
在这里插入图片描述
编译完成后,我们运行一个漏洞环境(以CVE-2020-1957漏洞为例)

这里需要注意一下,安装完docker-ce之后,docker-compose是默认没有的,直接使用apt-get install docker-compose 或 pip install docker-compose命令可能会出现错误(尝试安装),解决方法就是下载一个docker-compose来进行安装,命令如下:

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.6.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose //下载docker-compose 版本为2.6.1 并添加到 /usr/local/bin目录下
sudo chmod +x /usr/local/bin/docker-compose //赋予docker-compose执行权限
docker-compose -v //查看版本

##以上命令需要root权限执行!!!

启动环境
在这里插入图片描述
执行以下命令将生成的main脚本cp到docker容器中(这就是模拟攻击者获取了docker容器权限,在容器中上传payload进行docker逃逸)

docker cp /home/szg/CVE-2019-5736-PoC/main 3d5341ae0bf5:/home

执行如下命令,进入容器,查看脚本是否拷进容器并启动main脚本

docker exec -it 3d5341ae0bf5 /bin/sh (第一次需使用/bin/sh启动)

在这里插入图片描述
KALI启动监听
在这里插入图片描述
ubuntu启动一个新终端,执行如下命令再次进入容器,触发payload,成功反弹shell,此时权限为服务器权限,docker逃逸成功。
在这里插入图片描述
在这里插入图片描述

九、修复建议

更新容器至 18.09.2版本以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识mysql

文章目录为什么要学习数据库什么是数据库数据库的分类MySQL简介连接数据库为什么要学习数据库 ①岗位需求 ②现在的世界&#xff0c;大数据时代&#xff0c;得数据者得天下 ③被迫需求&#xff1a;存数据 ④数据库是所有软件体系中最核心的存在 什么是数据库 数据库&…

java设计模式(2):UML图

统一建模语言&#xff08;Unified Modeling Language&#xff0c;UML&#xff09;是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。 UML 从目标系统的不同角度出发&#xff0c;定义了用例图、类图、对象图、状态图、活动图…

kerberos环境下Flink on Yarn集群部署 基于flink1.15.3 hadoop 3.0CDH6.3.2

1.1 概要介绍 Flink on Yarn的HA高可用模式&#xff0c;首先依赖于Yarn自身的高可用机制&#xff08;ResourceManager高可用&#xff09;&#xff0c;并通过Yarn对JobManager进行管理&#xff0c;当JobManager失效时&#xff0c;Yarn将重新启动JobManager。其次Flink Job在恢复…

微服务框架 SpringCloud微服务架构 29 ES 集群 29.2 搭建集群

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构29 ES 集群29.2 搭建集群29.2.1 搭建ES 集群29 ES 集群 29.2 搭建集群 2…

kubernets 实践

文章目录kubernets 部署v1.25.5flink on k8sflink version 1.14.6kubernets 部署 v1.25.5 这里我选择的是kubeadm方式部署 虚拟机数量&#xff1a;4 centos发行版本&#xff1a;CentOS Linux release 7.9.2009 (Core) 内核版本&#xff1a;Linux hadoop101 5.4.225-1.el7.el…

简单又好用的5款小工具软件

人类与99%的动物之间最大差别在于是否会运用工具&#xff0c;借助好的工具&#xff0c;能提升几倍的工作效率。 1.软件卸载删除——UninstallTools UninstallTool 是一个小巧、安全、快速、强大的软件卸载删除工具&#xff0c;它支持在使用软件本身的卸载程序卸载完毕后&…

CMake中set_target_properties/get_target_property的使用

CMake中的set_target_properties命令用于为targets设置属性(targets can have properties that affect how they are built)&#xff0c;其格式如下&#xff1a; set_target_properties(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...) 该命令的语法是列出要更改…

浅析安科瑞无线测温装置在香港科技大学配电系统中的设计应用

摘要&#xff1a; 随着变电站自动化技术的推广和应用&#xff0c;无人值班的变电站越来越多&#xff0c;变电站的高压开关柜采用全密封结构&#xff0c;在长期运行过程中&#xff0c;开关的触点和母线连接等部位因老化或接触电阻过大而发热&#xff0c;由于这些发热部位的温度…

四种基于MQ的分布式事务解决方案

在微服务的时代&#xff0c;分布式事务是绕不开的话题&#xff0c;尽管在大多数场景下&#xff0c;我们并不需要使用分布式事务&#xff0c;但是 不需要使用 不代表 可以不会使用&#xff0c;万一哪天真需要用到了呢&#xff1f;分布式事务是一个比较大的话题&#xff0c;今天我…

1426827-79-3,endo-BCN-NHS ester,endo-BCN-NHS 活性酯

endo-BCN-NHS ester试剂反应原理&#xff1a; BCN基团与叠氮化物标记的生物分子反应&#xff0c;NHS酯可用于标记蛋白质的伯胺&#xff08;-NH2&#xff09;、胺修饰的寡核苷酸和其他含胺分子&#xff0c;西安凯新生物科技有限公司下面为大家整理分享。​endo-BCN-NHS ester物理…

Python学习基础笔记三十二——正则表达式

官方定义&#xff1a;正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特殊字符、及这些特定字符的组合&#xff0c;组成一个“规则字符串”&#xff0c;这个规则字符串用来表达对字符串的一种过滤逻辑。 1、在Linux运维中&#xff0c;vi、grep、awk…

fiddler使用的作用与常见应用场景

Fiddler工具的工作原理 1.本地应用与服务器之间所有的Request 和Response都将经过Fiddler&#xff0c;由Fiddler进行转发&#xff0c;此时Fiddler以代理服务器的方式存在。 2.由于所有的网络数据都会经过Fiddler&#xff0c;因此Fiddler能够截获这些数据&#xff0c;实现网络…

美团四面 Java 岗,终获 offer,我是这么回答面试官的

前言 经历了 10 月的疫情挣扎与 11 月失业的煎熬&#xff0c;终于来到了春末的 12 月&#xff0c;内心的压力也稍稍的松懈了一些&#xff0c;终于可以放心找个工作了&#xff0c;可是随着的等待面试的机会的越来越少&#xff0c;这份焦虑反而越来越大&#xff0c;也偶尔会想&a…

稳定性建设之JavaScript代码不能被阻断

稳定性建设之JavaScript代码不能被阻断 背景 js代码可能会因为某些原因&#xff0c;导致出错&#xff0c;进而整个后续代码有可能都被阻断。直接影响线上的稳定性 最常见的js被阻断的情况 console.log(111) // 预期 a {} // 结果 a undefined a.a 1 console.log(222) // …

Pycharm的简单介绍以及api的使用

一、什么是Pycharm&#xff1f; Pycharm是一种python IDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、脚本控制。此外&#xff0c;该IDE提供了一些高级功…

MyBatis-Plus中自动填充功能的用法

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus之ActiveRecord[基础增删改查操作]_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询&#xff08;快速上…

【JavaWeb开发-Servlet】day06-学生成绩管理系统-实现分页功能

目录 一、前端设计 二、分页功能 ①创建实体层 ②在DAO层新建两个方法 ③编写业务层 ④实现Servlet层 ⑤修改前端页面 ⑥测试 ⑦思路 ⑧扩展 一、前端设计 原来的前端非常简陋&#xff0c;没有明显的突出其功能&#xff0c;下面将对前端页面进行新的完善。 写一个标题…

HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺

小编今天和大家一起来学习HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺相关研究内容! 光克洛&#xff0c;第二代的光敏剂&#xff0c;可用于光动力疗法 (PDT)&#xff0c;基本结构为二氢卟吩类化合物。美国研究人员从绿色植物中提取、纯化&…

nginx笔记

作者&#xff1a;ThinkStu 文章目录一、简介二、常用配置1、listen2、server_name3、location4、sendfile5、nodelay/push6、add_header7、set 变量8、if9、return10、keepalive三、常用操作1、Gzip压缩2、正则表达式3、rewrite重写4、rewrite范例5、跨域6、防盗链7、适配移动设…

R语言数据可视化分析案例:探索BRFSS数据

最近我们被客户要求撰写关于BRFSS数据的研究报告&#xff0c;包括一些图形和统计输出。 加载包 library(tidyr) library(knitr) opts_chunk$set(echo TRUE, fig.align "center") 载入资料 load("brfss2013.RData")第1部分&#xff1a;数据 描述如何收…