fastjson的漏洞解决—2020年5月28日

一、前言

fastjson真是不让人省心,2020年5月28日又报了漏洞。

fastjson的作用:

  1. 将javabean序列化为json格式的字符串。
  2. 将json格式的字符串,反序列化为javabean。

二、fastjson使用过程

添加maven依赖:


    com.alibaba
    fastjson
    1.2.54

API使用:

String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}", VO.class); //反序列化

三、白名单解决反序列化

fastjson在将对象进行反序列化的时候,有时候会不成功,于是有了以下方式来解决,多个包名使用逗号隔开:

  1. 添加白名单:在代码中添加你要反序列化的javabean:ParserConfig.getGlobalInstance().addAccept(“com.taobao.pac.client.sdk.dataobject.,com.cainiao.”);
  2. 加上JVM启动参数:-Dfastjson.parser.autoTypeAccept=com.taobao.pac.client.sdk.dataobject.,com.cainiao.
  3. 在fastjson.properties中添加:fastjson.parser.autoTypeAccept=com.taobao.pac.client.sdk.dataobject.,com.cainiao.

四、打开autotype,解决反序列化

如果上面的添加白名单的办法无法奏效,那可以继续通过以下打开autotype的方式:

  1. 通过JVM参数控制:-Dfastjson.parser.autoTypeSupport=true
  2. 代码中设置:ParserConfig.getGlobalInstance().setAutoTypeSupport(true);

五、漏洞问题

绕过autoType开关的限制,从而反序列化有安全风险的类,攻击者利用该漏洞可实现在目标机器上的远程代码执行。

六、解决办法一:升级版本

直接升级fastjson到1.2.69或1.2.70。


    com.alibaba
    fastjson
    1.2.70/1.2.69

七、解决办法二:升级+打开safemode

因为漏洞影响的是1.2.68和它以下的版本,在1.2.69和1.2.70版本出现之前,此漏洞只能通过先升级到1.2.68,然后打开safemode完全禁止autotype的方式来解决,safeMode 会完全禁用 autotype,无视白名单,请注意评估对业务影响:

  1. 在代码中设置:ParserConfig.getGlobalInstance().setSafeMode(true);
  2. 加上JVM启动参数:-Dfastjson.parser.safeMode=true
  3. 通过fastjson.properties文件配置:fastjson.parser.safeMode=true
  4. 另可通过将有风险的类添加至黑名单进行防护:ParserConfig.getGlobalInstance().addDeny(“类名”);

八、safeMode场景如何做autoType

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

// com.alibaba.fastjson.parser.ParserConfig.AutoTypeCheckHandler
/**
 * @since 1.2.68
 */
public interface AutoTypeCheckHandler {
    Class handler(String typeName, Class expectClass, int features);
}

// com.alibaba.fastjson.parser.ParserConfig#addAutoTypeCheckHandler

你可能感兴趣的:(Java)