Dirty COW Attack Lab
1 实验概述
Dirty COW是竞争危害中的一个有趣案例。自从2007年开始它就已经存在于Linux之中,但直到2016年10月份才被发现和利用。这一个漏洞几乎影响所有的以Linux为基础发展起来的操作系统,包括安卓,因此产生了严重的后果:攻击者可以通过该漏洞获得ROOT权限。该漏洞存在于Linux内核的Copy-On-Write(这就是为什么我们称为dirty COW Attack)代码中。通过该漏洞,攻击者可以修改任何受保护的文件,即便对于这些文件,攻击者仅有读权限。
本实验的主要目的是让学生获得D-COW-Attack的上手经验,了解竞争条件下产生的该漏洞。从而对于一般的竞争条件漏洞有了更深的理解。在本实验中,学生将学会利用该攻击来获得root权限
2 Task1:修改只读文件
该项任务的目的就是利用Dirty-COW漏洞来对一个只读文件进行写操作。
2.1 创建一个只读文件
首先,需要选择一个目标文件。虽然目标文件可以使系统内任一的可读文件,但是为了防止实验过程可能出现的错误影响系统的安全,将使用一个自己创建的只读文件
。请在root目录
下创建一个为zzz
的文件,修改其对普通用户的权限为只读
,然后利用编辑器例如gedit随意输入一些内容
。
由上面可以看到,zzz文件对于普通用户的权限为只读,所以,如果在普通用户下对该文件进行写操作会失败
,接下来尝试对zzz文件写入
,看看是否失败,验证一下
可以由上面看到,写入失败。但是,因为Dirty-COW在系统中的漏洞,我们可以找到方法来对该文件进行写入。我们的目标是把目标模式串“XXXXXX”用“******”进行替换。
2.2 设置内存映射线程
可以从实验的网站下载程序cow_attack.c
。 (具体代码在文末
)该程序拥有三个线程:主线程,写线程,madvise线程
( madvise()这个函数可以对映射的内存提出使用建议,从而提高内存)。主线程的作用是把/zzz文件映射到内存中
,并且定位到目标模式XXXXXX处
,然后创建了两个新的线程来利用Dirty-COW竞争条件漏洞
。
在下面的代码中,我们可以看到,在定位到目标模式XXXXXX处的时候,程序使用了一个字符串strstr()来找XXXXXX在被映射的内存块里的位置
,接着开始另外两个线程。
2.3 设置写线程
写线程的任务即为在内存中用******实现对字符串XXXXXX的替换
。由于被映射的内存块使用的是Copy-On-Write机制,单单运行该线程仅仅可以对内存中的/zzz文件的映像进行更改,并不能对磁盘上的/zzz文件内容有任何影响。
2.4 The madvise Thread
madvise()线程仅仅做一件事:抛弃在内存中更改前文件映像,以至于页表可以把指针指向会更改后的映射内存块。
madvise(MADV_DONTNEED)基本功能是清除被管理的内存映射的物理页。
就当前情况而言,在调用完该函数后,提到的这些页将被clear。当下一次用户尝试访问这些内存区域时,原始的内容会重新从磁盘或者页缓存中导入,而对于匿名的堆内存,则会填充零。
2.5 发起攻击
如果write()和madvise()系统调用是交替被唤醒,比如一个调用总是在另一