Linux 内核垃圾收集器中的竞争条件可能导致权限提升

谷歌零号项目团队的 Jann Horn 曾发现 Spectre 和 Meltdown 漏洞,并发布了利用 Linux 内核垃圾收集器漏洞(CVE-2021-4083)的技术。 该漏洞是由于清理 unix 套接字上的文件描述符时的竞争条件造成的,并且可能允许本地非特权用户在内核级别执行其代码。

这个问题很有趣,因为竞争条件发生的时间窗口估计太小,无法创建真正的漏洞利用,但该研究的作者表明,如果漏洞利用创建者具有以下能力,即使是这种最初持怀疑态度的漏洞也可能成为真正的攻击源必要的技能和时间。 Yann Horn 展示了如何借助精细操作,减少同时调用 close() 和 fget() 函数时发生的竞争条件,形成完全可利用的释放后使用漏洞,并实现对已释放数据的访问内核内部的结构。

在同时调用 close() 和 fget() 的同时关闭文件描述符的过程中会出现竞争条件。 对 close() 的调用可能发生在 fget() 执行之前,这将使垃圾收集器感到困惑,因为根据引用计数,文件结构不会有外部引用,但仍会附加到文件描述符,即垃圾收集器会认为它具有对该结构的独占访问权,但实际上,在很短的时间内,文件描述符表中的剩余条目仍然会指向正在释放的结构。

为了增加进入竞争条件的可能性,使用了多种技巧,这使得在引入特定于系统的优化时可以将利用成功的概率提高到 30%。 例如,为了将访问具有文件描述符的结构的时间增加数百纳秒,通过在另一个 CPU 内核上的活动中乱扔缓存来从处理器缓存中驱逐数据,这使得从内存而不是从内存中检索结构成为可能。快速的CPU缓存。

第二个重要功能是使用硬件定时器生成的中断来增加竞争条件时间。 选择这个时刻是为了在发生竞争条件时触发中断处理程序并中断代码的执行一段时间。 为了进一步延迟控制权的返回,使用epoll在等待队列中生成了大约50万个条目,这需要通过中断处理程序进行搜索。

利用该漏洞的技术在 90 天的保密期后被披露。 该问题从内核 2.6.32 开始出现,并于 5.16 月初修复。 该修复包含在内核 2021 中,并且还转移到了内核的 LTS 分支和发行版中提供的内核包。 值得注意的是,该漏洞是在分析类似问题 CVE-0920-XNUMX 时发现的,该漏洞在垃圾收集器处理 MSG_PEEK 标志时表现出来。

来源: opennet.ru

添加评论