是的,这个权限提升漏洞已在 Linux 内核中游荡了8年
翻译:360代码卫士团队
Check Point 公司披露称,驱动中的一个安全漏洞导致最新的 Linux 内核版本中存在本地权限提升问题。
这个安全漏洞很可能导致拥有访问易受攻击权限驱动权限的本地用户从敏感的内核内存中读取或写入该内存。该漏洞的编号是 CVE-2018-8781,可被用于提升本地权限。
该漏洞影响 ”DisplayLink” 中 “udl” 驱动的 “fb_helper” 文件操作中定义的内部 mmap() 函数,通过简单的搜索即可发现它。
由于驱动一般执行的是自己的文件操作函数版本,因此容易出现执行错误,而这个漏洞的出现恰恰证明了这一点。
事实上,使用 mmap() 函数的驱动会遭多种常见漏洞的影响,如缺少输入验证和整数溢出等。
研究人员解释称,典型的驱动拥有一个内部缓冲区,用于表示与外围设备共享的内存区域,而应该仅允许用户访问这个缓冲区中的内存范围。
函数 mmap() 的原型包含许多可遭攻击者控制的字段,而开发人员应当执行一系列检测避免可能存在的整数溢出问题以清除多种问题。
Check Point 公司指出,开发人员必须执行三项检查:区域开始: 0 <= 偏移 < 缓冲区结束长度;区域结束长度:缓冲区开始的长度<= 偏移 + 长度 <= 缓冲区结束长度; 以及区域开始的长度 <= 区域结束长度。
研究人员提到,实际上最后一项检查可省略,因为Linux 内核会清洁输入的长度,因此实际上不可能在通过第三项检查的过程中通过前两项的检查。
研究人员是在仔细研究将物理内存页面映射到用户的重要函数 remap_pfn_range 时发现的这个安全缺陷。他们指出,内核中的 video/drm 模块定义了一个默认的 mmap() 封装器,调用了由特定驱动定义的真实 mmap() 函数。
这个漏洞是个典型的整数溢出问题:由于存在无符号的偏移量,因此第一项检查被跳过;然而, “offset + size” 的计算可绕过第二项检查但同时使用非法的 “偏移” 值。
由于64位机器上仅存在48位可访问内存,因此使用巨大的“偏移”绕过检查要求确保 “info->fix.smem_start + offset” 将封装至有效的可映射物理地址。
该漏洞已在上传了模拟易受攻击驱动的 Ubuntu 64 位虚拟机上得到验证。该驱动的 mmap() 函数中包含了在每次测试中需要检查的实现。易受攻击驱动上的针对 mmap() 的两个连续调用通过用户模式代码实现,即清洁检查和漏洞检查。
在内核的 /dev/urandom 实现的页面对齐物理地址中设置缓冲区地址分别导致输出正确的物理页面和之前的物理页面。
其它检查表明,用户很可能从映射页面中读写数据。因此结果可导致攻击者在内核空间中触发代码执行。
Check Point 公司总结称,“虽然仅通过简单搜索就发现了这个问题,但8年前它就存在于内核中。它告诉我们,就算是像 Linux 内核这样流行的开源项目,如果你知道从哪里搜索的话也总是会发现漏洞。”
3月18日,研究人员将漏洞披露给 Linux内核团队,后者在同一天发布补丁。3月21日,补丁得到验证后,Linux 内核官方为 CVE-2018-8781 发布补丁并在同一天集成到 Linux 内核中。
关联阅读
原文链接
本文由360代码卫士编译,不代表360观点,转载请注明 “转自360代码卫士www.codesafe.cn”。