docker 恶意镜像到容器逃逸影响本机
转载:http://521.li/post/122.html
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二进制文件完成的。
工作原理
本PoC共有漏洞利用的两个用例。
第一个是一个trap。攻击者需要获取容器中的命令执行,并监听一个恶意二进制文件。如果有攻击者或受害者使用docker exec进入容器,就会触发漏洞利用,恶意代码就可以以root权限运行。

第二个创建了一个恶意Docker镜像。如果该恶意镜像运行就会触发漏洞利用。
漏洞的利用需要在容器内获取root(uid 0)权限。
详细解释
如果目标二进制文件是/bin/bash,就会被指定路径为#!/proc/self/exe (/proc/self/exec是kernel为每个进程创建的符号链接,指向该进程执行的热禁止文件) 的进程取代。当容器中执行/bin/bash时,执行runc二进制文件的/proc/self/exe就会被执行。
研究人员用执行启动Docker exec进程的二进制文件的#!/proc/self/exe来覆写了容器中的 /bin/sh。

这样攻击者就可以进一步写入目标/proc/self/exe并尝试运行runc二进制文件。但一般来说这样并不能成功,因为当runC运行时kernel是不允许它被覆写的。因此攻击者打开了一个使用O_PATH flag的/proc/self/exe的文件描述器,然后通过/proc/self/fd/以O_WRONLY的形式重新打开二进制文件,并尝试从一个单独进程的写循环来写入。
注释:上面的部分内容并不是完全准确的。比如在获取runcinit的文件描述器时并不一定需要使用O_PATH flag。而且也不需要在另一个进程中创建写循环。获取/proc/PID/exe的file handle也可以获取runcinit的文件描述器。然后使用handle来获取/proc/self/fd/FILEDESCRIPTOR的file handle。下面是研究人员使用的file handle:

最后当runc运行时就可以PoC就可以成功转型。然后runc二进制文件就被入侵了,可以被用于攻击其他容器或主机本身。
如果可以写入该file handle,那么就可以覆写主机上的runc二进制文件。就可以以root权限运行任意命令了。
恶意Docker镜像示例
研究人员认为恶意Docker镜像是一个非常危险的场景。只要运行恶意容器镜像就可以以root权限运行代码。详细解释参见https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html。

Docker发布了v18.09.2 版本来解决这一问题,但有专家认为有成千上万台Docker daemons仍然存在被利用的风险,其中大多数主机位于美国和中国。
docker 恶意镜像到容器逃逸影响本机的更多相关文章
- 在Centos7 更改Docker默认镜像和容器的位置
图片出处:https://bobcares.com/wp-content/uploads/docker-change-directory.jpg 一.Why? 通常,当你开始使用docker时,我们并 ...
- docker(三) 镜像和容器常用命令
一.镜像操作 1.搜索镜像 可以直接在Docker Hub 直接搜索镜像,当然也可以使用命令来搜索. docker search 名称 docker search tomcat 2.拉取镜像 dock ...
- s3 Docker的镜像和容器
Docker技术里最为基础的两大概念:镜像和容器.镜像的 获取方式:从registry拉取,从Dockerfile构建:容器的基本操作 1 Docker架构和底层技术简介 Docker Platfor ...
- CentOS7更改Docker默认镜像和容器存储位置
图片出处:https://bobcares.com/wp-content/uploads/docker-change-directory.jpg 一.Why? 通常,当你开始使用docker时,我们并 ...
- 【docker】关于docker 中 镜像、容器的关系理解
例如,使用docker 拉取下来一个要用的镜像es docker pull elasticsearch:5.6.9 此时es的镜像存在与服务器上 docker images 对于你运行镜像为一个容器的 ...
- 修改Docker默认镜像和容器的存储位置
一.Why Docker默认的镜像和容器存储位置在/var/lib/docker中,如果仅仅是做测试,我们可能没有必要修改,但是当大量使用的时候,我们可能就要默认存储的位置了. 二.How 2.1 修 ...
- Docker关于镜像、容器的基本命令
镜像 1.获取镜像 docker pull 服务器:端口/仓库名称:镜像 ➜ ~ docker pull python Using default tag: latest 2.查看镜像信息 列出本机所 ...
- Docker的镜像及容器常用操作(2)
一.docker镜像 镜像(docker image) --- Docker 运行容器之前需要本地存在镜像,若本能地不存在,那么 Docker 会找默认镜像仓库( Docker Hub 公共注册服务器 ...
- Docker 记一次容器内部修改宿主机挂载目录用户权限后宿主机目录变化
一.需求: 因公司需求,需制作mysql5.7.22 docker基础镜像,每个项目以此镜像启动一个数据库容器,并且每个项目挂载一个宿主机目录到镜像中数据存储下面用于数据持久化保存以便后期迁移至阿里云 ...
随机推荐
- String为什么是final类型的
String的源码如下: public final class String implements Serializable, Comparable<String>, CharSequen ...
- Jenkins强制语言设置
最近对照各种Jenkins的教程,发现在jenkins的页面中经常会中英文混合,每个人根据各自系统的不同也会出现语言不同,虽然可以翻译过来,但是中英文的混合差异还是蛮大的,造成项目间沟通障碍. 所以, ...
- win10下安装mongodb
环境 :win10 mongodb-win32-x86_64-v3.4-latest.zip 1.下载地址:https://www.mongodb.com/download-center/commu ...
- JdbcTemplate 配置多数据源(完全照抄,完整)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- light sdk
//请求ajax var request = function (url,method,params,cb) { var d = ajax({ url:url, type:method, data:p ...
- 新 radio样式修改
https://blog.csdn.net/qq_41617704/article/details/80973966
- Python初学之使用方法修改字符串的大小写
对于字符串,可执行的最简单的操作之一是修改其中单词的大小写. titile()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写: name.py name = "linda l ...
- bootstrap-daterangepicker双日历控件开始日期选择问题
在做项目的时候,有这样一个需求,需要选择时间段,于是在网上找了bootstrap的双日历时间控件daterangepicker控件,要选取时间段的年月来与后台进行数据交互,时间控件如下图所示: 关于控 ...
- django-微信小程序登录
小程序登录逻辑前端通过调用wx.login()获取code, 将code和用户基本信息发送到后端,后端通过request.get向微信服务器发送get请求获取用户openid和session_key, ...
- 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言
Blade的UI都是预定义的接口, 然后由插件来负责实现, 目前只有MFC的插件. 最近加上了TableView的视图, 用于一些文件的查看和编辑, 比如前面在文件包的笔记中提到需写一个package ...