CVE-2022-0847:Dirty pipe Linux本地提权漏洞

CVE-2022-0847:Dirty pipe Linux本地提权漏洞

时间:2023-05-17 作者:安帝科技-CSX安全实验室


管道pipe是一种特殊的文件系统,可以将两个独立的程序连接在一起,使得它们能够通过管道来进行数据传输。
利用该漏洞,对创建的管道进行某些操作后,可达到篡改只读文件缓存的目的,当系统读取此文件时,便会访问到被篡改的内容,达到修改无写入权限文件的效果。

Part1 漏洞状态

Part2 漏洞描述


分析环境:
Centos8 内核版本5.9.1

Part3 漏洞分析

进行漏洞验证,验证程序运行前为cve账户权限,通过该漏洞,将只读文件/etc/passwd内root账户密码修改为”aaron”,成功后使用su root,输入修改后的密码,手动切换至root账户,提升权限。

查看Linux pipe源码,在pipe.c内,在管道进行写入时, pipe_write()函数内,会将pipe缓冲区的flags置为”PIPE_BUF_FLAG_CAN_MERGE”,表示该管道可被写入。此处修改于linux 5.8被引入。

此漏洞的利用还需要使用splice()函数,该函数可通过管道,在文件描述符之间进行数据拷贝,实现零拷贝的效果。
使用该函数的使用主要目的为将文件映射进管道,关键点在于,该函数会将目标文件的物理页直接赋值给管道缓冲区,并且不会将缓存flag进行修改,这导致再次向管道内写入数据时,因buf->flag为”PIPE_BUF_FLAG_CAN_MERGE”,后续的数据写入,会继续写入到该缓冲区内。
该漏洞的利用逻辑为:
1.创建管道。
2.通过pipe_write(),将所有页面缓存flag置为”PIPE_BUF_FLAG_CAN_MERGE”。
3.通过pipe_read()清空管道

4.通过splice()将有读权限的目标文件,部分读入管道。

5.使用pipe_write(),向管道内继续写入内容,达到篡改目标文件缓存。
完成后,在访问该文件时,一定时间内,系统会优先访问缓存内的内容,达到越权的目的。
该漏洞已于Linux 5.16.11、5.15.25 和 5.10.102版本修复。

在Splice()的调用链内,对buf->page置0,避免了此问题发生。

Part5 修复建议

升级Linux内核至5.16.11、5.15.25、5.10.102及以上版本。
————————————————
获取更多情报
联系我们,获取更多漏洞情报详情及处置建议,让企业远离漏洞威胁。
电话:18511745601
邮箱:shiliangang@andisec.com