CSDNfastjson到底做错了什么?为什么会被频繁爆出漏洞?( 四 )


CSDNfastjson到底做错了什么?为什么会被频繁爆出漏洞?
本文插图
因为fastjson在反序列化的时候会尝试执行里面的getter方法 , 而Exception类中都有一个getMessage方法 。 黑客只需要自定义一个异常 , 并且重写其getMessage就达到了攻击的目的 。 这个漏洞就是6月份全网疯传的那个"严重漏洞" , 使得很多开发者不得不升级到新版本 。 这个漏洞在 v1.2.69中被修复 , 主要修复方式是对于需要过滤掉的expectClass进行了修改 , 新增了4个新的类 , 并且将原来的Class类型的判断修改为hash的判断 。 其实 , 根据fastjson的官方文档介绍 , 即使不升级到新版 , 在v1.2.68中也可以规避掉这个问题 , 那就是使用safeModeAutoType 安全模式?可以看到 , 这些漏洞的利用几乎都是围绕AutoType来的 , 于是 , 在 v1.2.68版本中 , 引入了safeMode , 配置safeMode后 , 无论白名单和黑名单 , 都不支持autoType , 可一定程度上缓解反序列化Gadgets类变种攻击 。 设置了safeMode后 , @type 字段不再生效 , 即当解析形如{"@type": "com.java.class"}的JSON串时 , 将不再反序列化出对应的类 。 开启safeMode方式如下:ParserConfig.getGlobalInstance.setSafeMode(true);如在本文的最开始的代码示例中 , 使用以上代码开启safeMode模式 , 执行代码 , 会得到以下异常:Exception in thread "main" com.alibaba.fastjson.JSONException: safeMode not support autoType : com.hollis.lab.fastjson.test.Appleat com.alibaba.fastjson.parser.ParserConfig.checkAutoType(ParserConfig.java:1244)但是值得注意的是 , 使用这个功能 , fastjson会直接禁用autoType功能 , 即在checkAutoType方法中 , 直接抛出一个异常 。

CSDNfastjson到底做错了什么?为什么会被频繁爆出漏洞?
本文插图
后话目前fastjson已经发布到了 v1.2.72版本 , 历史版本中存在的已知问题在新版本中均已修复 。 开发者可以将自己项目中使用的fastjson升级到最新版 , 并且如果代码中不需要用到AutoType的话 , 可以考虑使用safeMode , 但是要评估下对历史代码的影响 。 因为fastjson自己定义了序列化工具类 , 并且使用asm技术避免反射、使用缓存、并且做了很多算法优化等方式 , 大大提升了序列化及反序列化的效率 。 之前有网友对比过:

CSDNfastjson到底做错了什么?为什么会被频繁爆出漏洞?
本文插图
当然 , 快的同时也带来了一些安全性问题 , 这是不可否认的 。 最后 , 其实我还想说几句 , 虽然fastjson是阿里巴巴开源出来的 , 但是据我所知 , 这个项目大部分时间都是其作者温少一个人在靠业余时间维护的 。 知乎上有网友说:"温少几乎凭一己之力撑起了一个被广泛使用JSON库 , 而其他库几乎都是靠一整个团队 , 就凭这一点 , 温少作为“初心不改的阿里初代开源人” , 当之无愧 。 "其实 , 关于fastjson漏洞的问题 , 阿里内部也有很多人诟病过 , 但是诟病之后大家更多的是给予理解和包容 。 fastjson目前是国产类库中比较出名的一个 , 可以说是倍受关注 , 所以渐渐成了安全研究的重点 , 所以会有一些深度的漏洞被发现 。 就像温少自己说的那样:"和发现漏洞相比 , 更糟糕的是有漏洞不知道被人利用 。 及时发现漏洞并升级版本修复是安全能力的一个体现 。 "就在我写这篇文章的时候 , 在钉钉上问了温少一个问题 , 他竟然秒回 , 这令我很惊讶 。 因为那天是周末 , 周末钉钉可以做到秒回 , 这说明了什么?他大概率是在利用自己的业余维护fastjson吧…最后 , 知道了fastjson历史上很多漏洞产生的原因之后 , 其实对我自己来说 , 我是"更加敢用"fastjson了…致敬fastjson!致敬安全研究者!致敬温少!


推荐阅读