欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2018-6924:解析FreeBSD ELF 头导致内核内存泄露

来源:本站整理 作者:佚名 时间:2019-07-23 TAG: 我要投稿

2018年9月,FreeBSD发布了安全公告FreeBSD-SA-18:12,修复了影响该操作系统所有版本的内核内存泄露漏洞。
此漏洞(标识为CVE-2018-6924)是由FreeBSD内核在执行二进制文件之前解析二进制文件的ELF头时验证不充分引起的,本地非特权用户可以用它泄露内核的内存内容。
 
0x01 介绍
2018年9月12日,FreeBSD发布了安全公告FreeBSD-SA-18:12,修复了CVE-2018-6924,这是由Thomas Barabosch和Mark Johnston发现的内核内存泄漏漏洞,由内核中错误的ELF头解析引起。如公告中所述,“执行恶意ELF二进制文件可能会导致内核崩溃或泄露内核内存”。有趣的是,所有受支持的FreeBSD版本都受到这个bug的影响,包括版本10,10.4,11,11.1和11.2。
这里提供的分析基于FreeBSD 11.2-RELEASE x64,运行GENERIC内核。
 
0x02 修复情况
安全公告中包含指向修复的源代码补丁链接。让我们先来看看它:
--- sys/kern/imgact_elf.c.orig
+++ sys/kern/imgact_elf.c
@@ -839,7 +839,8 @@
            break;
        case PT_INTERP:
            /* Path to interpreter */
-                   if (phdr[i].p_filesz > MAXPATHLEN) {
+                   if (phdr[i].p_filesz
+                       phdr[i].p_filesz > MAXPATHLEN) {
                uprintf("Invalid PT_INTERPn");
                error = ENOEXEC;
                goto ret;
@@ -870,6 +871,11 @@
            } else {
                interp = __DECONST(char *, imgp->image_header) +
                    phdr[i].p_offset;
+                           if (interp[interp_name_len - 1] != '') {
+                                   uprintf("Invalid PT_INTERPn");
+                                   error = ENOEXEC;
+                                   goto ret;
+                           }
            }
            break;
        case PT_GNU_STACK:
--- sys/kern/vfs_vnops.c.orig
+++ sys/kern/vfs_vnops.c
@@ -528,6 +528,8 @@
    struct vn_io_fault_args args;
    int error, lock_flags;
+   if (offset v_type != VCHR)
+           return (EINVAL);
    auio.uio_iov = &aiov;
    auio.uio_iovcnt = 1;
    aiov.iov_base = base;
此处有两个修改过的文件:sys/kern/imgact_elf.c和sys/kern/vfs_vnops.c。sys/kern/imgact_elf.c文件中包含内核用于在执行二进制文件之前解析二进制文件的ELF头的代码,修复后的函数是这样的:
776 static int
777 __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
778 {
    [...]
因此,影响函数的名称是由__CONCAT和__elfN宏生成的。__CONCAT连接两个参数,而__elfN在sys/sys/elf_generic.h中定义如下:
#define __elfN(x)       __CONCAT(__CONCAT(__CONCAT(elf,__ELF_WORD_SIZE),_),x)
因此,函数名___CONCAT(exec_, __elfN(imgact))扩展为exec_elf32_imgact或exec_elf64_imgact,具体取决于__ELF_WORD_SIZE定义为32还是64。但是如果我们检查sys/kern/目录,会发现存在名为imgact_elf32.c和imgact_elf64.c的两个非常小的文件,它们是将__ELF_WORD_SIZE定义为正确的大小,包含(include)了kern/imgact_elf.c文件,该文件包含易受攻击的函数。因此,内核包含了sys/kern/imgact_elf.c中任何函数的两个版本,其名称用__elfN宏构建:一个版本处理32位ELF二进制文件,另一个版本处理64位ELF文件。

[1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载