freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2017–1000405漏洞原理分析
2019-05-10 08:56:51

1     漏洞背景

DirtyCrow是一个非常有名的公开漏洞。这个漏洞在过去10年中,存在于每一个Linux版本里,包括安卓手机、台式机和服务器都受这一漏洞的影响,该漏洞直接影响了数百万用户。最初的脏牛漏洞是在2016年公开,cve编号为CVE-2016-5195。

然而最近国外安全团队Bindecy再次爆出名为大脏牛(HugeDirty Cow)的内核提权漏洞,编号为CVE-2017–1000405。包含linux内核(2.6.38~4.14)的服务器,桌面,移动等众多设备将面临严重挑战,数以百万计的用户受到安全威胁。该漏洞是由于对之前的内核提权漏洞(cve-2016-5195)修补不完整引发。

2     漏洞分析

在对大脏牛漏洞分析之前,先来回顾下CVE-2016-5195的漏洞产生过程。该漏洞位于get_user_pages函数中,get_user_pages位于mm/gup.c中,当write系统调用向/proc/self/mem文件写入数据时,进入内核态后内核会调用get_user_pages函数获取要写入内存的地址。

具体get_user_pages函数如下:

图片.png

当进入系统内核后会调用get_user_pages函数来循环获取内存地址,直到满足内存映射需求。

get_user_pages同时会调用get_user_pages来获取这块内存的页表项,并要求页表项所指向的内存映射具有可写权限。

图片.png

get_user_page调用faultin_page进行缺页处理后第二次调用follow_page_mask获取这块内存的页表项,如果需要获取的页表项指向的是一个只读的映射,那第二次获取也会失败。这时候get_user_pages函数会第三次调用follow_page_mask来获取该内存的页表项,并且不再要求页表项所指向的内存映射具有可写的权限,这时是可以成功获取的,获取成功后内核会对这个只读的内存进行强制的写入操作。写入的内容是不会同步到文件中的.如果写入的虚拟内存是一个VM_SHARE的映射,那mmap能够映射成功的充要条件就是进程拥有对该文件的写权限,这样写入的内容同步到文件中也不算越权了。

mmap的作用是将硬盘文件的内容映射到内存中,采用闭链哈希建立的索引文件非常适合利用mmap的方式进行内存映射,利用mmap返回的地址指针就是索引文件在内存中的首地址,这样就可以访问这些内容了。

如果第二次获取页表项失败之后,另一个线程调用madvice(addr,addrlen,MADV_DONTNEED)

图片.png

其中addr~addrlen是一个只读文件的VM_PRIVATE的只读内存映射,那该映射的页表项会被置空。这时如果get_user_pages函数第三次调用follow_page_mask来获取该内存的页表项。由于这次调用不再要求该内存映射具有写权限,所以在缺页处理的时候内核也不再会执行COW操作产生一个副本以供写入。所以缺页处理完成后第四次调用follow_page_mask获取这块内存的页表项的时候,不仅可以成功获取,而且获取之后强制的写入的内容也会同步到映射的只读文件中,从而导致了只读文件的越权写入,最终导致了权限提升漏洞。

3     大脏牛漏洞分析

大脏牛漏洞是在脏牛漏洞修复的基础上产生的新的漏洞,该漏洞主要是由脏牛漏洞的补丁中关于大页内存管理的函数中出现问题导致。

内存是由块管理,即常说的页面,一个页面有4096字节,1M内存等于256个页面,1G内存等于356000个页面等。Linux采用了大页面管理方式,即2MB使用的页表可管理多GE内存,而1GE页表可管理TB内存。THP 系统管理员和开发者减少了很多使用超大页面的复杂性。因为 THP 的目的是改进性能,所以其开发者(社区和红帽开发者)已在各种系统、配置、程序和负载中测试并优化了 THP。这样可让 THP 的默认设置改进大多数系统配置性能。

补丁中关于大内存管理页面的代码部分中,一个页可以通过touch_pmd函数,无需COW循环就标记为dirty

图片.png

这个函数在follow_page_mask每次获取get_user_pages试图访问大页面时被调用。很明显这个注释有问题而现在dirty bit并非无意义的。尤其是在使用get_user_pages来读取大页时,这个页会无需经过COW循环而标记为dirty,使得can_follow_write_pmd的逻辑发生错误。获取复制的内存页后,可以污染两次原始页-第一次创建它,第二次写入dirty bit,这个漏洞可按照类似脏牛漏洞利用方法进行尝试。

大脏牛漏洞利用poc地址:

https://github.com/bindecy/HugeDirtyCowPOC

图片.png

4     加固意见

通过参考相关资料得知,脏牛漏洞是的补丁是由linux创始人linus亲自打上的,但是还是出现了疏忽。此次大脏牛漏洞的影响范围为从2.6.38内核后的linux系统,且开启了大页内存管理的支持。对此官方也已经给出了相关的补丁,建议升级相关系统补丁。

漏洞影响具体版本可参考如下链接:

https://nvd.nist.gov/vuln/detail/CVE-2017-1000405/cpes?expandCpeRanges=true

本文参考资料链接如下:

 https://access.redhat.com/security/vulnerabilities/3253921

https://www.cnblogs.com/sky-heaven/p/5660210.html

http://blog.csdn.net/xjping0794/article/details/78066064

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-1000405

https://medium.com/bindecy/huge-dirty-cow-cve-2017-1000405-110eca132de0


关注我们

Tide安全团队正式成立于2019年1月,是以互联网攻防技术研究为目标的安全团队,目前聚集了十多位专业的安全攻防技术研究人员,专注于网络攻防、Web安全、移动终端、安全开发、IoT/物联网/工控安全等方向。

想了解更多Tide安全团队,请关注团队官网: http://www.TideSec.net 或关注公众号:

1551433162_5c78fdca9fae9.jpg

# 脏牛
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者