报告编号:B6-2019-071201
报告来源:360-CERT
报告作者:360-CERT
更新日期:2019-07-12
约 15 日前,知名 Java JSON 组件 FastJson autotype 的问题再度被提及。
fastjson
在处理 json 对象的时候 @type
字段的处理上存在一些问题。导致远程代码 执行。
据了解,该漏洞已在 2018 年 10 月完成修复。目前,漏洞利用方式被公开且该组件使用量巨大。
但该漏洞目前披露的漏洞方式依赖于 rmi。 而 Java 自身的安全机制早已限制 rmi 的相关 活动。
360CERT 判断该漏洞危害严重。影响面有限。
建议广大用户对自身的业务/产品进行组件自查,确认 fastjson
版本至少升级到 1.2.58
。
fastjson
< 1.2.48
此处仅针对一种情况进行了分析和验证,可能还有其他复数的利用方式没有涵盖。建议广大 用户及时升级,避免资产受到损害。
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 版本等特性。即可产生多种多样的利用。
总结:
checkAutoType checkAutoType
.47
与 .48
的区别
2018 年 8-10 月 fastjson
已经针对 autotype
问题进行修复
fastjson
的最新版本为 1.2.58
下载地址
建议广大用户对自身的业务/产品进行组件自查,确认 fastjson
版本至少升级到 1.2.58
。
同时确认自身服务的 Java
环境版本,低于 8u121
7u13
6u141
的用户也请及时升级环境版本,以防受到其他严重漏洞影响。
2019-06-26用户 github issue
2019-07-10PoC 疑似被广泛披露
2019-07-11360CERT 发布预警
2019-07-12360CERT 发布分析
Fastjson· Issue #2513 · alibaba/fastjson
Fastjson 反序列化漏洞预警 - 360CERT