CVE-2016-5195(dirtycow)

漏洞影响范围

Linux kernel>2.6.22 (released in 2007)

漏洞分析

在线代码地址:/mm/gup.c

总结来说(偷下懒,具体可以参考链接第三个,或者星盟公开课)就是获取页面时,会使用get_user_pages函数来获取。但因为存在cow机制,对不可写页通过mem文件写入时会产生一个不会实际写入文件的副本,且该副本的页表被内核释放时其读写权限不变,再次调页映射回来会是原本文件的页表,这样就造成了对不可写文件的漏洞。

相应知识

madvice

函数定义:

1
2
#include <sys/mman.h>
int madvise(void *addr, size_t length, int advice);

这个函数是用来建议内核对addr~addr+len这部分内存进行何种操作。MADV_DONTNEED代表近期不会访问该内存,内核将释放掉这一内存以节省空间,相应页表项也会被置空。

mem文件

/proc/pid/mem这个文件是程序内存的映射,同时当前用户是具有对该文件的读写权限的,因此可以通过对该文件的写入达到对不可写段进行修改的目的,

漏洞复现

传送

参考链接

Linux高危漏洞Dirtycow整理

对大型页面使用mmap和madvise

【漏洞分析】CVE-2016-5195 Dirtycow: Linux内核提权漏洞分析