2017 年反序列化漏洞年度报告 Jackson,fastjson,XStream,XMLDecoder,WebLogic,Struts2,反序列化漏洞,年度报告 背景 2017 年 OWASP 发布了新的十大 web 漏洞威胁,其中 A8:2017 就是不安全的反序 列化,A9:2017-使用含有已知漏洞的组件也和反序列化紧密相连,这是因为在 Java 开发中很多代码都依赖于第三方组件,而这些组件可能会存在反序列漏洞, 典型的例子就是 Jackson,fastjson,XStream,XMLDecoder 等开源组件。序列化 是对象转换成二进制,json,xml 等存储格式。而反序列化恰好相反,则是将二进 制,json,xml 转换成相应的类。 m o c . 5 在 2017 年绿盟科技 NS-SRC 处理的漏洞应急中就有很大一部分是反序列化漏洞, 下面我们来一一分析 2017 年我们应急的那些反序列化漏洞。 总得来说,2017 年 出现的反序列化漏洞和以往反序列漏洞在漏洞形成方式上不太一样,在以往都是由 于 Java 自身的反序列特征导致的漏洞,2017 年则多了 fastjson,Jackson 等,这 两个库都能将 json 文本转换成具体的 java bean,在这个转换过程中会调用相应的 setter 方法和 getter 方法从而导致远程代码执行。2017 年还出现关于 XMLDecoder 和 XStream 的应急,都是因为依赖问题导致的缺陷。 本报告重点回 顾 2017 年绿盟科技重点应急,影响面非常广的那些反序列化漏洞。从这个报告中 能看出反序列化漏洞的发展,攻击方和防御方不停的对抗过程,bypass 和反 bypass 在这个过程中体现得淋漓尽致。 b u 概述 应急路线 h t i g 从 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 反序列化漏洞 m o 2017 年 3 月 15 日,fastjson 官方发布安全公告表示 fastjson 在 1.2.24 及之前版 本存在远程代码执行高危安全漏洞。攻击者可以通过此漏洞远程执行恶意代码来入 侵服务器。fastjson 官方建议直接升级到 1.2.28/1.2.29 或者更新版本来保证系统安 全。4 月 29 日,本文作者绿盟科技安全研究员廖新喜(xxlegend)构造出了 Fastjson 的反序列漏洞的 PoC,引起了安全圈的广泛讨论。详细的分析可参照 1, 下面做简单的回顾。 1.1 补丁 c . 5 h t i g b u 在 ParserConfig.java 中添加了 checkAutoType,不论用户是否开启了 autoTypeSupport 功能,在类名被加载时都需要通过额外的一层处理(来判断是否 在 acceptlist 里),只有满足了此限制的类名才会被加载。另外引入了黑名单机 制,在开启了 autoTypeSupport 的情况下,如果加载的是黑名单中类也会抛出异 常。补丁核心代码如下: public Class<?> checkAutoType(String typeName, Class<?> expectClass) { if (typeName == null) { return null; } if (typeName.length() >= maxTypeNameLength) { throw new JSONException("autoType is not support. " + typeN ame); } final String className = typeName.replace('$', '.'); if (autoTypeSupport || expectClass != null) { for (int i = 0; i < acceptList.length; ++i) { String accept = acceptList[i]; if (className.startsWith(accept)) { return TypeUtils.loadClass(typeName, defaultClassLo ader); } } for (int i = 0; i < denyList.length; ++i) { String deny = denyList[i]; if (className.startsWith(deny)) { throw new JSONException("autoType is not support. " + typeName); } } } Class<?> clazz = TypeUtils.getClassFromMapping(typeName); if (clazz == null) { clazz = deserializers.findClass(typeName); } if (clazz != null) { if (expectClass != null && !expectClass.isAssignableFrom(cl azz)) { throw new JSONException("type not match. " + typeName + " -> " + expectClass.getName()); } return clazz; } m o 1.2 初略分析 c . 5 b u 静态分析得知,要构造一个可用的 poc,肯定得引入 denyList 的库。这里我们就 引入 com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl 类。 h t i g final String NASTY_CLASS = "com.sun.org.apache.xalan.internal.xsltc.tr ax.TemplatesImpl"; String text1 = "{\"@type\":\"" + NASTY_CLASS + "\",\"_bytecodes\":[\""+evilCode+"\"],'_name':'a.b','_t factory':{ },\"_outputProperties\":{ }," + "\"_name\":\"a\",\"_version\":\"1.0\",\"allowedProtocol s\":\"all\"}\n"; System.out.println(text1); Object obj = JSON.parseObject(text1, Object.class, config, Feat ure.SupportNonPublicField); 最核心的部分是_bytecodes,它是要执行的代码,@type 是指定的解析类, fastjson 会根据指定类去反序列化得到该类的实例,在默认情况下,fastjson 只会 反序列化公开的属性和域,而 com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl 中_bytecodes 却是私有 属性,_name 也是私有域,所以在 parseObject 的时候需要设置 Feature.SupportNonPublicField,这样_bytecodes 字段才会被反序列化。_tfactory 这个字段在 TemplatesImpl 既没有 get 方法也没有 set 方法,这没关系,我们设置 _tfactory 为{ },fastjson 会调用其无参构造函数得_tfactory 对象,这样就解决了某些 版本中在 defineTransletClasses()用到会引用_tfactory 属性导致异常退出。整个 PoC 的执行过程的调用栈如下: JSON.parseObject ... JavaBeanDeserializer.deserialze ... FieldDeserializer.setValue ... TemplatesImpl.getOutputProperties TemplatesImpl.newTransformer TemplatesImpl.getTransletInstance ... Runtime.getRuntime().exec 更多的原理分析可见 2 。 1.3 后续官方修补 m o fastjson 官方后续又添加了一些补丁,本文作者给 fastjson 官方提交了两次绕过, fastjson 官方都发布了相应更新。具体如下: c . 5 1. fastjson-1.2.34 版本发布,当 autoType=true 时增强安全防护 2. fastjson-1.2.42 版本发布 Bug 修复安全加固 b u 3. fastjson-1.2.43 版本发布 Bug 修复安全加固 4. fastjson-1.2.44 版本发布 Bug 修复安全加固 h t i g 在 fastjson-1.2.42 版本中通过异或操作混淆了其黑名单,可以阻挡一部分人分析其 黑名单内容,其实这是自欺欺人的。具体的黑名单分析读者可以自行研究。 2 Jackson 反序列化 Jackson 是一个开源的 Java 序列化与反序列化工具,可以将 java 对象序列化为 xml 或 json 格式的字符串,或者反序列化回对应的对象,由于其使用简单,速度 较快,且不依靠除 JDK 外的其他库,被众多用户所使用。但是其组件 Jacksondatabind 可以指定特定的反序列化类,这样就存在代码执行的风险。 2.1 CVE-2017-7525 这个 CVE 是本文作者报告的。下面来看一个
绿盟 2017年反序列化漏洞年度报告
文档预览
中文文档
12 页
50 下载
1000 浏览
0 评论
0 收藏
3.0分
温馨提示:本文档共12页,可预览 3 页,如浏览全部内容或当前文档出现乱码,可开通会员下载原始文档
本文档由 路人甲 于 2022-07-17 01:16:59上传分享