CVE-2021-33909:Linux 本地权限提升漏洞
Linux 本地权限提升漏洞影响大多数 Linux 发行版。
漏洞概述
Qualys 研究人员在 Linux kernel 中发现一个本地权限提升漏洞——Sequoia,该漏洞是 Linux kernel 文件系统层中的 size_t-to-int 类型转化漏洞。漏洞 CVE 编号为 CVE-2021-33909,攻击者利用该漏洞可以在大多数 Linux 发行版上获得 root 权限。
Linux 文件系统
Linux 文件系统是存储设备上数据和元数据的组织形式,控制着数据的存储、提取,其最重要的功能是管理用户数据。Linux 文件系统接口以分层架构实现,可以将用户接口层与文件系统实现、以及操作存储设备的驱动隔离开来。
技术细节
Linux kernel 的 seq_file 接口可以生成包含记录序列的虚拟文件。每个记录都必须与一个 seq_file 缓存相适配,缓存可以根据需要扩大,参见 242 行代码:
m->size 是 size_t(无符号 64 位整数),但是 size_t 也会传递给 size 参数为 int(有符号 32 位整数)而非 size_t 的函数。比如,227 行调用的 show_mountinfo()函数调用了 150 行的 seq_dentry()函数,该函数会调用 530 行的 dentry_path(),该函数会调用 387 行的 prepend():
因此,如果非特权的本地攻击者创建、挂载或删除了完整路径长度超过 1GB 的目录结构,同时如果攻击者使用 open()和 read()打开和读取/proc/self/mountinfo,那么:
◼在 seq_read_iter()中,就会分配一个 2GB 的缓存(242 行),并调用 show_mountinfo()(227 行);
◼在 show_mountinfo()中,seq_dentry()以及 2GB 的空缓存会被调用(150 行);
◼在 seq_dentry()中,dentry_path()以及 2GB 大小会被调用(530 行);
◼在 dentry_path()中,int buflen 是负的(INT_MIN, -2GB),p 指向-2GB 的偏移量,同时会调用 387 行的 prepend();
◼在 prepend()中,*buflen 会减少 10 字节,并成为更大的正的 int(13 行),*buffer 会减少 10 字节,并指向-2GB-10B 的偏移量(16 行),10 字节的字符串“//deleted”会越界写(17 行)。
漏洞影响
攻击者利用该漏洞可以在有漏洞的主机(默认配置情况下)上使非特权用户获得 root 权限。Qualys 安全研究人员还独立验证了该漏洞,开发了漏洞利用,并在以下版本中获得了完全 root 权限:
◼Ubuntu 20.04;
◼Ubuntu 20.10;
◼Ubuntu 21.04;
◼Debian 11;
◼Fedora 34 。
其他 Linux 发行版理论上也受到该漏洞的影响。
评论