热门标签 | 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漏洞分析


推荐阅读
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • Spring 中策略模式的应用:Resource 接口详解
    本文探讨了在 Spring 框架中如何利用 Resource 接口实现资源访问策略。Resource 接口作为资源访问策略的抽象,通过多种实现类支持不同类型的资源访问。 ... [详细]
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • 本文介绍了编程语言的基本分类,包括机器语言、汇编语言和高级语言的特点及其优缺点。随后详细讲解了Python解释器的安装与配置方法,并探讨了Python变量的定义、使用及内存管理机制。 ... [详细]
  • 微服务优雅上下线的最佳实践
    本文介绍了微服务上下线的正确姿势,避免使用 kill -9 等粗暴手段,确保服务的稳定性和可靠性。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
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社区 版权所有