Jackson-Databind框架json反序列化代码执行漏洞分析

影响版本:jackson databind 2.7.10 及2.8.9以下版本

危害等级:高

解决方案: 更新至最新版本

根据修复补丁https://github.com/FasterXML/jackson-databind/commit/6ce32ffd18facac6abdbbf559c817b47fcb622c1,发现对sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl这个类做了拦截。如下图:

1

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

2

从testcase中可以很明显看到当ObjectMapper启用了DefaultTyping的功能之后,则可以导致任意代码执行。

具体jackson databind使用请参考https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features

了解了jackson json反序列化之后,可以知道上面testcase的反序列化流程为:

  1. sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties(TemplatesImpl.java:460)
  2. sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer(TemplatesImpl.java:439)
  3. sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getTransletInstance(TemplatesImpl.java:404)
  4. sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.defineTransletClasses(TemplatesImpl.java:351)

这里存在一个坑:

查看jdk1.7及其之后的jdk版本中的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl类的defineTransletClasses方法

3

可以看到无法通过json反序列化设置_tfactory这个值,所以tfactory为null,从而会导致空指针异常,使得jackson json反序列化失败。

继续查看jdk1.6中的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl类的defineTransletClasses方法:

4

这个不需要_tfactory这个值。所以这里必须是在小于jdk1.7的环境下才可以执行任意代码。

5

  1. 查看sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getTransletInstance(TemplatesImpl.java:404)

6

在newInstance的时候就可以触发自定义类中的代码。

所以我们可以构造一个自定义的恶意类:

7

然后将这个class转化成byte[]

8

执行结果:

9