简介

2022年03月07日,国外安全研究员Max Kellermann披露了一个Linux内核本地权限提升漏洞 CVE-2022-0847。攻击者通过利用此漏洞可进行任意可读文件重写,将普通权限用户提升到 root权限。该漏洞原理类似于 CVE-2016-5195(Dirty Cow),因此作者将此漏洞命名为“Dirty Pipe”。

漏洞作者原文:https://dirtypipe.cm4all.com

影响范围

  • Linux内核版本大于等于5.8,或小于5.16.11,5.15.25,5.10.102

漏洞原理

  • 页面(Page):CPU管理的最小内存单位, 一个页面通常为4kB大小, linux内存管理的最底层的一切都是关于页面的, 文件IO也是如此, 如果程序从文件中读取数据, 内核将先把它从磁盘读取到专属于内核的页面缓存(Page Cache)中, 后续再把它从内核区域复制到用户程序的内存空间中;
  • 管道(Pipe):一种用于单向进程间通信的工具, 它包含一个输入端和一个输出端, 程序将数据从一段输入, 从另一端读出; 在内核中, 为了实现这种数据通信, 需要以页面(Page)为单位维护一个环形缓冲区(通过pipe_buffer实现), 它通常最多包含16个页面, 且可以被循环利用,如果最近的写入没有完全填满页面,则后续写入可能会附加到该现有页面而不是分配新页面。;
  • 零拷贝(Zero-copy):如果每一次都把文件数据从内核空间拷贝到用户空间, 将会拖慢系统的运行速度, 也会额外消耗很多内存空间, 所以出现了splice()系统调用, 它的任务是从文件中获取数据并写入管道中, 期间一个特殊的实现方式便是: 目标文件的页面缓存数据不会直接复制到Pipe的环形缓冲区内, 而是以索引的方式(即内存页框地址、偏移量、长度 所表示的一块内存区域)复制到了pipe_buffer的结构体中, 如此就避免了从内核空间向用户空间的数据拷贝过程, 所以被称为"零拷贝";
  • 匿名管道缓冲区工作方式:当一个程序使用管道写入数据时, pipe_write()调用会处理数据写入工作, 默认情况下, 多次写入操作是要写入环形缓冲区的一个新的页面的, 但是如果单次写入操作没有写满一个页面大小, 就会造成内存空间的浪费, 所以pipe_buffer中的每一个页面都包含一个PIPE_BUF_FLAG_CAN_MERGE属性, 该属性可以在下一次pipe_write()操作执行时, 指示内核继续向同一个页面继续写入数据, 而不是获取一个新的页面进行写入,这就是匿名管道缓冲区的工作方式(anon_pipe_buf_ops)。

程序使用splice函数进行拷贝文件时,由于函数copy_page_to_iter_pipe 和 push_pipe缺乏对其flags成员的初始化,未清除页面的PIPE_BUF_FLAG_CAN_MERGE属性,通过将新数据写入以特殊方式准备的管道,就可以覆盖页面缓存中的数据,从而实现任意可读文件覆盖写入。

漏洞利用

利用条件

  1. 攻击者必须具有读取权限(因为它需要拼接一个页面到管道中)
  2. 偏移量不能位于页面边界上(因为该页面的至少一个字节必须已拼接到管道中,即不能为0或4096的倍数)
  3. 写入不能跨越页面边界(因为将为其余部分创建一个新的匿名缓冲区)
  4. 无法调整文件大小(因为管道有自己的页面填充管理,并且不会告诉页面缓存追加了多少数据)

利用步骤

  1. 创建管道。
  2. 用任意数据填充管道(在所有环条目中设置 PIPE_BUF_FLAG_CAN_MERGE 标志)。
  3. 排空管道(在 struct pipe_inode_info环上的所有 struct pipe_buffer 实例中保留设置的标志)。
  4. 将目标文件(使用 O_RDONLY 打开)中的数据从目标偏移之前的位置拼接到管道中。
  5. 将任意数据写入管道;由于设置了 PIPE_BUF_FLAG_CAN_MERGE,此数据将覆盖缓存的文件页面,而不是创建新的异常结构 pipe_buffer。

Exp

经过改良的版本:https://haxx.in/files/dirtypipez.c,该Exp通过将设置UID和GID为0并执行/bin/sh的shellcode注入到SUID程序,生成新的SUID程序/tmp/sh,运行/tmp/sh直接获取root权限shell。

实例

使用上边的Exp,如图:

使用漏洞作者提供的Poc,如图:

参考

https://sensorstechforum.com/cve-2022-0847-linux-kernel/

https://paper.seebug.org/1843/

CVE-2022-0847(Dirty Pipe)相关推荐

  1. 2022年(23届)电子信息/通信工程保研|四非上岸浙大的保研之旅(浙大、中科大、哈工大、东南、南开、西电、成电等)

    目录 一.个人简介 二.投递/面试情况 三.保研准备 四.面试经历(每个学院具体的入营/面试/录取情况在相应的链接里面) 1.南开大学电子信息与光学工程学院(6.24) 2.吉林大学通信工程学院(6. ...

  2. 塔米狗知识|2022中央企业(央企)名单

    塔米狗知识|2022中央企业(央企)名单!近期,部分中央企业对外公告了一批假冒国企名单,明确有关公司及其下设各级子公司均为假冒国企,与中央企业无任何隶属或股权关系,也不存在任何投资.合作.业务等关系, ...

  3. 命名管道(Named Pipe)服务

    命名管道(Named Pipe)服务 1  命名管道的名称解析 在Windows中,管道的名称遵循Windows统一命名规范(UNC,Universal Naming Convention). 命名管 ...

  4. VSCode前端必备插件2022版(持续更新)

    VSCode前端必备插件2022版(持续更新) VSCode作为我们前端主流的开发工具,优势自然在于它的扩展插件,可以有效地提高开发效率和团队协作,本文提高的都是UP主亲测,最底下贴入我的vscode ...

  5. 脏牛(Dirty COW)漏洞攻击实验(SEED-Lab:Dirty-COW Attack Lab)

    <脏牛(Dirty COW)漏洞攻击实验> 目录 <脏牛(Dirty COW)漏洞攻击实验> **一:实验目的** **二:实验步骤与结果** **漏洞原理:** **COW机 ...

  6. 2022年(23届)电子信息/通信工程夏令营保研/考研复试经验贴(中南大学物理与电子学院篇)

    一.个人简介 学校及专业:四非通信工程 绩点排名:1/170 CET6:487 CET4:554 科研经历:二区SCI论文1篇,主持重点领域支持国家级大创1项 竞赛奖项:互联网+国铜.挑战杯国铜.节能 ...

  7. 中国科学技术大学电子工程与信息科学系、先进技术研究院、科学岛篇|2022年(23届)电子信息/通信工程夏令营保研/考研复试经验贴

    一.个人简介 学校及专业:四非通信工程 绩点排名:1/170 CET6:487 CET4:554 科研经历:二区SCI论文1篇,主持重点领域支持国家级大创1项 竞赛奖项:互联网+国铜.挑战杯国铜.节能 ...

  8. 【持续更新】 2022年 (2023届) 计算机 软件 保研经历 保研经验贴 (菜鸟 211 低rank 无科研成果 复旦/浙大/西安交大/中山/武大/华师大/东南/国科大杭高院)

    写在最前 保研之旅已经画上句号了.作为一名边缘人,在排名.竞赛.科研.英语上都很平庸的普通人,一路走来,有太多的不易,太多的心酸. 在保研的过程中,从学长学姐和各类保研经验贴中获取了太多的帮助,汲取了 ...

  9. 【深度学习】语义分割:论文阅读:(CVPR 2022) MPViT(CNN+Transformer):用于密集预测的多路径视觉Transformer

    这里写目录标题 0详情 1摘要 2 主要工作 3 网络结构 3.1 Conv-stem 3.2 Multi-Scale Patch Embedding 3.3 Multi-path Transform ...

最新文章

  1. android启动服务的生命周期,android Service启动运行服务 生命周期
  2. python3 类字符串名实例化对象
  3. Hibernate Collection乐观锁定
  4. java学习(61):适配器
  5. 文本数据增强+NER
  6. 阿里终面:为什么应用刚启动的时候比较卡,过一会就好了?
  7. 美团面经-java开发
  8. 力扣——分数排名(数据库的题
  9. Python 基础测试题(含答案)
  10. Lena.jpg 与图像处理的渊源
  11. Beyond Compare 30天评估期结束解决办法
  12. 怎样用手机计算机打出分数,分数怎么打出来
  13. C语言杨辉三角前15行,C语言输出杨辉三角前n行(低时间复杂度)
  14. Linux下载源码编译出错,编译小度wifi源码出错!
  15. 小米商城前端页面(静态)
  16. QML 语法(Syntax)
  17. 创可贴温度计,0排放温室气体:提前领略冬奥会的科技看点
  18. python调用pyd失效
  19. 绘画新手怎么把人物骨骼画好
  20. Java *2.22(财务应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题。以整数值作为输入,其最后两位代表的是美分币值。例如:1156就表示11美元56美分。

热门文章

  1. 解决电脑上用耳机时声音太小的问题
  2. 简单网络拓扑及相应的配置
  3. GooglePlay应用上架完整流程
  4. 计算机与技术专业学e语言庅,计算机科学与技术专业课程有哪些 主要学什吗
  5. Facebook在美上线相亲功能,微软AI成为麻将冠军!...|一周热闻回顾
  6. MacOS 10.15 Laravel框架 使用 Box/Spout 导入导出Excel
  7. 用python爬取《龙岭迷窟》评论,看看比同系列鬼吹灯作品以及《盗墓笔记》好在哪里?
  8. Django学习之模型层---多表操作之查(一)
  9. php 生成微信小程序码(可携带参数) 永久有效,数量暂无限制
  10. java计算长方形面积代码小数_求一个计算正方形面积的Java程序