2017年反序列化漏洞年度报告
2018-01-24
2017年OWASP发布了新的十大web漏洞威胁,其中A8:2017就是不安全的反序列化,A9:2017-使用含有已知漏洞的组件也和反序列化紧密相连,这是因为在Java开发中很多代码都依赖于第三方组件,而这些组件可能会存在反序列漏洞,典型的例子就是Jackson,fastjson,XStream,XMLDecoder等开源组件。序列化是对象转换成二进制,json,xml等存储格式。而反序列化恰好相反,则是将二进制,json,xml转换成相应的类。
在2017年bbin宝盈集团科技NS-SRC 处理的漏洞应急中就有很大一部分是反序列化漏洞,下面我们来一一分析2017年我们应急的那些反序列化漏洞。 总得来说,2017年出现的反序列化漏洞和以往反序列漏洞在漏洞形成方式上不太一样,在以往都是由于Java自身的反序列特征导致的漏洞,2017年则多了fastjson,Jackson等,这两个库都能将json文本转换成具体的java bean,在这个转换过程中会调用相应的setter方法和getter方法从而导致远程代码执行。2017年还出现关于XMLDecoder和XStream的应急,都是因为依赖问题导致的缺陷。 本报告重点回顾2017年bbin宝盈集团科技重点应急,影响面非常广的那些反序列化漏洞。从这个报告中能看出反序列化漏洞的发展,攻击方和防御方不停的对抗过程,bypass和反bypass在这个过程中体现得淋漓尽致。
概述
应急路线
从3月份爆出Fastjson的反序列化特性导致的远程代码执行,四月份则是Jackson,Log4j2,Jenkins的反序列化造成的远程代码执行,接着6月份流出了Weblogic CVE-2017-3248的利用代码。稍微消停了一会,Struts2又被安全研究人员盯上,爆出Struts2-052,又是一个远程代码执行。在11月份,由于Jackson官方对漏洞不敏感,接着又被曝CVE-2017-15095,又一个绕过。登录12月份,Fastjson和Jackson相继发布了几个补丁修复那些黑名单的绕过;Weblogic XMLDecoder(CVE-2017-10352)的漏洞被广泛应用于于挖坑。由于很多漏洞都是远程代码执行,有的一个HTTP POST请求就能getshell,所以备受黑产亲睐。
反序列化漏洞
1 fastjson反序列化漏洞
2017年3月15日,fastjson官方发布安全公告表示fastjson在1.2.24及之前版本存在远程代码执行高危安全漏洞。攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。fastjson官方建议直接升级到1.2.28/1.2.29或者更新版本来保证系统安全。4月29日,本文作者bbin宝盈集团科技安全研究员廖新喜(xxlegend)构造出了Fastjson的反序列漏洞的PoC,引起了安全圈的广泛讨论。详细的分析可参照1,下面做简单的回顾。
后续官方修补
fastjson官方后续又添加了一些补丁,本文作者给fastjson官方提交了两次绕过,fastjson官方都发布了相应更新。具体如下:
1. fastjson-1.2.34版本发布,当autoType=true时增强安全防护
2. fastjson-1.2.42版本发布 Bug修复安全加固
3. fastjson-1.2.43版本发布 Bug修复安全加固
4. fastjson-1.2.44版本发布 Bug修复安全加固
在fastjson-1.2.42版本中通过异或操作混淆了其黑名单,可以阻挡一部分人分析其黑名单内容,其实这是自欺欺人的。具体的黑名单分析读者可以自行研究。
2 Jackson反序列化
Jackson是一个开源的Java序列化与反序列化工具,可以将java对象序列化为xml或json格式的字符串,或者反序列化回对应的对象,由于其使用简单,速度较快,且不依靠除JDK外的其他库,被众多用户所使用。但是其组件Jackson-databind可以指定特定的反序列化类,这样就存在代码执行的风险。
后续官方修补
CVE-2017-15095是CVE-2017-7525的延续,这个漏洞同样也是本文作者报告的。同样是黑名单的绕过。 CVE-2017-17485是CVE-2017-7525的延续,这个漏洞引入的类是org.springframework.context.support.ClassPathXmlApplicationContext利用这个库的bean重新生成类,而这个bean所依赖的xml是由攻击者来定制的。从这里也可以看出黑名单就是个无底洞,深不可见,bypass也是不完。由于Jackson的特性,可以预测,Jackson在2018年还将出现更多的绕过。
3 Struts2
struts2号称漏洞之王,2017应急中就处理了S2-045,S2-046,S2-48,S2-052,S2-055,都是远程代码执行级别的漏洞。S2-045的PoC现在还被黑客用于各种漏洞扫描,挖矿。既然是漏洞之王,那自然少不了反序列化,S2-052(CVE-2017-9805)就是XStream使用不当造成的反序列化。S2-055则是由于Jackson-databind导致的反序列化。这两个漏洞的典型特点都是不恰当的使用第三方库导致的。
S2-052分析
根据官方的描述信息来看,是REST插件使用到XStreamHandler处理xml数据的时候,由于未对xml数据做任何过滤,在进行反序列将xml数据转换成Object时导致的RCE。
S2-055分析
2017年12月1日,Apache Struts发布最新的安全公告,Apache Struts 2.5.x REST插件存在远程代码执行的中危漏洞,漏洞编号与CVE-2017-7525相关。漏洞的成因是由于使用的Jackson版本过低在进行JSON反序列化的时候没有任何类型过滤导致远程代码执行。当然官方说的影响是未知,其实这里是远程代码执行。
4 Weblogic
在2017年,整个Oracle的产品线都深受反序列化影响,其中Weblogic影响面尤其广泛,很多漏洞的CVSS评分都是9.8,9.9甚至为10。
而且CVE-2017-3248的PoC已经在github上,并且被用于黑产,CVE-2017-10352 PoC也被泄露同样被用于黑产。
CVE-2017-3248 分析
这个漏洞(CVE-2017-3248)就是利用rmi机制的缺陷,通过JRMP协议达到执行任意反序列化payload的目的。利用步骤可以分为两步,第一步建立JRMP监听端口,第二步执行反序列化操作,其反序列化内容指向外部的JRMP监听端口,这样在反序列的过程中就会从远程JRMP监听端口加载内容并执行序列化操作,详细的利用工具可以使用ysoserial。
CVE-2017-10352 分析
这个漏洞是由于XMLDecoder这个缺陷库存在代码执行问题,同样也是由于被黑产利用而被大家广泛得知。其实在CVE-2017-3506中,Weblogic官方已经做了一次修补,只是当时的修补不够彻底,后来有研究员给Weblogic提供了绕过的PoC,Weblogic官方再次完整修补。同时这个PoC也被泄露,非常多的用户中招。
对srcip:173.212.217.181溯源跟踪,从bbin宝盈集团科技威胁情报中心NTI中的数据也能看出,该IP从2017年8月份开始,一直被用于特定漏洞扫描以便发现更多具有脆弱性的主机。
总结
从OWASP 2017 top ten报告中可以看出反序列化是一个业内都开始关注重视的漏洞类型,一个原因就是该漏洞很多时候都是通过黑名单的方式的修复,这就导致了层出不穷的绕过,从Jackson,fastjson,weblogic一见端倪,都是修复,绕过,再修复,再绕过,没有尽头。另外一个原因就是该漏洞的危害非常大,通常都是RCE,一个PoC直接获取系统权限,不管是黑产,灰产,开发,运维还有白帽安全人员都非常重视该类型的漏洞。从系统的重要性来看,国内很多商业系统都是基于Java框架开发,这些中间件或者Web容器一旦出现漏洞,整个系统都变得不堪一击,可能造成不可挽回的影响。 对于反序列漏洞的防御,业内也是一个难题,首先得确保所有的依赖库和容器已经更新到最新版本,这样能防止已知漏洞的攻击。另外bbin宝盈集团科技的IPS,WAF都已经具备对这些漏洞的防护能力,更多的防护策略请参考bbin宝盈集团科技下一篇关于反序列化漏洞防御的文档。