seteuid0 · 2014/11/07 16:08
关键字:CVE-2014-0038,内核漏洞,POC,利用代码,本地提权,提权,exploit,cve analysis, privilege escalation, cve, kernel vulnerability
简介
2014年1月31号时,solar在oss-sec邮件列表里公布了该CVE(cve-2014-0038)。这个CVE涉及到X32 ABI。X32 ABI在内核linux3.4中被合并进来,但RHEL/fedora等发行版并没有开启该编译选项,因此未受该CVE影响。Ubuntu系统在近期的版本中开启了该选项,因此收该CVE影响。X32 ABI就是在64位环境中使用32位地址,效率有所提升,相关信息请参照参考资料或google。
漏洞原理
先看该CVE对应的patch
#!c++
diff --git a/net/compat.c b/net/compat.c
index dd32e34..f50161f 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -780,21 +780,16 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
if (flags & MSG_CMSG_COMPAT)
return -EINVAL;
- if (COMPAT_USE_64BIT_TIME)
- return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
- flags | MSG_CMSG_COMPAT,
- (struct timespec *) timeout);
-
if (timeout == NULL)
return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
flags | MSG_CMSG_COMPAT, NULL);
- if (get_compat_timespec(&ktspec, timeout))
+ if (compat_get_timespec(&ktspec, timeout))
return -EFAULT;
datagrams = __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
flags | MSG_CMSG_COMPAT, &ktspec);
- if (datagrams > 0 && put_compat_timespec(&ktspec, timeout))
+ if (datagrams > 0 && compat_put_timespec(&ktspec, timeout))
datagrams = -EFAULT;
return datagrams;
复制代码
该CVE引入的原因就是没有对用户空间的输入信息进行拷贝处理,直接将用户空间输入的timeout
指针传递给__sys_recvmmsg
函数进行处理。
正如patch中的修改方式,当timeout
参数非空时,调用compat_get_timespec
先对timetout
进行处理,而该函数会对用户空间的timeout进行copy处理。
#!c++
int compat_get_timespec(struct timespec *ts, const void __user *uts)
{
if (COMPAT_USE_64BIT_TIME)
return copy_from_user(ts, uts, sizeof *ts) ? -EFAULT : 0;
else
return get_compat_timespec(ts, uts);
}
复制代码
那么我们再来看传递进来的timeout会进行什么操作呢?在 __sys_recvmmsg里面。
#!c++
/*
* Linux recvmmsg