金年会

每日经济新闻
要闻

每经网首页 > 要闻 > 正文

【技术分享】dirtycow学习与调试记录函数操作文件

陈潜峰 2025-11-03 03:44:54

每经编辑|钟巧花    

当地时间2025-11-03,gufjhwebrjewhgksjbfwejrwrwek,淫荡白丝班花

在浩(hao)瀚的Linux内核世界中,总有一些“小”漏洞,却能掀起(qi)惊涛骇浪。DirtyCOW(CVE-2016-5195)无疑是其中的佼佼者。这个看似不起眼的文件写时复制(Copy-on-Write,COW)机制的缺陷,却在2016年引起了安(an)全界的广泛关注,因为它允(yun)许低权限用户获得root权限(xian),可谓是(shi)“麻雀(que)虽小,五脏俱全”的典型。

今天,我们就来一次深入的“解剖”,从函数、操作到文件,一步步(bu)揭开DirtyCOW的面纱,并分享一些调试(shi)的心得(de)。

揭开COW的神秘面纱:它是如何工作的?

在深入DirtyCOW之前,我们(men)必须先理解Linux内核中的写时复制(COW)机制(zhi)。COW是一种优化内存使用的技(ji)术。当一个进程需要复制一个内存区域(例如fork()系统调用时),内核并不会(hui)立即将数据复制到新的内存空间。相反,它会为新进程分配与原进程共享的物理内存页面。

只有当其中一个进程试图修改这个共享内存页面时,内核才会创(chuang)建(jian)一个页面的副本,并将(jiang)修改(gai)限制(zhi)在副本(ben)上,原有的(de)页(ye)面则不受影响。这(zhe)种“懒加载”式的复制,极大地提高了内存利用率和进程创建的效率(lv)。

DirtyCOW的“脏”在哪里?

DirtyCOW漏洞的核心,就在于对COW机制的误用和竞态条件。简单来说,当一个进程修改一个写时复制的内存页面时,原本应该触发内核创建副本的操作,在特定时序下出现了偏差。如果攻击者能够在一个进程写入共享页面之前,抢先完成对该页面的修(xiu)改,那么修改就会直接应用到原始页面上,而不是副本,从而绕过了COW的保护,实现了任意文件写入。

关键函数与流(liu)程:深入内核的旅程

要理解DirtyCOW的(de)exploit,离不开对几个关键内核函(han)数的深入分析。其中,__do_fault()函数是重中之重。这个函数负(fu)责处理缺页异常(pagefault)。当CPU访问一个不存在于物理内存中的虚拟地址时,就会触发缺页(ye)异常,内核会调用__do_fault()来解决这个问题(ti)。

在DirtyCOW的场景下,攻击者会利(li)用madvise(MADV_DONTNEED)和(he)msync()等系统调用,配合文件映射(mmap)和写操作,试图在内(nei)核准备为写入操作创(chuang)建页面副本的过程中,通过一(yi)系列的内存操作和文件描(miao)述符的切换,制造一个竞态条件。

具(ju)体的流程大致是这样的:

内存映射与写入准(zhun)备:攻击者首先通过mmap将一个目标文件映射(she)到进程的(de)地址空间。然后,尝试对映射的内存区域进行写入。触发缺页异常:在写入过程中(zhong),如果对应的物理(li)页面尚未被分配,或者由于其他原因触发了缺页异常,就(jiu)会调用(yong)__do_fault()。

COW机制的介(jie)入:__do_fault()会检查当前内存页面的权限和共享属性。如果是一个写时复制的页面,并且是可写操作,理论上应该触发页面(mian)复制。竞态窗(chuang)口的出现:攻击者利用pagemap文件(/proc/self/pagemap)等工具,精确地控(kong)制内存页面的状态。

他们会(hui)在内核准备执行页面复制的微妙时刻,通过对/proc/self/pagemap的写入操作,强行修改目标文件(jian)的底(di)层物理页面。“脏”数据的诞(dan)生:一旦竞态条件成功,攻击者写入(ru)的数据就会直接覆盖目标文件的底层页面,绕过了COW机制的隔离。

此时,原本只应修改副本的写(xie)操作,却“脏”染了共(gong)享的(de)原始页面。

调试的艺术:拨开(kai)迷(mi)雾的利(li)器

调试DirtyCOW这样的内核(he)漏洞,绝对是一(yi)场与(yu)时间的赛跑,更是对(dui)耐心和细(xi)致(zhi)的终极考(kao)验。GDB+QEMU组合是内核调试的黄金搭档。通过QEMU模拟目标Linux环境,并在GDB中连接(jie)到QEMU的内核进程,我们可以像调试用(yong)户态程序一样,在(zai)内核代码(ma)中设置断点、单步执行、查看寄存器和内(nei)存。

在调试(shi)DirtyCOW时,我们往往需要关注(zhu)以下几个关键点:

__do_fault()的执行路径:在__do_fault()函数中(zhong),仔(zai)细跟踪页面的flags、vma(virtualmemoryarea)的属性,以及pte(pagetableentry)的变化,是理解漏洞发生机制(zhi)的关键。

内存页面的引用计(ji)数:关注页面引用计数(refcount)的变化,可以帮助我们理解在竞态条件下,页面是被错误地共享还是被不当释放。mmap和msync的行为:观察这两个系统调用在不同场景下的(de)参数和返(fan)回值,以及它们对内存映射区域和文件状(zhuang)态的影响。

pagemap文件的交互:理解/proc/self/pagemap如何反映物理内存页面的状态,以及如何利用它来观察或干预页面的复制过程。

调试过程中,我们可能会遇到各种挑战,例如:

巨量的日志:内核日志信息庞杂,需要有针对性地过滤和分析。精确的时序控制:竞态条件往(wang)往发生在一瞬间,想要稳定复现需要反复尝试(shi)和精细调整。内核版本的差(cha)异:不同版本的内核,__do_fault()的(de)实现细节可能有所不同,需要针对具体版本进行分析。

每一次成功的断点(dian)命中,每一次对变量的精准追踪,都如同在黑暗中点亮一(yi)盏灯,让我们离真相更近一步(bu)。通过不断的尝试和迭代,我们才能逐渐构建起对DirtyCOW漏洞的全面认识。

在第一部分,我们初步了解了DirtyCOW漏洞的背景,它与Linux内核的写时复制(COW)机制息息相关,并且深入探讨了关键的内核函数,特别是__do_fault()在漏洞触发过程中的作用。我们也简要介绍了使用GDB+QEMU进行(xing)内核调试的思路。

现在,我们将(jiang)继续深入,聚焦于具体的函数操作、文件交互以(yi)及更精细的调试技巧,力求为读者呈现一个更立体、更具操作性的DirtyCOW学习图景。

精细函数操作:深入page_mkwrite与do_wp_page

除了__do_fault(),在DirtyCOW的exploit中(zhong),还有几个函数扮演着至关重(zhong)要的角色。当__do_fault()确定需要进行写操作,并且需要创建一个页面的副本时,它会调用handle_mm_fault(),而handle_mm_fault()最终会导向page_mkwrite()。

page_mkwrite()的主要职责是确保页(ye)面是可写的,并且如果需要,会尝试分配新的(de)页面。

在page_mkwrite()中,会涉及到do_wp_page()函数。do_wp_page()是COW机制(zhi)中处理(li)写保护(hu)页面(mian)的核心函数。当一个进(jin)程试图写入一个被(bei)标记为写保护的页面时,do_wp_page()会被调用。它的任务是:

检查页面是否是共享的:如果页面是共享的(de),那么就需要进行复制。分配新页面:分配一个新的物理页面。复制页面内容:将原(yuan)页面内容复制到新页面。更新页表:修改页表,将进程的虚拟地址指向新分配的(de)页面,并设置相应的权限。释放原页面(如果不再被共享):如果原页面不再被其他进程共享,则(ze)将其释放。

DirtyCOW漏洞的精妙之(zhi)处(chu)在(zai)于,它利用了(le)page_mkwrite()和do_wp_page()在处理写操作时的竞态。攻击者通过快速地重复执行(xing)写操(cao)作,并结合其他内存操作(例如madvise(MADV_FREE)),试图让内核在准备复制页面时,出现一个短(duan)暂的(de)窗口。

在这个(ge)窗口内,如果攻击者能够(gou)通过某种方(fang)式(通常是利用pagemap文件)直接修改底层物理页面的数据,那么这个“脏”数据就可能被错误(wu)地应用到原始页面上,而不是新复制的副本。

文件操作的艺术:pagemap的双刃剑

在(zai)DirtyCOW的exploit中,/proc/self/pagemap文件扮演着一个非常特殊的角色。它允许用户空间(jian)程序直接读取和修改内核内存页面的物理地址(zhi)信息。通(tong)过pagemap,攻(gong)击者可以:

判断页面状态:检查一个虚拟地址对应的(de)物理页面是否存在,是否已经被分配(pei),以及它的属性。获取物理地(di)址:找到目标文件的特定内存页面在(zai)物理内存中的地址。直接修改页面:在(zai)竞态窗口中,通过向pagemap写入特定数据,直接修改物理页面的内容。

这就像给攻击者打开了一扇“后门”,绕过了正常(chang)的内存(cun)访问和修改流程。攻击者利用pagemap的强大能力(li),可以(yi)在内(nei)核尚未(wei)完成COW复制和写保护处理之(zhi)前,将恶意数据“塞”入目标文件的底层页面。

pagemap的使用也并非易事。它要求对内存管理和物理地址有深入的理解。更重要的是,通过pagemap直接修改内存极其危险,稍有不慎就可能导致系统崩溃或数据(ju)损坏。这充分体现了(le)DirtyCOW漏洞的“力量”与“危险”并存的特点。

调试的进阶:断点、日志与反汇编的交响曲

随着对漏洞机制理解的深入,我们的调试策略也需要随之升级。

条件断点:针(zhen)对__do_fault()、page_mkwrite()或do_wp_page(),设置条件断点。例如,只在特定虚拟(ni)地址范围或特定标志位满足时才触发断点。这可以极大地减少不必要的断点命中,将我们的(de)注意力集中在关键时刻。日志记录:在关键函数入口和出口处,添加临时的printk语句,记(ji)录重要的变量值,如pte、vma、flags等(deng)。

虽然这需要(yao)重新编译内核,但却是理解函数内部逻辑最直接有效的方法。反汇编视图:当我们不确定某个C代码片段在汇编层面是如何实现的,或者怀疑编译器优化导致了意想不到的行为时,GDB的反汇编视图(disassemble)就成了我们的利(li)器。通过对(dui)照汇编指令,我们可以更准确(que)地理解CPU的执行流程。

内存视图:使用GDB的x命令(examine)来(lai)查看(kan)内存区域的内容。这对于理解文件内容、内存(cun)结构以及漏洞触发时的内(nei)存状态至关重要。追踪特定文件描述符:在调试过程中,需要(yao)追踪与pagemap文件交互的文件(jian)描述符,以及与目标文件映射相关的structfile和(he)structvm_area_struct,以便更清晰地把(ba)握数据(ju)流向。

实战中的考量:理解上下(xia)文,把握时序

DirtyCOW漏洞的成功与否,很大程度上取决于对执行时序的精确控制。这意味着:

理解多线程/多进程的影响:在(zai)多任务环境下,其他(ta)进程或线程的操作可能会干扰到漏洞的利用。理解进(jin)程调度的行为,以及内核同步机制,对于编写稳定exploit至关重要。内核版本适应性(xing):如前所(suo)述,不同版本的内核,COW的实现细节可能存在差异。

exploit需要针对特定内核版本进行适(shi)配和(he)测试。硬件架构的(de)影响:虽然COW机制(zhi)在逻辑上是通用的,但(dan)在底(di)层实现上,不同的CPU架构(如x86、ARM)可能存在细微差别,尤其是在内存管理单元(MMU)和页表处理方(fang)面。

总结与展(zhan)望

DirtyCOW漏洞的学习,不仅仅是对一个CVE的研究,更是一次深入Linux内核的(de)探(tan)险。从COW机制的原理,到关键函数__do_fault()、page_mkwrite()、do_wp_page()的工作流程,再到(dao)pagemap文件这一“双刃剑(jian)”般的存在,每一步都充满了挑(tiao)战与乐趣。

通过结合GDB+QEMU的调试技巧,我们得以在微观层面观察内核的行(xing)为,理解漏洞触发的微妙时(shi)机。每一次成功的调试,都是一次知识的积累,一次对系统底层运行机制(zhi)的更深层次的认知。

DirtyCOW已经成为历史,但它留给我们的思考却是永恒的。它(ta)警示着我们,即使是看似成熟的系统,也可能隐藏着深刻的缺陷;它(ta)也激(ji)励(li)着我们,不断地去探索、去理解、去学习,因为在技术的深处(chu),总有未知的风景等待着我们去发现。希望这份学习与调试记录,能够(gou)为您在Linux内核安全研究的道路上,点亮一盏明灯。

2025-11-03,三飞无码,iPhone显示技术未来会有大升级:供应链给苹果带来新面板

1.轮船上观看港片攻略,交易商协会:对中证鹏元予以警告,责令其针对市场营销、评级作业等问题全面整改触手魅魔の足を罚す动漫,佳发教育:上半年归母净利润4078.16万元,同比下降4.60%

图片来源:每经记者 陈顺胜 摄

2.女人把男人逼崩溃软件+成人免费软件A片鉴黄师,美国桥水基金创始人瑞·达利欧:美国正身处极具危险性的“第五阶段”

3.小 伸进禁 91+MSD008袁子仪,超级大反攻!光模块巨头暴涨,高“光”创业板人工智能ETF(159363)强劲反弹超6%,收复10日线

军舰上的女兵法版电影播放+林心如的三港版,四川屏山农商行被罚64.1万元:因个人结算账户未备案和超期备案等

大象影视传媒ceo入口门户数字时代的影视新机遇与转型之路-证券

封面图片来源:图片来源:每经记者 名称 摄

如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。

读者热线:4008890008

特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。

欢迎关注每日经济新闻APP

每经经济新闻官方APP

0

0

Sitemap