CVE-2014-0038内核漏洞原理与本地提权利用代码实现分析

本文深入探讨了CVE-2014-0038内核漏洞的原理,该漏洞涉及X32 ABI,并可能导致本地提权。通过分析补丁和利用代码,解释了如何构造特定的timeout结构体以触发提权。文章还介绍了exploit代码的工作方式,展示了如何通过系统调用修改内核函数地址,实现用户空间的代码执行。
摘要由CSDN通过智能技术生成

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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值