JavaSec Jackjson反序列漏洞复现

在《JavaSec Jackson反序列化漏洞原理》中分析Jackson反序列化漏洞的成因,也总结了一些了Jackson的反序列化漏洞利用方式,这里将以Jackson的漏洞复现为主,以理清Jackson的漏洞发展史,从中吸取一些攻防经验。

jackson-databind 在显式开始default typing的时候容易受到攻击,这点与Fastjson的autoType相识,Jackson在漏洞修复的过程中采用的是黑名单的机制,攻击者不断挖掘新的的利用链,关于jackson的CVE预警就不断出现,这点可以在CVE与jackson的修复中可以看到。

总的来说,利用Jackson的反序列漏洞条件:

1.开启defaultTypeing

2.存在利用的依赖

下面将分析两个经典的利用链,默认jackson-databind = 2.8.8

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.8</version>
</dependency>

一、com.sun.rowset.JdbcRowSetImpl

这个利用链的过程是

JdbcRowsetImpl#setAutoCommit
    JdbcRowsetImpl#connect
        JdbcRowsetImpl#getDataSourceName
        InitialContext#lookup

利用链 com.sun.rowset.JdbcRowSetImpl说明存在Jackson反序列化漏洞的JNDI注入利用,涉及的有

  1. RMI Reference JNDI注入利用
  2. LDAP JNDI注入利用
  3. CORBA JNDI注入利用

关于他们的纤细解析可以看《JavaSec JNDI注入利用分析》

二、com.sun.org.apache.xalan.internal.xsltc.TemplateImpl

这个Template利用链的过程是:

TemplatesImpl.getOutputProperties()
  TemplatesImpl.newTransformer()
    TemplatesImpl.getTransletInstance()
      TemplatesImpl.defineTransletClasses()
        ClassLoader.defineClass()
        Class.newInstance()

这里总结下过程

  1. _outputProperties 触发getOutputProperties()
  2. getOutputProperties()进入newTransformer()
  3. newTranformer()进入getTransletInstance()获取Transformer
  4. getTransletInstance()由于json串中指定了_name=”xxx”,_class 为空,所以进入了 进入 defineTransletClasses() 生成payload对应的Class类
  5. defineTransletClasses() 主要从json串_bytecodes属性字节码中通过 ClassLoader.defineClass 定义一个类,也就是我们的利用Exploit类,这里会检查defineClass的返回值,即检查payload 加载为类的父类是否”com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet“所以我们的payload在生成的时候要是这个(ABSTRACT_TRANSLET)类的子类
  6. 最后回到getTransletInstance() 函数利用defineTransletClassed()生成的Class对象,也就是我们的利用利用,通过 newInstance()实例化,所以payload只需要放在Class的默认构造函数即可触发RCE。

详细请看《javaSec Jackson的反序列化漏洞利用原理》,分析了这个利用链通过getter方法触发的原理,与及利用的环境的注意点。

三、CVE & POC

下面是一些关于Jackson的CVE截取

1.CVE-2020-24616

jackson-databind是一套开源java高性能JSON处理器,受影响版本的jackson-databind中由于缺少黑名单类,如br.com.anteros:Anteros-DBCP,可导致攻击者实现远程代码执行,其相关CVE号为CVE-2020-24616,漏洞需要相关jar组件才能成功利用,影响面适中。此次版本升级官方还修复了多处利用链,包含org.arrahtec:profiler-core、com.nqadmin.rowset:jdbcrowsetimpl、com.pastdev.httpcomponents:configuration等。

  • jackson-databind < 2.9.10.6

2.CVE-2020-8840

  • 2.0.0 <= FasterXML jackson-databind Version <= 2.9.10.2

jackson-databind新版本中修复了一个由JNDI注入导致的远程代码执行漏洞CVE-2020-8840。受影响版本的 jackson-databind 中由于缺少某些xbean-reflect/JNDI黑名单类,如org.apache.xbean.propertyeditor.JndiConverter,可导致攻击者使用JNDI注入的方式实现远程代码执行

3.CVE-2019-12384

该漏洞是由于Jackson黑名单过滤不完整而导致,当开发人员在应用程序中通过ObjectMapper对象调用enableDefaultTyping方法时,程序就会受到此漏洞的影响,攻击者就可利用构造的包含有恶意代码的json数据包对应用进行攻击,直接获取服务器控制权限

  • Jackson-databind 2.X < 2.9.9.1

4.CVE-2017-17485

Jackson-databind在2018年初又被爆出了一个远程代码执行漏(CVE-2017-17485),受影响的版本有:2.9.3、2.7.9.1、2.8.10及之前的版本。该漏洞是由于Jackson黑名单过滤不完整,当开发人员在应用程序中通过ObjectMapper对象调用enableDefaultTyping方法时,程序就会受到此漏洞的影响,攻击者就可利用构造的包含有恶意代码的json数据包对应用进行攻击,直接获取服务器控制权限。目前针对该漏洞利用的POC已经公开,请受影响的用户及时更新版本进行修复

org.springframework.context.support.FileSystemXmlApplicationContext

  • Jackson-databind version <= 2.9.3

  • Jackson-databind version <= 2.7.9.1

  • Jackson-databind version <= 2.8.10

参考资料

1.vuldb jackson

2.阿里云安全公告


 上一篇
JavaSec Jackjson反序列化漏洞利用原理 JavaSec Jackjson反序列化漏洞利用原理
在上篇《JavaSec FastJson反序列化漏洞利用原理》中介绍了FastJson的基本使用与及fastjson在解析json串还原对象状态的逻辑及其中的利用点,而FastJson的修复方式也是仅仅加一些黑名单限制和一些字符处理,但都有
2020-11-02
下一篇 
JavaSec java反序列化漏洞利用分析 JavaSec java反序列化漏洞利用分析
Java反序列是一个将对象转换为字节流的机制,是在json,xml数据格式之外的一个数据传输格式,是Java原生支持的。但是不安全的序列化与反序列使用存在安全风险,这是对不可信的输入数据没有严格的校验改变了程序的执行流程,达到任意代码执行等
2020-10-20
  目录