如何修补和保护Linux内核零日本地特权升级漏洞CVE-2016-5195 [21/Oct/2016]
在Linux内核中发现了一个非常严重的安全问题。
自2005年以来,存在一个0天的本地特权提升漏洞,该漏洞已经存在11年了。
此错误会影响各种Android或Linux内核以提升特权。
任何用户都可以在不到5秒的时间内成为root用户。
自Linux内核2.6.22+起存在该错误。
我该如何解决这个问题?
该错误被称为Dirty COW
(CVE-2016-5195)是Linux内核中的特权提升漏洞。
利用此错误不会对日志产生任何异常的影响。
因此,您无法检测是否有人对您的服务器利用了此漏洞。
什么是CVE-2016-5195错误?
在Linux内核内存子系统处理私有只读内存映射的写时复制(COW)损坏的方式中发现了一种竞争状况。
没有特权的本地用户可以使用此漏洞来获取对否则为只读的内存映射的写访问权,从而增加其在系统上的特权。
肯定是一个讨厌的错误。
自从至少Linux内核版本2.6.22起,任何本地用户都可以写入他们可以读取的任何文件,并且可以存在。
莱纳斯·托瓦尔兹(Linus Torvalds)解释说:
这是一个古老的错误,十一年前我实际上曾尝试在提交4ceb5db9757a中修复(严重)一次(严重)(修复get_user_pages()争用写访问权限),但是由于s390上的问题通过提交f33ea7f404e5(修复get_user_pages)被修复错误)。
同时,s390的状况已得到长期解决,现在我们可以通过正确检查pte_dirty()位来解决此问题(并做得更好)。
s390脏位在abf09bed3cce中实现(s390/mm:实现软件脏位),从而使其成为v3.9。
早期的内核将不得不查看页面状态本身。
而且,VM变得更具可扩展性,并且从那时起,仅使用理论上的竞赛就变得更容易触发。
为了解决这个问题,我们引入了一个新的内部FOLL_COW标志来标记是,我们已经使用COLL而不是使用非常基础的FOLL_WRITE玩普通游戏,然后使用ptedirty标志来验证FOLL_COW标志仍然有效。
受影响的Linux发行版列表(包括共享同一内核的VM和容器)
- 红帽企业Linux 7.x
- 红帽企业Linux 6.x
- 红帽企业Linux 5.x
- CentOS Linux 7.x
- CentOS Linux 6.x
- CentOS Linux 5.x
- Debian Linux狂风
- Debian Linux杰西
- Debian Linux延伸
- Debian Linux SID
- Ubuntu Linux精确版(LTS 12.04)
- Ubuntu Linux值得信赖
- Ubuntu Linux xenial(LTS 16.04)
- Ubuntu Linux yakkety
- Ubuntu Linux生动/ubuntu-core
- SUSE Linux Enterprise 11和12
- Openwrt
如何在Linux上修复CVE-2016-5195?
根据您的Linux发行版执行命令。
您需要重新启动盒子。
应用补丁程序之前,请记下当前的内核版本:
$ uname -a $ uname -mrs
输出示例:
Linux 3.13.0-95-generic x86_64
Debian或Ubuntu Linux
$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
重新启动服务器:
$ sudo reboot
相关
:Ubuntu Linux用户可以在不重新启动服务器的情况下修复此Linux内核错误。
RHEL/CentOS Linux 5.x/6.x/7.x
$ sudo yum update $ sudo reboot
RHEL/CentOS Linux 4.x
$ sudo up2date -u $ sudo reboot
Suse Enterprise Linux或Opensuse Linux
要将所有必需的补丁程序应用到系统类型:
# zypper patch # reboot
验证
您需要确保您的版本号已更改:
$ uname -a $ uname -r $ uname -mrs
确定系统是否容易受到攻击
对于RHEL/CentOS Linux,使用以下脚本:
$ wget https://access.redhat.com/sites/default/files/rh-cve-2016-5195_2.sh $ bash rh-cve-2016-5195_2.sh
对于所有其他发行版,请尝试PoC(概念验证漏洞利用代码)
抓住PoC:
$ wget https://raw.githubusercontent.com/dirtycow/dirtycow.github.io/master/dirtyc0w.c
如下运行。
首先是root:
$ sudo -s # echo this is not a test > foo
以普通用户身份运行:
$ gcc -lpthread dirtyc0w.c -o dirtyc0w ### ***[ If you get an error while compiling code, try ***] ### $ gcc -pthread dirtyc0w.c -o dirtyc0w $ ./dirtyc0w foo m00000000000000000