热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

360MarvelTeam云系统漏洞第六弹CVE20168632分析

作者:360MarvelTeam稿费:600RMB(不服你也来投稿啊!)投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿前言360 Marvel Team一直致力于云安全领域技术研

http://p3.qhimg.com/t01c0d121f2a06e8405.jpg

作者:360MarvelTeam

稿费:600RMB(不服你也来投稿啊!)

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

前言

360 Marvel Team一直致力于云安全领域技术研究。在刚刚过去的Pwnfest比赛中一举完成vmware workstation的首次破解,实现虚拟机逃逸攻击全球首秀。团队目前在qemu,kvm,xen,docker,vmware workstation,vmware esxi,linux kernel中都已积累了丰富的漏洞挖掘和利用经验。linux kernel漏洞可以帮助攻击者在虚拟机逃逸之后夺取宿主机最高权限,也可以使黑客完成docker容器攻击,是云系统漏洞攻击链条中非常关键的一环。在这篇文章中,Marvel Team将分享一枚最新公开的linux kernel漏洞的相关研究成果。

360 Marvel Team目前正在招聘 漏洞挖掘&漏洞利用&linux内核及应用层开发 岗位,有兴趣的同学欢迎发简历到tangqinghao@360.cn。


0x0 序

TIPC网络协议也叫透明进程间通信协议,是一种进程间通信的网络协议,原本是为集群间通信特别设计,Linux kernel 自2.6.16版本开始支持TIPC协议,该协议在VxWorks和Solaris操作系统中应用广泛。然而TIPC处理数据切包的代码存在一处堆溢出,可造成特权提升。漏洞说明见:https://access.redhat.com/security/cve/cve-2016-8632。


0x1 漏洞细节

当创建一个TIPC协议的socket后,可以通过很多种方式触发tipc_msg_build。比如说用户态调用connet,TIPC协议栈根据当前socket的状态,需要发送第一个SYN包,然而这时需要调用tipc_msg_build来构造TIPC的协议头(长度可变),如下图:

http://p8.qhimg.com/t01b450fd1f1c547918.png

首先解释几个变量含义:

1. msz : TIPC协议头长度 + 实际发送数据长度。

2. pktmax : 实际上是上层函数传递下来的TIPC协议设置的MTU,该值可从设备MTU继承

3. skb : socket buffer数据结构,其中包含一个char *类型的data指针,指向实际缓冲区

4. dsz : 附加数据的长度

5. mhsz : TIPC协议头长度,该协议内容根据用户态传递的目标地址类型不同而不同

从上图可以看出,如果要发送数据长度小于设备允许的最大传输单元,则数据包不需要切包,可以直接发送出去,否则把数据包按pktmax长度切开,然后依次发送出去。

函数根据pktmax创建socket buff,之后进行两次skb_copy_to_linear_data操作。

http://p3.qhimg.com/t015bbece8ce84913b5.png

两次memcpy的长度是INT_H_SIZE + mhsz:

1. INT_H_SIZE长度固定为40字节

2. mhsz根据目标地址类型不同而不同,可取的值是24、32、40、44、60字节

我在POC中设置mhsz为32字节,那么两次memcpy共拷贝72字节。该函数在memcpy前并没有检查pktmax(MTU)是否小于INT_H_SIZE + mhsz, 然而回溯调用堆栈也没有发现内核检查过MTU的值。

那么在内核其它地方创建一个MTU小于72字节,也就能够造成堆溢出。

接下来就需要寻找TIPC是如何设置MTU的,以得到可用最小的MTU值。内核在调用tipc_msg_build 前会根据目的地址类型不同,调用2种不同方法获取MTU值,但是无论哪种方法其实都是取TIPC link上的MTU值:

http://p6.qhimg.com/t01e355a894a7585548.png

http://p6.qhimg.com/t01fae9e433ce478d83.png

TIPC link是当整个TIPC网络出现2个以上节点后,内核调用tipc_node_link_up自动建立的

http://p7.qhimg.com/t01c873faf07bb08028.png

当TIPC link建立后,n->links结构的mtu属性被赋值,然而这里减去了40字节的头大小,然并卵,还是没有检查合法的最小MTU大小。

http://p2.qhimg.com/t01cf62006bc2f40d04.png

tipc_link_mtu()的值由tipc_link_set_mtu()设置,tipc_link_set_mtu()在整个4.9-rc4内核代码中只有一处调用,就是在tipc_bcbase_select_primary()。

http://p2.qhimg.com/t012d292ce296a33689.png

那么这里可以清晰的看到mtu的值来自于tipc_bearer_mtu(),整个内核只有2处修改过tipc bearer的值,一个是当TIPC网络建立后,内核调用tipc_enable_l2_media()

http://p5.qhimg.com/t01c8e7132e0ce81ca2.png

另一处是当我们在shell中使用类似 `ifconfig eth0 mtu 60 up` 来修改网络设备MTU时,内核调用tipc_l2_device_event():

http://p8.qhimg.com/t0140f6454087b94a44.png

通常情况下网络设备MTU的值是1500,当然这个值最大最小区间需要根据不同的网卡驱动来决定,比如我的网卡驱动是e1000,支持的mtu最小是46

http://p9.qhimg.com/t011d565c2fa391d397.png

那么问题来了:

1. 把设备MTU设置成60(大部分网卡驱动最小支持MTU是60)

2. 创建TIPC网络,当TIPC link建立成功后,内核调用tipc_node_link_up()

3. tipc_node_link_up()这时候又把60减了个40,使得n->links[bearer_id].mtu = 20

4. 调用connect,触发tipc_msg_build,因为最小的TIPC协议头也得24,所以需要切包

5. 以20字节申请socket buffer

6. 第一次调用skb_copy_to_linear_data(skb, &pkthdr, INT_H_SIZE), 溢出40 – 20字节

7. 第二次调用skb_copy_to_linear_data_offset(skb, INT_H_SIZE, mhdr, mhsz),再次溢出mhsz字节

第一步修改设备MTU,用户不得具有CAP_NET_ADMIN权限么,然而如果clone出一个具有user_namespace及net_username的进程则可以轻松修改设备MTU

http://p1.qhimg.com/t016cfedf9b5d65a295.png

http://p3.qhimg.com/t016a54e1f24c9fc04a.jpg


0x2 漏洞影响

大部分网卡驱动最少可以溢出52字节,如果合理布局堆空间,可以造成特权提升。

受影响的较新内核版本:

Linux kernel 4.9-rc4

Linux kernel 4.9-rc3

Linux kernel 4.9

Linux kernel 4.8.3

Linux kernel 4.8.1

Linux kernel 4.8 rc1

Linux kernel 4.8

Linux kernel 4.7.9

Linux kernel 4.7-rc6

Linux kernel 4.7-rc5

+ Redhat Linux 7.2 

+ S.u.S.E. Linux 7.2 

+ S.u.S.E. Linux 7.1 

Linux kernel 4.6.3

Linux kernel 4.6.2

未测试较旧内核版本


0x3 补丁及相关

https://www.mail-archive.com/netdev@vger.kernel.org/msg133205.html

https://access.redhat.com/security/cve/CVE-2016-8632

http://www.securityfocus.com/bid/94211/info

传送门

360 Marvel Team虚拟化漏洞第一弹 – CVE-2015-6815 漏洞分析

360 Marvel Team虚拟化漏洞第二弹 – CVE-2015-5279 漏洞分析

360 Marvel Team虚拟化漏洞第三弹 – CVE-2015-7504 漏洞分析(含高清视频)

360 Marvel Team虚拟化漏洞第四弹 – CVE-2015-8567 漏洞分析

360 Marvel Team虚拟化漏洞第五弹 – CVE-2016-3710 Dark Portal漏洞分析


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
author-avatar
看具戴_370
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有