聚焦源代码安全,网罗国内外最新资讯!

编译:奇安信代码卫士

趋势科技 ZDI 发布文章,详细描述了2020年6月收到的最近引入的 io_uring 子系统的引用计数漏洞情况。该漏洞导致在任意 file 结构上的释放后使用后果,进而导致内核提权。该漏洞是由 Flatt Security 公司的研究员 Ryota Shiga 发现的。ZDI 指出,该漏洞影响 5.6(含)到5.7(含)之间的版本,其编号为CVE-2021-20226。

漏洞

Linux 内核 5.1 引入一个新的异步 I/O 功能,名为 “io_uring”。该子系统通过批量进行 I/O 操作系统调用进行操作,因此多个 I/O 操作可在一个系统调用中执行。

Linux 内核 5.6 中的IORING_OP_CLOSE 操作实现中存在缺陷。当系统调用向内核线程传递 files_strut 时,io_grab_files() 并不会增加代码注释中所标注 (1) 处的引用基数,从而导致后续被释放的文件结构遭访问。

static int io_grab_files(struct io_kiocb *req)
{
// ... rcu_read_lock(); spin_lock_irq(&ctx->inflight_lock);spin_lock_irq(&ctx->inflight_lock); if (fcheck(ctx->ring_fd) == ctx->ring_file) { list_add(&req->inflight_entry, &ctx->inflight_list); req->flags |= REQ_F_INFLIGHT; req->work.files = current->files;  // <-- (1) ret = 0; } spin_unlock_irq(&ctx->inflight_lock); rcu_read_unlock(); return ret;
}

利用

map_lookup_elem() 和 map_update_elem() 函数可用于利用该漏洞。

static int map_lookup_elem(union bpf_attr *attr)
{ void __user *ukey = u64_to_user_ptr(attr->key); int ufd = attr->map_fd;
// ... f = fdget(ufd);          // <-- (2) map = __bpf_map_get(f);
// ... key = __bpf_copy_key(ukey, map->key_size); key = __bpf_copy_key(ukey, map->key_size); // <-- (3) if (IS_ERR(key)) { err = PTR_ERR(key); goto err_put; } value_size = bpf_map_value_size(map);  // <-- (4) err = -ENOMEM; value = kmalloc(value_size, GFP_USER | __GFP_NOWARN); if (!value) goto free_key; err = bpf_map_copy_value(map, key, value, attr->flags); // <-- (5) if (err) goto free_value; err = -EFAULT; if (copy_to_user(uvalue, value, value_size) != 0) // <-- (6) goto free_value;
// ...
}

注释中 (2) 处的 fdget() 是一个优化后的函数,如果当前任务是 single-thread,则不会增加引用计数。返回的 file 结构 f 可由后续的 IORING_OP_CLOSE 释放。注释 (3) 处的 _bpf_copy_key() 系统调用实际上是 copy_from_user() 的封装。这就使得我们能够使用 userfaultfd 生成竞争条件并触发该漏洞。此时,文件结构 f 及其对应的 map 被释放。可通过 (4) 和 (5) 处的虚假数据对 map 内存进行重新分配。最终,我们可以读取 (6) 处的任意内存并披露用户模式。

利用时间轴如下:

函数 recvmsg() 用于定时控制。通过喷射 setxattr() 即可伪造被释放的 bpf_map。通过 map_update_elem() 即可实现任意写。由于 fdget() 条件的存在,该利用方法仅限于单核环境。

结论

新功能意味着新的攻击面,而新的攻击面通常会导致新漏洞的产生。有兴趣的读者可以看看从这个子系统中是否会找到其它漏洞。无论如何,Ryota 的这份漏洞报告十分出色。Ryota 正是在2021年 Pwn2Own 大赛中凭借演示 Ubuntu 中另外一个提权漏洞而获得3万美元赏金的研究员。让我们一起期待他再创佳绩吧!

推荐阅读

为了研究,可以在 Linux 内核中植入漏洞吗?

三个已存在15年的 Linux 内核漏洞

Linux 内核修复5个高危漏洞

攻击者可提前检测到 Linux 内核的补丁并开发 exploit

原文链接

https://www.zerodayinitiative.com/blog/2021/4/22/cve-2021-20226-a-reference-counting-bug-in-the-linux-kernel-iouring-subsystem

题图:Pixabay License

本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

 觉得不错,就点个 “在看” 或 "赞” 吧~

CVE-2021-20226:详解 Linux 内核 IO_URING 子系统中的引用计数漏洞相关推荐

  1. 详解Linux内核之双向循环链表 By邪恶八进制

    [转载]详解Linux内核之双向循环链表 详解Linux内核之双向循环链表 信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 摘要:      本文详解了内核中面向对象的list ...

  2. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  3. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  4. linux上传文件put,详解Linux ftp 命令行中下载文件get与上传文件put的操作方法

    尽管现在有许多好的FTP应用程序,但服务器命令行ftp命令的应用程序仍然很多,下面就让电脑乐园小编带你一起来学习详解Linux ftp 命令行中下载文件get与上传文件put的操作方法. 介绍:从本地 ...

  5. linux内核中的hook函数详解,linux内核中的hook函数详解

    在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...

  6. 详解Linux内核IO技术栈

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 在开始正式的讨论 ...

  7. 详解Linux内核态调试工具kdump

    目录 1.kdump介绍 1.1.kexec及其实现机制 1.2.几个基本概念 1.3.kdump机制 1.4.kdump执行流程 2.Kdump配置与使用 2.1.内核配置 2.2.安装kdump ...

  8. Linux内核中的vfs,详解linux内核VFS

    虚拟文件系统(VFS) 在我看来, "虚拟"二字主要有两层含义: 1, 在同一个目录结构中, 可以挂载着若干种不同的文件系统. VFS隐藏了它们的实现细节, 为使用者提供统一的接口 ...

  9. linux内核rop姿势详解,Linux内核ROP姿势详解(二)

    前言 在本教程的第1部分中,我们已经演示了如何为我们的系统(3.13.0-32内核-Ubuntu 12.04.5 LTS)找到有用的ROP gadgets用来构建一个用来提权的ROP链.我们还开发了一 ...

最新文章

  1. Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity
  2. Java项目:仿天猫网上商城项目(java+jsp+servlet+mysql+ajax)
  3. Struts2 单个文件上传/多文件上传
  4. Android NFC开发
  5. TensorFlow学习笔记(十二)TensorFLow tensorBoard 总结
  6. UEFI+GPT与BIOS+MBR各自有什么优缺点?
  7. 自动性能统计信息(三)(Automatic Performance Statistics)
  8. 在JVM上对高并发HTTP服务器进行基准测试
  9. ue 编写linux脚本,UltraEdit23 sh文件 (shell脚本)着色
  10. Maven generate/构建项目太慢解决方法
  11. 微信小程序滚动条返回顶部
  12. mongodb启动时报错ERROR: child process failed, exited with error number 1
  13. Eclipse中查看JDK类库的源代码
  14. 如何不做老板手中一次性筷子?
  15. 堪萨斯州立大学计算机科学,美国留学:2019计算机专业最新排名
  16. 从文件结构认识HLS
  17. CSAPP:archlab
  18. HI3861学习笔记(12)——GPIO输入接口使用
  19. 使用Java-Hanlp训练CRF模型
  20. 使用D触发器完成带有异步清零clrn和同步使能wen的8位寄存器

热门文章

  1. maven spring hibernate shiro
  2. 解决关于vs2010中w无法 显示的问题
  3. ***经验之教你穿透ADSL路由***内网
  4. 程序员如何从0到1搭建自己的技术博客
  5. React Hooks 梳理
  6. Java 高级算法——数组中查询重复的数字之二
  7. Nginx反向代理实现负载均衡web集群
  8. MFC入门示例之静态文本框、编辑框
  9. 黄聪:浓缩的才是精华:浅析GIF格式图片的存储和压缩(转)
  10. 开源的数据可视化JavaScript图表库:ECharts