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基础镜像,每个项目以此镜像启动一个数据库容器,并且每个项目挂载一个宿主机目录到镜像中数据存储下面用于数据持久化保存以便后期迁移至阿里云 ...
随机推荐
- IDEA 编译时 报 “常量字符串过长” 解决办法
从eclipse 工具转到 IDEA 工具的时候,出现了一些问题,在这里记录一下,以便之后使用到,废话不多说. 在编译项目时,出现错误为:"常量字符串过长" ,我当时想这个问题需要 ...
- eclipse使用技巧心得分享
eclipse使用技巧心得分享 习惯了eclipse开发java程序,公司最近的项目都是idea开发的,同时android studio也是idea原型开发的,在学android开发,所以脱离ec ...
- qt 利用 HTML 生成PDF文档,不能显示jpg图片
利用 QPrinter 和html 生成 pdf文档 其中用html语句有显示图片的语句 但只能显示png格式的图片,不能显示jpg格式图片. 经过排查:语法,文件路径等都正确,最终在stack ov ...
- 尝鲜svnup
最近有同事折腾了一下svnup的编译,终于可以在Mac OS X和Linux上面编译通过了,仓库在这里:https://github.com/lvzixun/svnup/ svnup这个工具只有一个功 ...
- Hadoop、Strom集群实现日志自动清理
Hadoop+Storm集群,运行一段时间ZooKeeper等关键进程自动停止运行,经检测是系统磁盘不足 系统磁盘100%: 查找大文件后发现,空间均被ZooKeeper产生的log占用 find / ...
- Multiple plot function
From: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ library(ggplot2) multi ...
- POJ - 1681: Painter's Problem (开关问题-高斯消元)
pro:开关问题,同上一题. 不过只要求输出最小的操作步数,无法完成输出“inf” sol:高斯消元的解对应的一组合法的最小操作步数. #include<bits/stdc++.h> #d ...
- Arch Linux 硬盘引导-联网安装
Arch Linux 硬盘引导-联网安装 ============https://www.archlinux.org/https://wiki.archlinux.org/https://wiki.a ...
- 理解 if __name__ == '__main__'
简单地理解Python中的if __name__ == '__main__' if __name__ == '__main__'的意思是: 当.py文件被直接运行时,if __name__ == '_ ...
- java基础(三):反射、反序列化破解单列模式和解决方式
单例模式指的是一个类只有一个对象,通过一些措施达到达到这个目的.但是反射和反序列化可以获得多个不同的对象. 先简单的认识一下单例模式 一:单例模式 通过私有构造器,声明一个该类的静态对象成员,提供一个 ...