FastJson 远程代码执行漏洞分析报告
2019-07-12 19:17

报告编号: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 版本等特性。即可产生多种多样的利用。

总结:

  1. 存在 Class.class 对 checkAutoType 的绕过
  2. val 中的值经过 objVal-> strval loadClass(strVal...)
  3. cache 参数为 true
  4. 第二轮 checkAutoType 提前获得了 clazz 并返回
  5. 完成对应的反序列化

漏洞修复

.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 发布分析

0x06 参考链接

  1. Fastjson· Issue #2513 · alibaba/fastjson

  2. Fastjson 反序列化漏洞预警 - 360CERT