植物百科网
当前位置: 首页 农业百科

linux内核bug(Linux内核权限提升漏洞)

时间:2023-06-08 作者: 小编 阅读量: 3 栏目名: 农业百科

攻击者可利用此漏洞向由只读文件支持的页面缓存中的页面写入数据,从而提升权限。create_pipe_files()函数调用get_pipe_inode()函数获取一个inode,并初始化相关数据结构。get_pipe_inode()函数又调用alloc_pipe_info()函数分配一个pipe_inode_info,该结构体是一个内核pipe结构体,用于管道的管理和操作。

一、漏洞详情

近日,研究人员披露了一个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()函数,该函数实现代码如下:

【一>所有资源关注我,私信回复”资料“获取<一】1、网络安全学习路线2、电子书籍(白帽子)3、安全大厂内部视频4、100份src文档5、常见安全面试题6、ctf大赛经典题目解析7、全套工具包8、应急响应笔记

首先初始化pipe_bufs为PIPE_DEF_BUFFERS,该值为16,然后分配pipe,接着判断pipe_bufs*PAGE_SIZE的大小,pipe_bufs最大值为128,最小值为2。

然后开始分配pipe->bufs,正常一次性分配16个pipe_buffer,然后初始化pipe的相关成员,这里并不会初始化pipe_bufs中的pipe_buffer。piper_buffer结构体定义如下:

其中page用于存放数据,大小为一个页面,ops为对应内存页面操作集,成员flags为buffer类型。这16个pipe_buffer构成一个管道缓冲区的循环数组,pipe->head指向缓冲区生产点,pipe->tail指向消费点,在pipe的管理下,循环地用于数据的读取和写入。

当向管道中写入数据时,会调用pipe_write()函数,该函数部分实现代码如下:

首先从pipe->head开始,判断pipe是否为满的。不满的情况下,拿出一个pipe_buffer,判断page是否已分配,未分配随即分配一个新page,然后初始化这个pipe_buffer相关成员,实现代码如下:

行527,将buf->flags设置为PIPE_BUF_FLAG_CAN_MERGE,表示该buffer是可以合并的。最后调用copy_page_from_iter()函数将数据拷贝到新分配的page中。当从管道中读取数据时,就是逆过程,其间并不改变既定buffer的页面类型,不再赘述。

(二)splice系统调用实现

splice是Linux 2.6.17新加入的系统调用,用于在两个文件间移动数据,而无需内核态和用户态的内存拷贝,但需要借助管道(pipe)实现。大概原理就是通过pipe buffer实现一组内核内存页(pages of kernel memory)的引用计数指针(reference-counted pointers),数据拷贝过程中并不真正拷贝数据,而是创建一个新的指向内存页的指针。也就是说拷贝过程实质是指针的拷贝,称为零拷贝技术。

调用splice系统调用时,内核中会调用do_splice()函数,该函数实现代码如下:

分三种情况,第一种为in/out均为pipe类型,第二种是in为pipe类型,第三种是out为pipe类型,这里我们分析第三种情况。调用spilce_file_tp_pipe()函数将数据写入pipe中,具体会调用到generic_file_splice_read()函数,这里以linux-2.6.17内核版本为例,更容易理解零拷贝过程。该函数实现如下:

然后调用到__generic_file_splice_read()函数,该函数实现代码如下:

首先获取in->f_mapping,该结构体是用于管理文件(struct inode)映射到内存的页面(struct page)的,其实就是每个file都有这么一个结构,将文件系统中这个file对应的数据与这个file对应的内存绑定到一起。然后定义一个splice_pipe_desc结构体,该结构体用于中转file对应的内存页。接下来就是将file对应的内存页面整理放在spd中,过程比较复杂,略过。最后调用splice_to_pipe()函数操作pipe和spd,该函数实现关键代码如下所示:

依次循环地从spd->pages中取出内存页放在对应的buf->page中。可以看出这里仅仅是对内存页面进行转移,而没有进行任何内存拷贝。

三、漏洞原理与补丁(一)漏洞原理

在linux-5.16.10内核中,调用splice()函数将数据写入管道时,调用路径如下所示:

比linux-2.6.17内核版本的复杂,最终会调用copy_page_to_iter_pipe()函数操作内存页面,该函数实现代码如下:

如前文所述,从pipe中取出buf,只是替换了ops,page,offset和len,并没有修改buf->flags,因此该buffer所包含的页面是可以合并的。当再次向管道中写入数据时,因为pipe非初次使用,首先判断要写入的buffer类型,如果buf->flags为PIPE_BUF_FLAG_CAN_MERGE,行466,直接调用copy_page_from_iter()函数进行内存拷贝,而目的地址为buf->page,这个buf->page实际上就是来自file中对应的内存页面。

(二)补丁

该漏洞补丁在copy_page_to_iter_pipe()函数和push_pipe()函数中,将buf->flags置零。其中push_pipe()函数可在其他路径中触发,不再赘述。

四、利用分析

首先,调用pipe创建管道并通过写读操作将管道中的buffer类型设置为PIPE_BUF_FLAG_CAN_MERGE。

然后将要覆盖的文件通过splice写入到pipe中,公开的利用中被覆盖的文件为/usr/bin/pkexec,因为该程序具备suid能力。

触发漏洞后,此时pipe中buf所包含的内存页面均是指向/usr/bin/pkexec文件所属的内存页面,而且内存页面都是可以合并的。最后再次调用write()函数将提权payload写入pipe中,即写入/usr/bin/pkexec文件中,然后运行/usr/bin/pkexec提升权限。

,
    推荐阅读
  • 空气含量中最多的气体(空气含量中最多的气体介绍)

    空气中含量最多的气体是氮气,氮气约占空气体积分数的百分比约为78%。通过实验测定,空气的成分按体积计算,氮气大约占78%、氧气占21%、稀有气体0.94%、二氧化碳0.03%、其他气体和杂质0.03%,也就是说空气中含量最多的物质是氮气。氮气化学性质很不活泼,在高温高压及催化剂条件下才能和氢气反应生成氨气;在放电的情况下才能和氧气化合生成一氧化氮;即使Ca、Mg、Sr和Ba等活泼金属也只有在加热的情形下才能与其反应。

  • 文思豆腐羹如何做好吃(文思豆腐羹用什么豆腐)

    文思豆腐是一道有名的淮扬菜,需要的就是精湛的刀工,这样做出的文思豆腐会有嫩滑的口感,打造入口即化的口感。文思豆腐羹如何做好吃文思豆腐羹材料和做法步骤一、文思豆腐羹材料准备好豆腐400克,鸡脯肉,火腿还有香菇,再有准备好生菜,冬笋,调料需要准备盐和味精。

  • 结构性存款可以买理财吗(结构性存款是存款吗)

    雪球产品就是今年年初监管向信托公司进行窗口指导,要求叫停的产品。简单的说,这是一种高风险的金融衍生品,它通过持有一定结构的金融衍生品,来实现在某一特定情况下获利。这样的投资结构就能保证我不论涨,还是跌,只要在一定幅度内都可以盈利。交易期权等金融衍生品,是非常高风险的投资。

  • 正言厉色意思(正言厉色的意思)

    下面内容希望能帮助到你,我们来一起看看吧!正言厉色意思正言厉色,汉语成语,拼音是zhènɡyánlìsè,意思是形容板着脸,神情非常严厉。出自《汉书·王莽传》。宝玉突然想出一个主意,一本正经地给她讲扬州黛山林子洞耗子精偷香芋的故事,黛玉见他正言厉色,以为真有其事,后来才发现原来是在取笑她。

  • 面谈调薪酬有什么技巧(跟老板谈调薪的技巧有哪些)

    如果你在老板心目中分量很大,一般老板都会给你加薪的。和老板谈加薪时目的一定要明确,让老板知道你只是为了加薪,而不是辞职走人。和老板谈加薪后,一定要给老板一个考虑的时间,不要咄咄逼人,逼着老板加薪。老板也要有足够的思考时间,来考虑你是否值得加薪,给你加薪后对公司有没有什么影响。不仅口头上要表示感谢,工作中要更加努力,让老板觉得给你加薪是值得的。

  • 杏花有没有香味(杏花闻起来会特别香吗)

    杏树是中国著名的观赏树木,可配植于庭前、墙隅、道路旁、水边,也可群植、片植于山坡、水畔,是春季主要的观赏树种。杏花直径2至3厘米,先于叶开放。花梗短,长1至3毫米,被短柔毛。花萼紫绿色,萼筒圆筒形,外面基部被短柔毛。萼片卵形至卵状长圆形,先端急尖或圆钝,花后反折。花瓣圆形至倒卵形,白色或带红色,具短爪。

  • 减肥减肚子的方法(怎么减肚子呢)

    减肥减肚子的方法食用健康食品:酸奶与发酵的牛奶能激活消化必须的物质,有助于改善肠道微生物系统,从而防止腹部隆起。走路、喝水、按摩:走路及喝水有利腹部扁平。

  • 新坑翡翠手镯多少钱(新坑翡翠手镯的价格)

    新坑翡翠手镯多少钱?新坑翡翠手镯多少钱翡翠手镯作为大件翡翠制品,用料特别多,只有大块、质量好的翡翠原石才能打造成手镯,因此翡翠手镯的价格都比较高,商家们拿到质量比较好的原石也尽可能打造成手镯。具体到新坑种翡翠,因为大多数新坑种翡翠透明度都不高,质地也不够细腻,因此种水一般都是以糯种或豆种为主,极少出现冰种或冰种以上的种水,这样的翡翠价格价格自然不会太高,一个品质比较好的糯种翡翠手镯大概在十万以内。

  • 宁波毛蚶做法水煮几分钟(毛蚶煮多长时间可以吃)

    宁波毛蚶做法水煮几分钟毛蚬是很多人喜欢吃的食物,不过建议大家在做之前都要先用开水煮以下。强精益气,提高精液质量,增强精子活力。适用于治疗肾阳虚所致的阳痿、腰痛、小便频数及补五脏之气不足。可治疗全身水肿,小便不利等。能软化和保护血管,有降低人体中血脂和胆固醇的作用。

  • 2022洛阳湿地公园最新名单 洛阳生态公园最新消息

    国家级湿地自然保护区河南黄河湿地国家级自然保护区,面积24000公顷。国家级湿地公园嵩县陆浑湖国家湿地公园,面积4222.39公顷伊川伊河国家湿地公园,面积1384.36公顷。