报告编号:B6-2019-071201
报告来源:360-CERT
报告作者:360-CERT
更新日期:2019-07-12
0x00 漏洞背景
约 15 日前,知名 Java JSON 组件 FastJson autotype 的问题再度被提及。
fastjson
在处理 json 对象的时候 @type
字段的处理上存在一些问题。导致远程代码
执行。
据了解,该漏洞已在 2018 年 10 月完成修复。目前,漏洞利用方式被公开且该组件使用量巨大。
但该漏洞目前披露的漏洞方式依赖于 rmi。 而 Java 自身的安全机制早已限制 rmi 的相关 活动。
360CERT 判断该漏洞危害严重。影响面有限。
建议广大用户对自身的业务/产品进行组件自查,确认 fastjson
版本至少升级到
1.2.58
。
0x01 影响版本
fastjson
< 1.2.48
0x02 漏洞详情
此处仅针对一种情况进行了分析和验证,可能还有其他复数的利用方式没有涵盖。建议广大 用户及时升级,避免资产受到损害。
fastjson
中负责处理的一般都是 DefaultJSONParser.parseObject
此处判断如果含有 @type
标记,就把 value 作为类来加载。
而传入的值通过了this.config.checkAutoType
的校验,成功返回对应的 class 并赋值
给 clazz。
通过 this.config.getDeserializer
获得反序列化的路由类 MiscCodec
,依据获得
clazz 的类型处理。当在这里为 Class.class
的时候便会调用 TypeUtils.loadClass
fastjson
受影响版本中 TypeUtils.loadClass
cache 参数默认为 True
此处就会将对应的 objVal-> strVal 的值进行加载,并且缓存进 mapping。
由于这类函数在实现的时候,设计模式一般都以递归/循环逐层的方式去处理,让代码机构清晰,且高
效。那么第二个字段@type
在进入的时候,因为第一层的处理 mapping 中已经多了对应的
值。this.config.checkAutoType
在工作的时候。正常情况都拿不到 clazz。然后就去
mapping 中寻找
结果存在,导致允许加载。然后成功获得了 clazz 接着就直接返回
导致原生的 AutoType
相关检查被绕过。成功反序列化了对象。然后就根据 Java 版本等特性。即可产生多种多样的利用。
总结:
- 存在 Class.class 对
checkAutoType
的绕过 - val 中的值经过 objVal-> strval loadClass(strVal...)
- cache 参数为 true
- 第二轮
checkAutoType
提前获得了 clazz 并返回 - 完成对应的反序列化
漏洞修复
.47
与 .48
的区别
0x03 漏洞证明
2018 年 8-10 月 fastjson
已经针对 autotype
问题进行修复
0x04 修复建议
fastjson
的最新版本为 1.2.58
下载地址
建议广大用户对自身的业务/产品进行组件自查,确认 fastjson
版本至少升级到
1.2.58
。
同时确认自身服务的 Java
环境版本,低于 8u121
7u13
6u141
的用户也请及时升级环境版本,以防受到其他严重漏洞影响。
0x05 时间线
2019-06-26 用户 github issue
2019-07-10 PoC 疑似被广泛披露
2019-07-11 360CERT 发布预警
2019-07-12 360CERT 发布分析