linux使普通用户获得root权限的vmsplice系统调用漏洞分析

2008期末课程小论文 之一

《linux使普通用户获得root权限的vmsplice系统调用漏洞分析》

vmsplice系统调用是linux内核2.6.17第一次引入的,随后被发现存在能让普通用户提升到root权限的漏洞。该漏洞影响的版本网络上笼统的说法是:2.6.17-2.6.24.1,实际上更确切的说是:2.6.17- 2.6.22.17,2.6.23-2.6.23.15 和 2.6.24-2.6.24.1.

关于这个漏洞,国内很少有人写过什么原创性的文章进行介绍,因为上研究生操作系统课的课程报告就是做这个,所以把它放上来。漏洞虽然已经补上,但学习其机理,还是比较有好处,有意思的。

一、预备知识

1. 本文的一些约定

这个颜色的代码来自攻击程序
这个颜色的代码来自内核
这个颜色表示重要的地方,或者安装程序逻辑,下一步要进入的函数
所提到的攻击代码是本文附带的exp.c

2. vmsplice()介绍

原型:long vmsplice(int fd, const struct iovec *iov, unsigned long nr_segs, unsigned int flags);
其中:

struct iovec
{
void __user *iov_base;
__kernel_size_t iov_len;
};

这个系统调用将用户空间的内存映射到内核空间,从而避免了实际的内存写操作,提高了系统效率。这个功能的是主要是通过fs/splice.c的do_vmsplice()来实现。

3. 有关Page的常量

#define PAGE_SHIFT 12
#define PAGE_SIZE (1UL << PAGE_SHIFT)
/*1UL:32位的unsigned int 1,左移12位,PAGE_SIZE=0×1000*/
#define PAGE_MASK (~(PAGE_SIZE-1))
/*PAGE_MASK=0×000*/

二、Splice系统调用漏洞考古

2006 Jun 18
在发布的Linux kernel 2.6.17中引入vmsplice(),用于提高性能。
没有人知道,对应的fs/splice.c中的get_iovec_page_array()函数存在漏洞。

[相关文章]