第六个漏洞(1、2-3、4、5)的信息已被披露。该漏洞允许非特权本地用户通过覆盖页面缓存中的数据来获取 root 权限。该漏洞的代号为 PinTheft。目前已有一个原型漏洞利用程序可用。尚未分配 CVE 编号。该漏洞的修复程序目前仅以补丁的形式提供,该补丁于 5 月 5 日发布,并于 5 月 11 日被 netdev 分支接受,但尚未包含在内核维护版本中。
该漏洞存在于 RDS(可靠数据报套接字)网络协议的实现中,该协议旨在实现集群节点间高速消息交换,同时最大限度地降低延迟并确保消息送达。在启用了 io_uring 子系统(io_uring_disabled=0)且内核编译时使用了 CONFIG_RDS、CONFIG_RDS_TCP 和 CONFIG_IO_URING 选项的系统上,该攻击是可行的。要使该漏洞利用生效,系统必须存在一个具有 SUID-root 标志的可读可执行文件。
为了自动加载 rds_tcp 内核模块,该漏洞利用程序请求使用 SO_RDS_TRANSPORT=2 传输方式通过 RDS 发送数据。值得注意的是,在测试的发行版中…… Linux 默认情况下,rds内核模块仅在Arch Linux中提供。 Linux要阻止此漏洞,您可以阻止 rds 和 rds_tcp 内核模块的自动加载:rmmod rds_tcp rds printf 'install rds /bin/false\ninstall rds_tcp /bin/false\n' > /etc/modprobe.d/pintheft.conf
该漏洞是由 rds_message_zcopy_from_user() 函数中零拷贝实现的错误引起的。该函数直接修改页面缓存中的数据以避免不必要的缓冲。当程序崩溃时,rm->data.op_nents 字段未被清除,导致双重释放。攻击者利用引用计数器中存在错误值,通过操纵指向固定 io_uring 缓冲区的指针来覆盖页面缓存中的数据。
否则,该漏洞的利用机制与此类漏洞的典型机制相同:攻击者强制将带有 suid root 标志的程序文件存储在页面缓存中,然后在 ELF 文件头中插入启动 /usr/bin/sh 的代码。经过此操作后,启动程序时会从页面缓存加载修改后的副本到内存中,而不是从驱动器加载原始可执行文件。与之前的漏洞利用不同,这种新变种仅适用于攻击“su”实用程序,但如果系统中存在 mount、passwd、chsh、newgrp、umount 和 pkexec 等 suid 程序,也可以利用此漏洞。
来源: opennet.ru
