影响版本:jackson databind 2.7.10 及2.8.9以下版本
危害等级:高
解决方案: 更新至最新版本
根据修复补丁https://github.com/FasterXML/jackson-databind/commit/6ce32ffd18facac6abdbbf559c817b47fcb622c1,发现对sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl这个类做了拦截。如下图:

在修复补丁下面并且给了一个testcase,如下图:

从testcase中可以很明显看到当ObjectMapper启用了DefaultTyping的功能之后,则可以导致任意代码执行。
具体jackson databind使用请参考https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features
了解了jackson json反序列化之后,可以知道上面testcase的反序列化流程为:
这里存在一个坑:
查看jdk1.7及其之后的jdk版本中的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl类的defineTransletClasses方法
可以看到无法通过json反序列化设置_tfactory这个值,所以tfactory为null,从而会导致空指针异常,使得jackson json反序列化失败。
继续查看jdk1.6中的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl类的defineTransletClasses方法:
这个不需要_tfactory这个值。所以这里必须是在小于jdk1.7的环境下才可以执行任意代码。
在newInstance的时候就可以触发自定义类中的代码。
所以我们可以构造一个自定义的恶意类:
然后将这个class转化成byte[]
执行结果: