嵌入式Linux中文站

“脏牛”内核漏洞修复补丁存在缺陷 “大脏牛”漏洞来袭


Bindecy 研究人员指出,去年在 Linux 系统中发现的“脏奶牛”漏洞(CVE-2016-5195)并未得到完全修复。

不完整的“脏奶牛”修复补丁

“脏奶牛”漏洞源自 Linux 内核中的内存子系统在处理私有只读内存映射的写时拷贝(简称 COW,即‘奶牛’的由来)时,会因争夺而引发破坏性结果。漏洞发现者菲尔·奥斯特(Phil Oester)意识到,黑客可以使用这个缺陷来获得对其它只读存储器映射的写入访问,从而增加它们在系统上的特权。

此项安全漏洞随后还被发现会影响到 Android 系统,甚至可能会脱离容器控制。而且在谷歌方面发布漏洞修复补丁后不久,攻击者就设计出了新的、能够利用 Android 缺陷的脏奶牛攻击手段。

今年 9 月,研究人员们发现了利用该漏洞的最新恶意软件家族。

Bindecy 方面指出,“脏奶牛”漏洞是目前公布的最具知名度的安全漏洞之一,且会对过去十年来包括 Android 在内的一切 Linux 版本造成影响,因此所对应的修复补丁一直受到高度关注。也正因为如此,在补丁发布的一年多之后,仍然鲜有人意识到其并不完整。

回顾“脏奶牛”漏洞

原本的安全漏洞会影响到 get_user_page 函数,其被用于获取用户进程内虚拟地址之后的物理页。基本上,该 bug 允许攻击者向只读权限页版本中写入内容。

此项安全漏洞的修复补丁并不会降低所请求的权限。相反,研究人员们解释称“get_user_page 如今会记住我们通过了 COW 循环的事实。”

因此,在下一次迭代时,则只读页仅在指定有 FOLL_FORCE 与 FOLL_COW 标记,且 PTE 被标记为 dirty 的情况下方可接受写入操作。

安全研究人员们指出,问题在于该补丁“设定某页的只读高受限复制永远不会被标记为 dirty 的 PTE 所指定。”

透明巨大页内存管理 (THP)

Bindecy 研究人员发现,该安全漏洞目前仍会影响到透明巨大页(Transparent Huge Pages,简称 THP,是一种 Linux 内存管理系统,可以通过使用更大的内存页来减少对带有大量内存的机器 Translation Lookaside Buffer (TLB) 的开销。)与页中目录(简称 PMD,属于 PTE 层上的一层)。

尽管 Linux 通常会使用 4096 字节长度的页,但 THP 的长度往往可以达到 2 MB——不过后者会经过拆分以保持正常页长度。一般来讲,默认 THP 支持仅被用于匿名映射,并可以在系统运行时进行开启或关闭。

THP 的实现源自启用 PMD 中的_PAGE_PS bit,如此一来 PMD 中的结果将会指向一个 2 MB 的物理页,而非 PTE 目录。

研究人员们发现,脏奶牛补丁代码实际上处理的是包含有 can_follow_write_pmd 函数的 THP,而其基本逻辑类似于指向巨大 PMD 的 can_follow_write_pte。

但根据研究人员们的说法,对于巨大 PMD,问题在于“未通过 COW 循环的页同样可以利用 touch_pmd 函数被标记为 dirty。”每当 get_user_page 尝试获取一个巨大页,该页中的一条被调用函数结果就会被标记为 dirty,而无需真正通过 COW 循环。因此,can_follow_write_pmd 的逻辑将无法成立。

Bindecy 研究人员指出,“在这种情况下,攻击者能够轻松利用这项 bug——可以使用与原本脏奶牛攻击类似的手段。这一次,在回避目标页的复制版本后,需要对原始页进行两次处理——第一次使其存在,第二次启动其 dirty bit。”

POC

安全研究人员们透露了几种漏洞利用场景,并发布了一项 概念验证方案 以展示利用方法。他们还于上周将此项安全漏洞(编号为 CVE-2017-1000405)发送至内核与发行版邮件联系人列表,同时提交了由其开发的补丁。

研究人员们总结称,“此项 bug 再次重申了补丁审计在安全开发生命周期当中的重要性。由于脏奶牛以及其它以往案例的存在,可以发现即使是高关注度漏洞也可能得不到完善的补丁修复。这种情况不仅出现在闭源软件层面,开源软件也同样会受到影响。”

HugeDirtyCow POC 地址:https://github.com/bindecy/HugeDirtyCowPOC

本文永久更新链接:http://embeddedlinux.org.cn/emb-linux/industry-news/201712/04-7859.html



分享:

评论