linux “大脏牛”漏洞分析(CVE-2017-1000405)

news2024/2/27 5:49:42

一、背景简介

脏牛漏洞(CVE-2016–5195)是公开后影响范围最广和最深的漏洞之一,这十年来的每一个Linux版本,包括Android、桌面版和服务器版都受到其影响。恶意攻击者通过该漏洞可以轻易地绕过常用的漏洞防御方法,对几百万的用户进行攻击。尽管已针对该漏洞进行了补丁修复,但国外安全公司Bindecy对该补丁和内容做出深入研究后发现,脏牛漏洞的修复补丁仍存在缺陷,由此产生了“大脏牛”漏洞。基于多年以来针对移动端漏洞的技术积累和安全对抗,安天移动安全对“大脏牛”漏洞进行了详细的技术分析,并提供了验证方案,全文如下。

 

二、漏洞原理分析

2.1 脏牛漏洞回顾

在分析大脏牛漏洞前,我们需要对原始的脏牛漏洞利用方式进行完整的分析理解: 之前的漏洞是在get_user_pages函数中,这个函数能够获取用户进程调用的虚拟地址之后的物理地址,调用者需要声明它想要执行的具体操作(例如写/锁等操作),所以内存管理可以准备相对应的内存页。具体来说,也就是当进行写入私有映射的内存页时,会经过一个COW(写时拷贝)的过程,即复制只读页生成一个带有写权限的新页,原始页可能是私有保护不可写的,但它可以被其他进程映射使用。用户也可以在COW后的新页中修改内容之后重新写入到磁盘中。         

现在我们来具体看下get_user_pages函数的相关代码:

整个while循环的目的是获取请求页队列中的每个页,反复操作直到满足构建所有内存映射的需求,这也是retry标签的作用。   

follow_page_mask读取页表来获取指定地址的物理页(同时通过PTE允许)或获取不满足需求的请求内容。在follow_page_mask操作中会获取PTE的spinlock,用来保护试图获取内容的物理页不会被释放掉。

faultin_page函数申请内存管理的权限(同样有PTE的spinlock保护)来处理目标地址中的错误信息。在成功调用faultin_page后,锁会自动释放,从而保证follow_page_mask能够成功进行下一次尝试,以下是涉及到的代码。         

原始的漏洞代码在faultin_page底部:

上面这个判断语句想要表示的是,如果当前VMA中的标志显示当前页不可写,但是用户又执行了页的写操作,那么内核会执行COW操作,并且在处理中会有VM_FAULT_WRITE标志。换句话说在执行了COW操作后,上面的if判断为真,这时就移除了FOLL_WRITE标志。         

一般情况下在COW操作后移除FOLL_WRITE标志是没有问题的,因为这时VMA指向的页是刚经过写时拷贝复制的新页,我们是有写权限的,后续不进行写权限检查并不会有问题。 但是,考虑这样一种情况,如果在这个时候用户通过madvise(MADV_DONTNEED)将刚刚申请的新页丢弃掉,那这时本来在faultin_page后应该成功的follow_page_mask会再次失败,又会进入faultin_page的逻辑,但是这个时候已经没有FOLL_WRITE的权限检查了,只会检查可读性。这时内核就会将只读页面直接映射到我们的进程空间里,这时VMA指向的页不再是通过COW获得的页,而是文件的原始页,这就获得了任意写文件的能力。   

基本来看,上述的过程流也就是脏牛漏洞的利用过程。   

在faultin_page中有对应的修复补丁:

同时也加入了另一个新的follow_page_mask函数:

与减少权限请求数不同,get_user_pages现在记住了经过COW循环的过程。之后只需要有FOLL_FORCEFOLL_COW标志声明过且PTE标记为污染,就可以获取只读页的写入操作。

 

2.2 大脏牛漏洞分析

THP通过PMD(Pages Medium目录,PTE文件下一级)的_PAGE_PSE设置来打开,PMD指向一个2MB的内存页而非PTEs目录。PMDs在每一次扫描到页表时都会通过pmd_trans_huge函数进行检查,所以我们可以通过观察PMD指向pfn还是PTEs目录来判断是否可以聚合。在一些结构中,大PUDs(上一级目录)同样存在,这会导致产生1GB的页。 仔细查看脏牛补丁中关于THP的部分,我们可以发现大PMDs中用了和can_follow_write_pte同样的逻辑,其添加的对应函数can_follow_write_pmd

然而在大PMD中,一个页可以通过touch_pmd函数,无需COW循环就标记为dirty:

这个函数在每次get_user_pages调用follow_page_mask试图访问大页面时被调用,很明显这个注释有问题,而现在dirty bit并非无意义的,尤其是在使用get_user_pages来读取大页时,这个页会无需经过COW循环而标记为dirty,使得can_follow_write_pmd的逻辑发生错误。

在此时, 如何利用该漏洞就很明显了,我们可以使用类似脏牛的方法。这次在我们丢弃复制的内存页后,必须触发两次page fault,第一次创建它,第二次写入dirty bit。

调用链:

经过这个过程可以获得一个标记为脏的页面,并且是未COW的,剩下的就是要获取FOLL_FORCE和FOLL_COW标志了。这个过程可以采取类似dirtyCOW的利用方式。   

总结这个漏洞利用的思路如下:   

  1. 首先经过COW循环,获取到FOLL_COW标志
  2. 用madvise干掉脏页
  3. 再次获取页将直接标记为脏
  4. 写入

 

三、影响范围

3.1 漏洞影响范围

由于从2.6.38内核后才开始支持THP,所以漏洞影响所有内核在2.6.38以上并且开启THP的Linux系统。万幸的是在大多数Android系统的内核中没有开启THP,所以对于Android系统几乎没有影响。

3.2 如何在系统上查看是否受到影响

如果是开发者,有内核源码可以查看编译的config文件,看CONFIG_TRANSPARENT_HUGEPAGE是否打开

如果没有源码,在shell中可以查看/sys/kernel/mm/transparent_hugepage/enabled,如果输出结果为[always]表示透明大页被启用、[never]表示透明大页被禁用、[madvise]表示只在MADV_HUGEPAGE标志的VMA中启用THP,例如:

如果以上两者都没有,可以查看/proc/meminfo,如果连HugePage*都没有,那就说明没有开启大页面,也不会受到漏洞影响。

 

四、验证代码

验证POC请参照:https://github.com/bindecy/HugeDirtyCowPOC

 

五、修复建议

截止到文章发布时间,Linux各发行版本还未公布针对该漏洞的补丁信息,软件开发人员可通过:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?h=linux-4.9.y&id=7031ae2ab37d3df53c4a4e9903329a5d38c745ec 新编译Linux修复该漏洞。如果开发人员暂时无法编译和替换内核,可以通过关闭透明大页(THP)来缓解。

 

六、总结

“脏牛”漏洞是Linux内核之父Linus亲自修复的,他提交的补丁单独针对“脏牛”而言并没有问题。从我们的分析过程中发现,内核的开发者希望将“脏牛”的修复方法引用到PMD的逻辑中,但是由于PMD的逻辑和PTE并不完全一致才最终导致了“大脏牛”漏洞。连内核的开发者都会犯错,更何况普通的开发者。

“大脏牛”漏洞再一次提示我们,即便是官方修复过的漏洞仍有可能由修复补丁引入新的严重漏洞,漏洞在修复后需要我们像对待原始漏洞一样继续跟踪其修复补丁。

 

七、参考资料

  1. https://medium.com/bindecy/huge-dirty-cow-cve-2017-1000405-110eca132de0
  2. https://bbs.pediy.com/thread-223056.htm
  3. https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-1000405

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://nwjs.net/news/300082.html

如若内容造成侵权/违法违规/事实不符,请联系七分地网进行投诉反馈,一经查实,立即删除!

相关文章

安卓音乐播放器开发实例

本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件。为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的快进快退等。 先欣赏下本实例完成…

云计算&大数据 “下一幕”智能变革之力

2019独角兽企业重金招聘Python工程师标准>>> 2016年的互联网科技领域,云计算、大数据、人工智能成为最热词汇。阿里云“为了无法估算的价值”将中国的计算触角伸向海外,百度首次向外界展示“百度大脑”的科技成果,移动互联网利用人…

html和css有序列表,HTMLCSS基础学习笔记14—有序列表及列表嵌套

我们上篇讲到了无序列表,那么今天就来看看有序列表和他们的组合嵌套使用吧。有序列表现在我们要做那堆杂事了,但是发现这么多杂事,先做哪个好呢?于是我们给这堆杂事弄个优先级排序,让我们能够按照顺序做下去。HTML里用…

华硕笔记本BIOS设置详解

BIOS是英文Basic Input/Output System的缩写,即基本输入输出系统,合理的BIOS设置可以让我们的电脑更好的为我们服务,但由于大部分笔记本的BIOS界面是英文,并且BIOS里面的某些关键选项稍有差池就会导致各种各样的问题,导…

发表论文不用愁,十大技巧治秃头

鱼羊 编译整理 量子位 报道 | 公众号 QbitAI做研究跟发文章,完全是两码事。实验一时爽,落笔火葬场。好不容易憋出了初稿,又有多少研究僧跪在了反复修改的漫漫长路上。对于很多科研党来说,比起嗑盐的过程,恐怕写文章更让…

Ext4 MVC CRUD操作

项目目录结构如下&#xff1a; &#xff08;1&#xff09;index.html <!DOCTYPE html> <html><head><title>用户管理</title><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial…

手机拍视频,实时换背景,继马卡龙玩图后,Versa又出了一款更厉害的App

郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI在前不久荣耀9X的发布会上&#xff0c;一个名叫绿幕侠的App亮相了。现场的展示中&#xff0c;这个App能让手机拍摄的视频&#xff0c;产生电影绿幕一般的效果&#xff0c;实时从视频中去掉背景&#xff0c;只保留主角人物&#…

html中多边形图形怎么制作,CSS制作图形速查表

前面在《纯CSS制作的图形效果》一文中介绍了十六种CSS画各种不同图形的方法。今天花了点时间将这方面的制作成一份清单&#xff0c;方便大家急用时有地方可查。别的不多说了&#xff0c;直接看代码。为了节省时间&#xff0c;下面图形都采用的一个标签&#xff0c;可以是块元素…

unity学习

2019独角兽企业重金招聘Python工程师标准>>> 1.发布ios应用的时候会生成一个xcode工程。已经发布过ios&#xff0c;再次发布的时候可以选择replace 或者是append原xcode工程。如果ios工程是不同unity版本创建的&#xff0c;那么不能append。但是如果我们修改过ios的…

腾讯AI击败王者荣耀职业队,全靠自学、策略清奇,一天训练量为人类440年

问耕 发自 麦蒿寺量子位 出品 | 公众号 QbitAI王者峡谷&#xff0c;风云突变。一场激烈的对战正在进行&#xff0c;左侧是五位人类职业电竞高手组成的赛区联队&#xff0c;另一方是……嗯&#xff1f;他们的对手没有出场&#xff1f;五个座椅空空荡荡&#xff1f;不。他们的对手…

mfc 内嵌 本地html,MFC程序中内嵌网页,附示例工程

最近在课程设计&#xff0c;因为小悠太懒了&#xff0c;是在不想用C完成一些简单的文件上传下载操作&#xff0c;于是就想着将网页内嵌到程序中&#xff0c;上传下载神马的就直接使用网页Web来完成就好了&#xff0c;本示例中将演示在MFC程序中内嵌一个html网页介绍一下原理首先…

最高5000倍加速模拟物理世界,育碧在修复bug上又进一步

晓查 发自 凹非寺量子位 出品 | 公众号 QbitAI“买bug送游戏”对育碧游戏的玩家来说简直是常态。即使是育碧的当家游戏《刺客信条》、《孤岛惊魂》系列也是bug也是多到令人发指。比如《刺客信条&#xff1a;大革命》中&#xff0c;主角的脸部建模突然失控&#xff0c;变成一张“…

AI帮你靠“想象”打字:手机电脑软键盘也能盲打了,准确率能达到95%

铜灵 发自 凹非寺量子位 出品 | 公众号 QbitAI有了机器学习&#xff0c;没有软键盘还能照样打字。凭啥&#xff1f;凭想象。来自韩国科学技术高级研究院在一项最新研究中&#xff0c;提出了一种完全靠想象的键盘&#xff1a;I-Keyboard&#xff0c;这个界面上看不到软键盘上的字…

php curl 内容采集

2019独角兽企业重金招聘Python工程师标准>>> function contentCollection($url){$data array(list>null,status>0);if(!$url){$data[info] 请传入采集地址;return $data;}if(!preg_match("/^http/", $url)){$url http://.$url;}preg_match("…

文科生如何入门机器学习:先看看这篇零基础教程,再多算几遍吧

晓查 发自 凹非寺量子位 出品 | 公众号 QbitAIAI技术变得越来越热门&#xff0c;很多人开始转行进入这一领域&#xff0c;其中当然也不乏文科生。他们在普遍缺乏大学数学知识的情况下&#xff0c;就不能入门机器学习了吗&#xff1f;最近有位Reddit网友David Code&#xff0c;他…

B站最火数学视频3Blue1Brown是如何制作的

授权转发自 知乎网友 李狗嗨原文地址&#xff1a;https://www.zhihu.com/question/57357012/answer/723888621相信很多人都知道3Blue1Brown&#xff0c;这是一个由斯坦福大学的数学系学生Grant Sanderson 创建的YouTube 频道。该频道从独特的视觉角度解说高等数学&#xff0c;内…

计算机硬件与游戏发展史,电脑硬件的发展历程中 什么是电竞SSD?

原标题&#xff1a;电脑硬件的发展历程中 什么是电竞SSD&#xff1f;身处21世纪的人们&#xff0c;早已经习惯了各类电子设备的充斥&#xff0c;并全方位的体验着智能设备所带来的便利。那么&#xff0c;我们平常所熟知的计算机设备&#xff0c;到底由那些重要部件组成&#xf…

滴滴正式分拆无人车业务,复刻Uber上市路径,传孙正义再加持

李根 发自 凹非寺 量子位 报道 | 公众号 QbitAI滴滴无人车&#xff0c;终于也官宣分拆了。今天&#xff08;8月5日&#xff09;滴滴出行宣布旗下自动驾驶部门&#xff0c;升级为独立公司&#xff0c;专注于自动驾驶研发、产品应用及相关业务拓展。滴滴出行CTO张博兼任自动驾驶新…

unity3d 动画中断并重新播放的解决办法

为什么80%的码农都做不了架构师&#xff1f;>>> 如果想中断某个正在播放的动画&#xff0c;然后重新播放&#xff1f; 比如玩家被敌人击中了&#xff0c;正在播放被击中的动画&#xff0c;不巧紧接着玩家又被敌人击中一次&#xff0c;此时就得中断动画并重新播放。…

BAT华为美团头条面试考什么?这份GitHub万星资源,告诉你面试题+答案+出题人分析...

铜灵 发自 凹非寺量子位 出品 | 公众号 QbitAI2020校招脚步临近&#xff0c;怎样备战即将到来的面试&#xff0c;在众多面试者中脱颖而出惊艳到面试官&#xff0c;化身大厂Offer收割机&#xff1f;GitHub上就有这样一个万星资源&#xff0c;整理了BAT华为、滴滴、头条等大厂可能…