Linux 内核中可篡改只读文件的漏洞

Linux 内核中已发现一个漏洞 (CVE-2022-0847),该漏洞允许任何文件的页面缓存内容被覆盖,包括处于只读模式、使用 O_RDONLY 标志打开或位于文件系统上的文件以只读模式安装。 实际上,该漏洞可用于将代码注入任意进程或损坏打开文件中的数据。 例如,您可以更改 sshd 进程的authorized_keys 文件的内容。 该漏洞利用的原型可供测试。

该问题的代号为 Dirty Pipe,类似于 2016 年发现的严重漏洞 Dirty COW。 值得注意的是,就危险程度而言,Dirty Pipe 与 Dirty COW 处于同一级别,但操作起来要容易得多。 该漏洞是在分析有关从日志服务器下载压缩档案的系统中通过网络下载的文件定期损坏的投诉时发现的(加载的系统在 37 个月内出现 3 次损坏),其准备过程使用了 splice() 操作和无名管道。

该漏洞从 5.8 年 2020 月发布的 Linux 内核 11 开始出现,即存在于 Debian 20.04 中,但不影响 Ubuntu 8 LTS 中的基本内核。 RHEL 15.x 和 openSUSE/SUSE 5.16.11 内核最初基于旧分支,但导致问题的更改可能已向后移植到其中(尚无确切数据)。 您可以在以下页面上跟踪发行版中软件包更新的发布:Debian、SUSE、Ubuntu、RHEL、Fedora、Gentoo、Arch Linux。 版本 5.15.25、5.10.102 和 XNUMX 中提出了对该漏洞的修复。 该修复程序也包含在 Android 平台使用的内核中。

该漏洞是由于函数copy_page_to_iter_pipe()和push_pipe()的代码中缺乏“buf->flags”值的初始化而引起的,尽管在分配结构时和某些操作期间内存并未被清除。无名管道,来自另一个操作的值。 使用此功能,非特权本地用户可以实现标志中 PIPE_BUF_FLAG_CAN_MERGE 值的出现,这允许您通过简单地将新数据写入专门准备的未命名管道来组织页面缓存中的数据覆盖。

对于攻击,目标文件必须是可读的,并且由于写入管道时不会检查访问权限,因此也可以对位于只读安装分区中的文件(例如,对于文件 c CD-只读存储器)。 替换页面缓存中的信息后,当从文件中读取数据时,进程将接收到的不是实际数据,而是替换后的数据。

操作归结为创建一个未命名通道并用任意数据填充它,以确保在与其关联的所有环结构中设置 PIPE_BUF_FLAG_CAN_MERGE 标志。 接下来,从通道读取数据,但在 pipeline_inode_info 环结构中的所有 pipeline_buffer 结构实例中仍保留设置该标志。 然后调用 splice() 将目标文件中的数据读取到未命名管道中,从所需的偏移量开始。 当向这个无名管道写入数据时,由于PIPE_BUF_FLAG_CAN_MERGE标志被设置,页面缓存中的数据将被覆盖,而不是创建pipe_buffer结构的新实例。

来源: opennet.ru

添加评论