<p>Fastjason是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。由于其序列化jason文件速度快且中文文档非常全面,所以为国内广大开发人员所应用。</p><p>fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快。</p><p>第三方独立测试结果可参考:https://github.com/eishay/jvm-serializers/wiki</p><h3><font color="#c24f4a">一、漏洞产生原因:</font></h3><p>Fastjson使用黑白名单用于防御反序列化漏洞,并允许用户在输入JSON串时通过“@type”键对应的value指定任意反序列化类名。在特定条件下可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大(也就是通常所指的“Gadget”)。</p><h3><font color="#c24f4a">二、受影响的版本:</font></h3><p>特定依赖存在下影响 ≤1.2.80</p><h3><font color="#c24f4a">三、漏洞等级:</font></h3><p>风险评级:高危</p><h3><font color="#c24f4a">四、官方修复方案:</font></h3><p><font color="#c24f4a">1. 升级到1.2.83版本</font></p><p>从源代码可以看到:</p><p>- 该版本源代码删除了很多白名单对应的hash;</p><p>- checkAutoType(String typeName, Class<!--?--> expectClass, int features)方法,添加了新的校验包含mask和autoTypeSupport,用来规避未经验证的autoType的注入。</p><p><font color="#c24f4a">2. 原来1.2.68以后到1.2.80的版本:开启配置safeMode,让白名单和黑名单都不支持autoType,从而可杜绝反序列化Gadgets类变种攻击。</font></p><p>在1.2.68版本中,fastjson增加了safeMode的支持。safeMode打开后,完全禁用autoType。所有的安全修复版本sec10也支持SafeMode配置。</p><p><font color="#c24f4a">打开SafeMode功能(1.2.68之后的版本)</font></p><p>有三种配置SafeMode方式,如下:</p><p><b>①在代码中配置</b></p><p>ParserConfig.getGlobalInstance().setSafeMode(true);</p><p>注意,如果使用new ParserConfig的方式,需要注意单例处理,否则会导致低性能full gc。</p><p><b>②加上JVM启动参数</b></p><p>-Dfastjson.parser.safeMode=true</p><p>如果有多个包名前缀,用逗号隔开</p><p><b>③通过fastjson.properties文件配置。</b></p><p>通过类路径的fastjson.properties文件来配置,配置方式如下:</p><p>fastjson.parser.safeMode=true</p><p><font color="#c24f4a">safeMode场景如何做autoType</font></p><p>在1.2.68之后的版本,提供了AutoTypeCheckHandler扩展,可以自定义类接管autoType, 通过ParserConfig#addAutoTypeCheckHandler方法注册。</p><p>// com.alibaba.fastjson.parser.ParserConfig.AutoTypeCheckHandler</p><p> /**</p><p> * @since 1.2.68</p><p> */</p><p> public interface AutoTypeCheckHandler {</p><p> Class<!--?--> handler(String typeName, Class<!--?--> expectClass, int features);</p><p> }</p><p> // co<span style="color: inherit;">// com.alibaba.fastjson.parser.ParserConfig.AutoTypeCheckHandler</span></p><p><br></p><p><font color="#c24f4a">怎么判断是否用到了autoType</font></p><p>看序列化的代码中是否用到了SerializerFeature.WriteClassName</p><p>JSON.toJSONString(obj, SerializerFeature.WriteClassName); // 这种使用会产生@type</p><p><b><font color="#c24f4a">使用JSONType.autoTypeCheckHandler</font></b></p><p>在fastjson 1.2.71版本中,提供了通过JSONType配置autoTypeCheckHandler的方法,比如:</p><p>public class JSONTypeAutoTypeCheckHandlerTest extends TestCase {</p><p> public void test_for_checkAutoType() throws Exception {</p><p> Cat cat = (Cat) JSON.parseObject("{\"@type\":\"Cat\",\"catId\":123}", Animal.class);</p><p> assertEquals(123, cat.catId);</p><p> }</p><p> @JSONType(autoTypeCheckHandler = MyAutoTypeCheckHandler.class)</p><p> public static class Animal {</p><p> }</p><p> public static class Cat extends Animal {</p><p>public int catId;</p><p>}</p><p>public static class Mouse extends Animal {</p><p>}</p><p>public static class MyAutoTypeCheckHandler implements ParserConfig.AutoTypeCheckHandler {</p><p> public Class<!--?--> handler(String typeName, Class<!--?--> expectClass, int features) {</p><p> if ("Cat".equals(typeName)) {</p><p> return Cat.class;</p><p> }</p><p> if ("Mouse".equals(typeName)) {</p><p> return Mouse.class;</p><p> }</p><p> return null;</p><p> }</p><p> }</p><p>}</p><p>来源:https://github.com/alibaba/fastjson/wiki/fastjson_safemode</p><h3><font color="#c24f4a">中科天齐 漏洞治理专家</font></h3><p>中科天齐由李炼博士创立,以自主研究成果WuKong静态软件安全测试工具为主打产品,团队凭借多年在程序分析领域的技术积累,致力打造安全漏洞治理领域新生态的高新技术企业。</p><h3><font color="#c24f4a">WuKong静态软件安全测试工具</font></h3><p><!--StartFragment--> <!--EndFragment--></p><p><a href="https://www.woocoom.com/" target="_blank" style="background-color: rgb(255, 255, 255);"><font color="#c24f4a">WuKong</font></a>是一款国产信创SAST产品,采用自主专利技术的程序分析引擎,多种创新性的静态分析技术,结合深度学习和人工智能等多种方法,能够对软件代码进行全方位的 安全扫描和安全分析。</p><p><br></p>