linux内核学习锁的机制教程(如何做好linux内核安全处理)

技术怎么进行Linux内核XFRM权限提升漏洞的分析怎么进行Linux内核XFRM权限提升漏洞的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0x00

如何分析Linux内核XFRM的权限提升漏洞,相信很多没有经验的人都不知所措。因此,本文总结了问题产生的原因和解决方法,希望大家能通过这篇文章来解决这个问题。

0x00 背景介绍

2017年11月24日,OSS社区披露了Linux内核的Netlink socket Subsystem (XFRM)中的一个漏洞,被独立安全研究员穆罕默德汉纳姆发现。漏洞号CVE-2017-16939。

360CERT的实际验证证实了该漏洞确实存在,但poc作者认为存在UAF漏洞,存在解除权限的可能。但是我们认为没有UAF,只是利用链表未初始化导致的崩溃(空指针引用),使用的内存已经初始化,实际上无法提前布局,也无法进一步利用来达到提升权限的目的。

0x01漏洞概述

Netlink是一种特殊的套接字,是内核和用户之间双向数据传输的一种方式。用户模式的应用可以通过使用标准的套接字API来使用Netlink提供的强大功能,内核模式的应用需要使用特殊的内核API来使用Netlink。

XFRM是Linux 2.6内核为安全处理引入的可扩展功能框架,用于在路由路径期间修改数据包。

造成该漏洞的原因是,如果在调用xfrm_dump_policy_done函数之前没有调用xfrm_dump_policy,链表将不会被初始化,导致指针引用为空,从而导致崩溃。正式修订的补丁添加了xfrm_dump_policy_start函数,以确保在调用done之前执行初始化。

0x02漏洞攻击面影响

1.影响版本

影响2.6.28到4.14之间的Linux内核版本

影响版本链接:

http://www.securityfocus.com/bid/101954

2. 修复版本

该漏洞已作为1137 b5e(“IpSec:修复异常xfrm策略转储崩溃”补丁)的一部分得到解决,该补丁已在4.14-rc7版本中修复。

0x03漏洞详情

1.技术细节

在函数static int netlink _ dump(struct sock * sk)中:

(/net/netlink/af_netlink.c)

怎么进行Linux内核XFRM权限提升漏洞的分析

在上面的代码中,我们可以看到当sk-sk_rcvbuf小于或等于sk_rmem_alloc(注意我们可以通过stockpot控制sk-sk_rcvbuf)时,netlink_dump()检查失败,它会跳到函数的末尾并退出,但cb_running的值不会更改为false。

因此,当atomic _ read(sk-sk _ rmem _ alloc)=sk-sk _ rcv buf时,不应调用cb-done(cb),nlk-cb_running应设置为false。否则,在静态void netlink _ sock _ destroy(struct sock * sk)函数中:

怎么进行Linux内核XFRM权限提升漏洞的分析

该功能将在关闭时触发(socketfd)。当函数检测到nlk-cb_running不为false时,将调用done()函数,即xfrm_dump_policy_done(),导致崩溃。

formation/20210522/347/528760.png" alt="怎么进行Linux内核XFRM权限提升漏洞的分析">

2.  poc的验证分析

原作者 poc 中的执行流程如下:

(1)do_setsockopt() :改小 sk->sk_rcvbuf 值

(2)send_msg(fd,&p->msg):

第一次发送时,atomic_read(&sk->sk_rmem_alloc) = 0 < sk->sk_rcvbuf,发送之后,sk->sk_rmem_alloc 累加,结果在第一次发送后:

atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf

(3)send_msg(fd,&p->msg):

第二次发送之后,此时atomic_read(&sk->sk_rmem_alloc)>= sk->sk_rcvbuf,未调用 done(),但 nlk->cb_running 值保持为 true。

(4)close(fd):调用cb->done(cb),产生崩溃。

按上述原理,其实即使不调用 “do_setsockopt();”改小 sk->sk_rcvbuf 值,只要多次 send,那么当 sk->sk_rmem_alloc 累加到超过 sk->sk_rcvbuf值,再次 send 后,“close(fd)”或进程退出时,就会导致 crash。

原 poc 改为如下也可触发(不调用do_setsockopt()):

怎么进行Linux内核XFRM权限提升漏洞的分析

3.  漏洞分析总结

crash 原因分析:

原本程序理想流程是 xfrm_dump_policy() ->xfrm_dump_policy_done(),

xfrm_dump_policy() 时会检查 callback 中的一个双向链表是否有初始化,若没有,则初始化之(空链)。

怎么进行Linux内核XFRM权限提升漏洞的分析

而 xfrm_dump_policy_done()时默认上述链表已初始化,不再检查,直接读写。如前文所述,多次 send 就可以造成:

atomic_read(&sk->sk_rmem_alloc)>= sk->sk_rcvbuf

导致 netlink_dump() 中跳过 xfrm_dump_policy() ,即没有初始化链表,所以 close(fd) 时,xfrm_dump_policy_done() 就会操作未初始化内存,导致 crash。

那么若能提前布局这块内存,则可实现任意地址写值(通过双向链表del操作)。但是,无论是否触发初始化链表的操作,在之前这块内存都会被memset(0):

怎么进行Linux内核XFRM权限提升漏洞的分析

在__netlink_dump_start函数里 memset(0) 后,才调用netlink_dump。接下来 netlink_dump中做sk_rmem_alloc >= sk_rcvbuf 的检测,失败后就不去xfrm_dump_policy 了。到后面 xfrm_dump_policy_done 用到的就是之前 memset(0) 的内存。这样就是缺少了 xfrm_dump_policy 过程中的初始化链表操作(INIT_LIST_HEAD),最终造成空指针引用。

怎么进行Linux内核XFRM权限提升漏洞的分析

所以这只是使用未初始化链表造成的crash(空指针引用),并且使用的内存已经被初始化了,实际上无法提前布局,不能进一步利用达到提权的目的。

0x04 修复建议


建议所有受影响用户,及时进行安全更新,可选方式如下:

1、相关Linux发行版已经提供了安全更新,请通过 yum 或 apt-get 的形式进行安全更新。

2、自定义内核的用户,请自行下载对应源码补丁进行安全更新。

补丁链接:

https://github.com/torvalds/linux/commit/1137b5e2529a8f5ca8ee709288ecba3e68044df2

看完上述内容,你们掌握怎么进行Linux内核XFRM权限提升漏洞的分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154904.html

(0)

相关推荐

  • HBase1.x中Region的拆分是怎样的

    技术HBase1.x中Region的拆分是怎样的这篇文章给大家介绍HBase1.x中Region的拆分是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。第一部门:Region拆分的实现 c

    攻略 2021年11月15日
  • 一筹莫展什么意思,一筹莫展的筹是什么意思

    技术一筹莫展什么意思,一筹莫展的筹是什么意思◎ 一筹莫展 yīchóu-mòzhǎn筹:计策。展:施展。一点计策也想不出;一点儿办法也没有《宋史·蔡幼学传》:“多士盈庭而一筹不吐。”后以“一筹莫展”比喻一点办法也没有。

    生活 2021年10月29日
  • 焦虑症状,抑郁症焦虑症都有些什么症状

    技术焦虑症状,抑郁症焦虑症都有些什么症状焦虑和抑郁都有什么症状?这个问题本来可以网上搜索,但是简明介绍一下的话,会更能够帮助人加深理解焦虑症状。焦虑和抑郁都是典型的心理问题,都是人遇到了某种困难,走不出去,所导致的不良身

    生活 2021年10月26日
  • canvas圆形进度动画(canvas绘制圆形代码)

    技术怎么使用Canvas绘制圆形这篇文章主要介绍“怎么使用Canvas绘制圆形”,在日常操作中,相信很多人在怎么使用Canvas绘制圆形问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使

    攻略 2021年12月21日
  • 使用ogg同步数据给kafka

    技术使用ogg同步数据给kafka 使用ogg同步数据给kafka使用ogg同步数据给kafka两榜进士2017-06-20 14:55:3123011收藏9分类专栏:大数据-Kafka大数据-Kafk

    礼包 2021年10月28日
  • Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗

    技术Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗 Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。

    礼包 2021年11月19日