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