0x00 背景介绍

2017年11月24日, OSS社区披露了一个由独立安全研究员Mohamed Ghannam发现的一处存在于Linux 内核Netlink socket子系统(XFRM)的漏洞,漏洞编号CVE-2017-16939。

360CERT经过实际验证,确认该漏洞确实存在,但poc作者认为存在UAF漏洞,存在提权的可能性,而我们认为并没有UAF,只是使用未初始化链表造成的crash(空指针引用),并且使用的内存已经被初始化了,实际上无法提前布局,不能进一步利用达到提权的目的。

0x01 漏洞概述

Netlink 是一种特殊的 socket,它是一种在内核与用户间进行双向数据传输的一种方式,用户态应用使用标准的 socket API 就可以使用 Netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 Netlink。

XFRM是 Linux 2.6 内核为安全处理引入的一个可扩展功能框架,用来在数据包经过路由路径的过程中对其进行修改。

漏洞原因是:在调用xfrm_dump_policy_done函数之前,如果不事先调用xfrm_dump_policy,会导致链表没有被初始化,造成空指针引用,产生崩溃。官方修正的补丁添加了xfrm_dump_policy_start函数,确保调用done之前会进行初始化。

0x02 漏洞攻击面影响

1. 影响版本

影响Linux Kernel 2.6.28~4.14之间的版本

影响版本链接:

2. 修复版本

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

0x03 漏洞详情

1. 技术细节

在函数 static int netlink_dump(struct sock *sk) 中:

(/net/netlink/af_netlink.c)

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

所以当 atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf 时,不应调用 cb->done(cb),且nlk->cb_running 应设为 false。否则在 static void netlink_sock_destruct(struct sock *sk) 函数中:

该函数会在close(socketfd)时触发。该函数检测到 nlk->cb_running 不为 false,就会调用 done() 函数,即 xfrm_dump_policy_done(),导致 crash。

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()):

3. 漏洞分析总结

crash 原因分析:

原本程序理想流程是 xfrm_dump_policy() -> xfrm_dump_policy_done(), xfrm_dump_policy() 时会检查 callback 中的一个双向链表是否有初始化,若没有,则初始化之(空链)。

而 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):

在__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),最终造成空指针引用。

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

0x04 修复建议

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

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

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

0x05 时间线

2017-10-19 git上commit漏洞补丁

2017-11-24 OSS-SEC邮件组公布漏洞信息

2017-11-27 360CERT发布分析预警通告

0x06 参考文档

linux内核安全数据,【漏洞分析】Linux内核XFRM权限提升漏洞分析预警(CVE–2017–16939)...相关推荐

  1. Linux Polkit 中的pkexec 组件存在的本地权限提升漏洞(CVE-2021-4034)修复方法及centos6和centos7的安装包

    近日安全监测发现Linux Polkit 中的pkexec 组件存在的本地权限提升漏洞(CVE-2021-4034),pkexec应用程序为 Linux 系统预装工具,漏洞影响Ubuntu.Debia ...

  2. Linux Kernel ‘CLONE_NEWUSER|CLONE_FS’本地权限提升漏洞

    漏洞名称: Linux Kernel 'CLONE_NEWUSER|CLONE_FS'本地权限提升漏洞 CNNVD编号: CNNVD-201303-281 发布时间: 2013-03-15 更新时间: ...

  3. CVE-2021-3560 Polkit权限提升漏洞复现与分析

    0x00 简介 Polkit是Linux上的一个系统服务,其用于实现权限管理,通过给非特权进程授权,允许具有特权的进程(或者库文件lib)给非特权进程提供服务,由于Polkit被systemd使用,所 ...

  4. hadoop漏洞_【漏洞公告】CVE-2017-7669:Apache Hadoop远程权限提升漏洞

    Apache Hadoop是支持数据密集型分布式应用,并以Apache 2.0许可协议发布的软件框架.近期,国外安全研究人员发现,在Apache Hadoop 2.8.0版本.3.0.0-alpha1 ...

  5. Linux内核网络数据包发送(三)——IP协议层分析

    Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...

  6. Linux内核网络数据包发送(二)——UDP协议层分析

    Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...

  7. 游戏安全资讯精选 2017年第十六期:房卡式棋牌游戏涉赌博风波,抓娃娃火爆市场背后的安全隐患需警惕,Linux内核的Huge Dirty Cow权限提升漏洞...

    [每周游戏行业DDoS态势] [游戏行业安全动态]房卡式棋牌游戏涉赌博风波 概要:近日隔壁棋牌游戏公司先后因涉赌被处理的消息,引发业内广泛关注.多名业内人士认为,出现这种事,并不应该由房卡模式来&qu ...

  8. CVE-2020-8835: Linux Kernel 信息泄漏/权限提升漏洞分析

    CVE-2020-8835: Linux Kernel 信息泄漏/权限提升漏洞分析 360-CERT [360CERT](javascript:void(0)

  9. CVE-2021-33909:Linux本地权限提升漏洞

    Linux本地权限提升漏洞影响大多数Linux发行版. 漏洞概述 Qualys研究人员在Linux kernel中发现一个本地权限提升漏洞--Sequoia,该漏洞是Linux kernel文件系统层 ...

最新文章

  1. FTP服务器的搭建及简单应用
  2. Python图像处理:图像腐蚀与图像膨胀
  3. linux spec 脚本,关于linux:shell脚本的单元测试
  4. 思路+步骤+方法,三步教你如何快速构建用户画像?
  5. 如何理解遗传算法中的编码与解码?以二进制编码为例
  6. zhongdexing-pro
  7. 【kafka】Kafka ConsumerOffsetChecker 命令失效问题解决 卡死
  8. 未经专业销密的计算机设备,DOC1-题
  9. 【超参数】深度学习中 number of training epochs,iteration,batch-size
  10. php pdo 抛出异常模式,php实现的PDO异常处理操作分析
  11. C/C++ 程序设计员应聘常见面试试题深入剖析(2)
  12. 勒让德多项式学习笔记
  13. 客户端软件接口怎么测试,ApiPost怎么使用 ApiPost接口测试使用教程
  14. mysql 1093_mysql ERROR 1093 (HY000)
  15. hdu2037-简单dp
  16. resolv.conf文件
  17. 随记(七):Jboss漏洞检测利用工具
  18. 浅谈链表的构建,next到底是什么
  19. 如何培养孩子的阅读兴趣
  20. Notepad++安装JsonViewer插件

热门文章

  1. javac编译 编码GBK的不可映射字符
  2. 产品认证之EMC术语
  3. outlook邮箱无法收到邮件的坑
  4. 安卓基础-ADSP/CDSP编译
  5. 解决“Cannot add foreign key constraint”
  6. 国际电信协会常务理事吕廷杰:互联网3.0正在到来
  7. 微软用翻译软件制作Windows中文版?
  8. c语言编写函数求回文数,C语言求回文数(详解版)
  9. Armv8 -A架构学习
  10. 毕业设计做个3D赛车游戏