CVE-2016-5195(Dirty Cow)
影响版本
内核版本在 2.6.22 至 4.8
CentOS:CentOS 5.x、6.x、7.x 的 32 位和 64 位版本。
Debian:Debian 6.x 32 位、Debian 7.x 的 32 位和 64 位版本、Debian 8.x 的 32 位和 64 位版本。
Ubuntu:Ubuntu Server 10.04.1 LTS 的 32 位和 64 位版本、Ubuntu Server 12.04.1 LTS 的 32 位和 64 位版本、Ubuntu Server 14.04.1 LTS 的 32 位和 64 位版本。
Red Hat:Red Hat Enterprise Linux 5、6、7;Red Hat Enterprise MRG 2;Red Hat OpenShift Online V2;Red Hat Virtualization(RHEV-H/RHV-H)。
漏洞原理
容器逃逸中的核心原理是利用 Linux 内核写时复制(Copy-on-Write, COW)机制的竞态条件,突破容器的隔离限制,实现从容器到宿主机的权限提升。
容器与宿主机共享同一内核,若宿主机内核版本在 2.6.22 至 4.8 之间且未打补丁,容器内的攻击者可直接利用 Dirty Cow 漏洞。即使容器通过命名空间(Namespace)实现进程、文件系统等资源隔离,内核漏洞仍能绕过这些机制,直接操作宿主机内存空间。
环境搭建
选择 2.6.22 至 4.8 之间未打补丁的内核(如 Ubuntu 12.04 LTS、Ubuntu 14.04 LTS、CentOS 7),记得看一下内核版本,我用的内核高了没成功,降了一次级。
1 | # 下载未修复的内核镜像包(3.10.0-327.36.2.el7) |
POC,下载一下POC在Dockerfile的目录下
1 | FROM ubuntu:14.04 |
修改一下dirtyc0w.c,增加反弹shell的代码
1 | * |
在包含Dockerfile的目录下,使用以下命令构建 Docker 镜像:
1 | docker build -t cve-2016-5195-pro . |
下载太慢了,中途下载了个proxychains丢进去安装了一下
1 | sudo yum install -y git gcc make |
漏洞复现
dirtyc0w
1 | # CMD ["./dirtyc0w", "/etc/passwd", "root::0:0:root:/root:/bin/bash"] 运行即可触发 |
dirtycow-vdso
POC 这个对内核要求太高了,环境建议Ubuntu 14.043.13.0-100-generic
之前的版本,Debian 8 系列:内核版本 3.16.x
至 4.4.x
(未修复漏洞的版本)。不好搞,放个代码
1 | FROM ubuntu:14.04 |
在包含Dockerfile的目录下,使用以下命令构建 Docker 镜像:
1 | docker build -t cve-2016-5195-next . |
修复建议
升级内核,对应的发版如下
- CentOS 7:
kernel-3.10.0-327.36.3.el7
及以上 - Ubuntu 14.04:
linux-image-3.13.0-100-generic
及以上 - Debian 8:
linux-image-3.16.0-4-amd64
及以上