一、漏洞详情
近日,研究人员披露了一个Linux内核本地权限提升漏洞,发现在copy_page_to_iter_pipe和 push_pipe函数中,新分配的pipe_buffer结构体成员“flags”未被正确地初始化,可能包含旧值PIPE_BUF_FLAG_CAN_MERGE。攻击者可利用此漏洞向由只读文件支持的页面缓存中的页面写入数据,从而提升权限。该漏洞编号为CVE-2022-0847,因漏洞类型和“DirtyCow”(脏牛)类似,亦称为“DirtyPipe”。
*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。
二、相关系统调用实现
(一)pipe系统调用实现
调用pipe()创建一个管道,返回两个文件描述符,fd[1]为读,fd[2]为写。这里以linux-5.16.10内核代码为例,调用到__do_pipe_flags()函数,该函数代码实现如下:
首先调用create_pipe_files(),然后调用get_unused_fd_flags()分别获取未使用的文件描述符fdr和fdw,并写入到指针fd中。create_pipe_files()函数调用get_pipe_inode()函数获取一个inode,并初始化相关数据结构。get_pipe_inode()函数又调用alloc_pipe_info()函数分配一个pipe_inode_info,该结构体是一个内核pipe结构体,用于管道的管理和操作。具体看下alloc_pipe_info()函数,该函数实现代码如下: