io_uring 中的一个漏洞允许没有权限的用户即使在容器中也可以成为 root

最近 漏洞信息披露 (CVE-2022-29582) 在 io_uring 异步 I/O 接口的实现中,自 5.1 版起包含在 Linux 内核中,它允许非特权用户成为系统上的 root,即使在执行容器漏洞利用时也是如此。

值得一提的是 说漏洞是在 3 个多月前报告的 (大约今年 XNUMX 月初),但直到最近才发布完整的信息和披露。

关于脆弱性,有人提到这 访问已释放的内存块时发生,从 5.10 分支开始出现在 Linux 内核中。

关于漏洞CVE-2022-29582

这个漏洞 允许访问释放的内存 由于在 io_flush_timeouts() 函数中处理超时时出现竞争条件,这e 删除超时条目 从列表中删除它,而不验证此时超时的创建和删除。

其他人已经提供了 io_uring 的更新一般描述。 他们对它的解释比我们好一千倍,所以我们将更广泛地介绍子系统(请参阅这篇 Grapl 安全文章和这篇 Flatt 安全文章以获得很好的介绍)。

更重要的是, 操作码字段确定要执行的操作类型。 对于每个需要它的“操作码”,fd 字段指定要在其上执行请求的 I/O 的文件描述符。 几乎所有正常的 I/O 系统调用(read、sendto 等)都有一个等效的异步操作码。 每个字段可以根据操作承担不同的角色。

一旦从 SQ 中检索到,SQE 就会转换为 struct io_kiocb(内核输入/输出回调)描述的内部表示。 这些对象通常称为请求。

struct io_kiocb 被用作它所基于的 SQE“准备启动”的等价物,其中任何文件描述符都被解析为 struct file*s、附加用户凭据、个性(内核将在其中运行)等.

请求的操作完成后,写入完成队列 (CQ) 对应于 SQE 的条目。 这样的条目称为完成队列条目 (CQE),包含错误代码和结果值等字段。 用户空间应用程序可以轮询 CQ 以获取新条目,以确定发送的 SQE 是否已完成处理以及它们的结果是什么。

提到 有一些场景很容易替换一个对象 关于进展。 但是有两个限制:

  • LT' 必须在比赛窗口中分配和初始化。 也就是说,在 LT 被释放之后,但在到达 LT 中不再被访问的点之前。
  • LT' 只能是另一个 struct io_kiocb 对象。 由于堆隔离,堆中的对象根据它们的类型分开,很难在竞争窗口内将它们重新分配为不同类型的对象。

研究人员准备了一个功能性漏洞利用 它的操作不需要包含用户标识符命名空间(用户命名空间),并且可以在非特权用户在隔离容器中启动漏洞利用时提供对主机的 root 访问权限。

我们的漏洞利用针对的是内核版本 5.10.90,当时 Google 正在远程运行该版本。 我们必须根据服务器的特定规格(4 Skylake Xeon 内核 @ 2.80Ghz,16GiB RAM)调整我们的漏洞利用,但通过一些调整,任何运行易受攻击内核的机器都应该可以利用。

该漏洞利用也适用于 nsjail 环境 隔离在基于 Chromium OS 的 Google COS(Container Optimized OS)发行版上,并在 Compute Engine 虚拟机上的 Google Cloud Platform 上使用。 该漏洞利用旨在与从 5.10 到 5.12 的内核分支一起使用。 最后,值得一提的是 该问题已在 5.10.111 月的更新 5.15.34、5.17.3 和 XNUMX 中修复。

最后,如果您有兴趣了解有关该漏洞的更多信息,可以查阅制作的出版物 在下面的链接中。


成为第一个发表评论

发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责资料:AB Internet Networks 2008 SL
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。