散文吧>长亭科技>无需重启,修复横扫Linux系统的脏牛本地提权漏洞 (CVE-2016-5195)

无需重启,修复横扫Linux系统的脏牛本地提权漏洞 (CVE-2016-5195)

2016-10-30 02:39 | 长亭科技

无需重启,修复横扫Linux系统的脏牛本地提权漏洞 (CVE-2016-5195)


脏牛(Dirty Cow)是近日被曝出的存在于Linux内核中的一款0day漏洞。
因为此漏洞是在Linux内核的内存子系统在处理写时拷贝(Copy-on-Write)时发生的,而又给Linux内核的使用带来烦恼,所以将其命名为“Dirty Cow”。



漏洞原因:

Linux 内核内存子系统的 COW 机制在处理内存写入时存在竞争,导致只读内存页可能被篡改。

Linux 之父 Linus Torvalds  commit 19be0ea 中修复了这个漏洞并留言

This is an ancient bug that was actually attempted to be fixed once (badly) by me eleven years ago in commit 4ceb5db9757a ("Fix get_user_pages() race for write access") but that was then undone due toproblems on s390 by commit f33ea7f404e5 ("fix get_user_pages bug").


漏洞影响:

低权限用户可以利用该漏洞写入对自身只读的内存页(包括可写文件系统上对该用户只读的文件)并提权至 root

该漏洞影响所有目前运行 Linux 系统的设备,包括但不限于运行 Linux 系统的服务器、Docker 容器服务、使用 Linux 操作系统的路由器、Android 手机/平板、搭载了 Android 系统的电视机/机顶盒等。

该漏洞的利用代码在 GitHub 上公开并且已经广为流传。(这份代码无法在 RHEL/CentOS 5/6 系统上成功利用,但是不代表该漏洞在这些系统上是不可利用的)

利用代码执行效果:

user@localhost:/tmp/test$ ls -l
total 16
-rwxr-xr-x 1 user user 9392 Oct 21 20:56 exp
-rw-r--r-- 1 root root    5 Oct 21 20:56 readonly_file
user@localhost:/tmp/test$ cat readonly_file
root
user@localhost:/tmp/test$ echo test >readonly_file
bash: readonly_file: Permission denied
user@localhost:/tmp/test$ ./exp readonly_file test
mmap 0x7f7254eb2000
 
^C
user@localhost:/tmp/test$ cat readonly_file
test


漏洞修复:


目前已知修复了该漏洞的常见发行版和修复的内核版本如下:

1. Ubuntu 12.04 LTS (3.2.0-113.155)

2. Ubuntu 14.04 LTS (3.13.0-100.147)

3. Ubuntu 16.04 LTS (4.4.0-45.66)

4. Ubuntu 16.10 (4.8.0-26.28)

5. Debian wheezy (3.2.82-1)

6. Debian jessie (3.16.36-1+deb8u2)

7. Debian sid (4.7.8-1)

CentOS / Red Hat 系列操作系统尚未发布修复(截至发稿时)

需要注意的是 Debian/Ubuntu 系统必须在 /etc/apt/sources.list 中开启 -security 后缀的源才能收到更新。由于各镜像更新软件包存在一定的延迟(一般为数小时),为了及时得到更新,建议默认从官方镜像获取安全更新,例如


# Ubuntu 12.04 LTS (precise)
deb http://security.ubuntu.com/ubuntu/ precise-security main
 
# Ubuntu 14.04 LTS (trusty)
deb http://security.ubuntu.com/ubuntu/ trusty-security main
 
# Ubuntu 16.04 LTS (xenial)
deb http://security.ubuntu.com/ubuntu/ xenial-security main
 
# Ubuntu 16.10 (yakkety)
deb http://security.ubuntu.com/ubuntu/ yakkety-security main
 
# Debian 6 (wheezy)
deb http://security.debian.org/ wheezy/updates main
 
# Debian 7 (jessie)
deb http://security.debian.org/ jessie/updates main
 
# Debian 8 (sid)
deb http://security.debian.org/ sid/updates main

免重启热修补:

由于该漏洞位于 Linux 内核,发行版官方的内核更新只有在重启后才能生效。如果您的线上业务不能中断,可以采用下面这种基于 systemtap 的热修补方法,并在合适的时候更新系统内核。


systemtap 是一款内核调试、性能分析工具,其原理是**新的内核模块并根据需要修改逻辑,实现功能。该工具同样可以被用于安全应急响应,在不重启系统的前提下修补安全漏洞或者提高利用难度。这方面的运用可以参考 Red Hat Customer Portal的一篇博客


针对 CVE-2016-5195  systemtap 热修补补丁最先出现在 Red Hat 公司 Bug 追踪系统的讨论区(出处),内容节选如下:


probe kernel.function("mem_write").call ? { $count = 0 }
probe syscall.ptrace { $request = 0xfff }

通过阻止写入 /proc/self/mem 来达到阻止上述利用代码的目的。该补丁有较为明显的副作用:无法调试程序,还可能导致 RHEL/CentOS 6 Ubuntu 14.04 上使用的 upstart 服务管理机制不能正常工作。


本文提供另一种热修补方式,代码如下:


probe kernel.function("sys_madvise") {
    if ($behavior == 4) { $behavior = 0 }
}

Ubuntu系统前置步骤:

# apt-get install gcc systemtap
# ddeb_filename=$(dpkg-query --show --showformat='${Package}-dbgsym_${Version}_${Architecture}.ddeb' linux-image-$(uname -r))
# wget http://ddebs.ubuntu.com/pool/main/l/linux/${ddeb_filename}
# dpkg -i ${ddeb_filename}


Debian系统前置步骤:

由于 Debian 系统在同一包名下存在多个版本,需要从 snapshot 镜像下载或者自己编译得到调试信息,这里从略


RHEL/CentOS系统安装步骤:

# yum install systemtap

现在需要安装与正在运行的内核版本相同的头文件和调试信息,主要是以下几个包:

1.     kernel-devel-$(uname -r)

2.     kernel-debuginfo-common-$(arch)-$(uname -r)

3.     kernel-debuginfo-$(uname -r)


可以手工搜索相应的包名,下载 rpm 并安装(请尽量从官方源下载,使用错误的包可能导致内核崩溃)



测试systemtap安装成功:


# stap -e 'probe begin { print("hello world\n"); exit(); }'
hello world

执行热修补


# stap -Fge 'probe kernel.function("sys_madvise") { if ($behavior == 4) { $behavior = 0 }}'
 
Disconnecting from systemtap module.
To reconnect, type "staprun -A stap_9f8ce8307eb418da7c981b3223eec678_12644"

修补完成


# lsmod | grep stap
stap_9f8ce8307eb418da7c981b3223eec678_12644    81920  0

可以看到 systemtap 编译出的内核模块已经成功加载。


本文介绍的热修补方法在 Ubuntu 16.04 LTS / CentOS 7.1 下测试成功,可以在不重启的前提下成功防御目前公开的利用代码。

 



在获取漏洞信息的第一时间,长亭科技已通过多种有效途径通知客户。

本文系长亭科技(ID:Chaitin_Tech)原创,如需转载或引用,作者请注:长亭科技,并附原文链接,感谢。

扫码关注长亭科技

获取更多安全信息


封面图片来自网络