Fastjson反序列化远程代码执行漏洞产生原因及修复建议

Fastjason是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。由于其序列化jason文件速度快且中文文档非常全面,所以为国内广大开发人员所应用。

fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快。

第三方独立测试结果可参考:https://github.com/eishay/jvm-serializers/wiki

一、漏洞产生原因:

Fastjson使用黑白名单用于防御反序列化漏洞,并允许用户在输入JSON串时通过“@type”键对应的value指定任意反序列化类名。在特定条件下可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大(也就是通常所指的“Gadget”)。

二、受影响的版本:

特定依赖存在下影响 ≤1.2.80

三、漏洞等级:

风险评级:高危

四、官方修复方案:

1. 升级到1.2.83版本

从源代码可以看到:

- 该版本源代码删除了很多白名单对应的hash;

- checkAutoType(String typeName, Class<?> expectClass, int features)方法,添加了新的校验包含mask和autoTypeSupport,用来规避未经验证的autoType的注入。

2. 原来1.2.68以后到1.2.80的版本:开启配置safeMode,让白名单和黑名单都不支持autoType,从而可杜绝反序列化Gadgets类变种攻击。

在1.2.68版本中,fastjson增加了safeMode的支持。safeMode打开后,完全禁用autoType。所有的安全修复版本sec10也支持SafeMode配置。

  • 打开SafeMode功能(1.2.68之后的版本)

有三种配置SafeMode方式,如下:

①在代码中配置

ParserConfig.getGlobalInstance().setSafeMode(true);

注意,如果使用new ParserConfig的方式,需要注意单例处理,否则会导致低性能full gc。

②加上JVM启动参数

-Dfastjson.parser.safeMode=true

如果有多个包名前缀,用逗号隔开

③通过fastjson.properties文件配置。

通过类路径的fastjson.properties文件来配置,配置方式如下:

fastjson.parser.safeMode=true

  • safeMode场景如何做autoType

在1.2.68之后的版本,提供了AutoTypeCheckHandler扩展,可以自定义类接管autoType, 通过ParserConfig#addAutoTypeCheckHandler方法注册。

 

  • 怎么判断是否用到了autoType

看序列化的代码中是否用到了SerializerFeature.WriteClassName

JSON.toJSONString(obj, SerializerFeature.WriteClassName); // 这种使用会产生@type

  • 使用JSONType.autoTypeCheckHandler

在fastjson 1.2.71版本中,提供了通过JSONType配置autoTypeCheckHandler的方法,比如:

 

 

 

 

来源:https://github.com/alibaba/fastjson/wiki/fastjson_safemode

WuKong静态软件安全测试工具

WuKong是一款国产信创SAST产品,采用自主专利技术的程序分析引擎,多种创新性的静态分析技术,结合深度学习和人工智能等多种方法,能够对软件代码进行全方位的 安全扫描和安全分析。

posted @ 2022-06-01 15:33  中科天齐软件原生安全  阅读(2913)  评论(0编辑  收藏  举报