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


推荐阅读
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • GSIOpenSSH PAM_USER 安全绕过漏洞
    漏洞名称:GSI-OpenSSHPAM_USER安全绕过漏洞CNNVD编号:CNNVD-201304-097发布时间:2013-04-09 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
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社区 版权所有