文章插图
前言
CVE-2022-0847 DirtyPipe
脏管道漏洞是linux
内核中的一个漏洞,该漏洞允许写只读文件,从而导致提权 。调试环境
-
ubuntu 20.04
-
Linux-5.16.10
-
qemu-system-x86_64 4.2.1
漏洞验证
首先创建一个只读文件
foo.txt
,并且正常情况下是无法修改该可读文件,但是利用了DirtyPipe
漏洞后发现可以将字符aaaa
写入到只读文件中文章插图
漏洞分析
【CVE-2022-0847 DirtyPipe漏洞分析】
以
poc
作为切入点,分析漏洞成因首先
poc
创建了一个管道,管道缓冲区的默认大小为4096,并且拥有16个缓存区,因此再创建管道之后,poc
首先要做的是将这16个管道缓冲区填满 。...if (pipe(p)) abort();const unsigned pipe_size = fcntl(p[1], F_GETPIPE_SZ);static char buffer[4096];for (unsigned r = pipe_size; r > 0;) {unsigned n = r > sizeof(buffer) ? sizeof(buffer) : r;write(p[1], buffer, n);r -= n;}...
在进行管道写的操作时,内核是采用
pipe_write
函数进行操作,这里截取了关键部分,在进行管道写的时候会判断通过函数is_packetized
去判断是否为目录属性,如果不是则将缓冲区的标志位设置为PIPE_BUF_FLAG_CAN_MERGE
,这个标志位非常关键,是导致漏洞成因,因此poc
为了使16个管道缓冲区都设置PIPE_BUF_FLAG_CAN_MERGE
标志位,因此选择循环16次,并且将每个管道缓冲区都写满 。文章插图
随着
poc
将管道内的数据全部读出,为了清空管道缓冲区,在进行管道读的过程中,内核采用的是pipe_read
函数,在整个管道读的过程中是不会修改管道的标志位的,因此PIPE_BUF_FLAG_CAN_MEGE
标志位依旧存在...for (unsigned r = pipe_size; r > 0;) {unsigned n = r > sizeof(buffer) ? sizeof(buffer) : r;read(p[0], buffer, n);r -= n;}...
紧接着是触发漏洞的关键函数,
splice
函数,用于移动数据,此时fd
指向我们想读取的文件,对应上述的foo.txt
只读文件,p[1]指向的是我们的管道符 。...ssize_t nbytes = splice(fd, &offset, p[1], NULL, 1, 0);...
在调用
splice
函数时,内核在某个阶段会调用copy_page_to_iter
函数,可以看到当管道满了之后就没办法通过splice
函数往管道内继续输入数据,那么splice
函数就无法正常执行了,因此需要清空管道内的数据 。文章插图
后面则到达了漏洞发生的代码,由于我们使用
splice
函数进行数据的移动,在内核中不是选择将数据直接从文件中拷贝到管道中,而是将文件所在的物理页直接赋值给管道缓冲区所对应的页面 。文章插图
这里记录一下物理页的地址
文章插图
最后就是再次调用管道写的操作,但是这里实际会写入只读文件内部
...nbytes = write(p[1], data, data_size);...
【----帮助网安学习,需要网安学习资料关注我,私信回复“资料”免费获取----】
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
推荐阅读
- Apache再现高危漏洞,已被僵尸网络滥用
- CVE-2022-2602 Linux Kernel 本地权限提升漏洞修复过程
- 多伦多Pwn2Own黑客大赛展示了63个0day漏洞
- 微软杀软Defender有漏洞 可能会永久删除用户文件
- 野蛮生长|《风吹半夏》播出大半,剧情漏洞越来越多,弃剧理由让人无法反驳
- 谷歌:国家黑客仍在利用IE 0day漏洞
- 信仰|谍战剧《信仰》:一个细节太过随意,四大漏洞不合常理
- 短信验证码:运营商在真心保障用户权益?还是规避鉴权漏洞风险?
- 大S|新一轮大戏:大S晒出两份证据可漏洞百出,前夫哥汪小菲正面回击
- 大S|新一轮大戏:大S晒出两份证据却漏洞百出,前夫哥汪小菲正面回击