千家信息网

如何进行CVE-2017–1000405漏洞原理分析

发表于:2024-12-01 作者:千家信息网编辑
千家信息网最后更新 2024年12月01日,如何进行CVE-2017-1000405漏洞原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1 漏洞背景DirtyCrow是一个非
千家信息网最后更新 2024年12月01日如何进行CVE-2017–1000405漏洞原理分析

如何进行CVE-2017-1000405漏洞原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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函数如下:


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

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


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)


其中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


这个函数在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


4 加固意见

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

看完上述内容,你们掌握如何进行CVE-2017-1000405漏洞原理分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0