在《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注入利用,涉及的有
- RMI Reference JNDI注入利用
- LDAP JNDI注入利用
- 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()
这里总结下过程
_outputProperties
触发getOutputProperties()
getOutputProperties()
进入newTransformer()
newTranformer()
进入getTransletInstance()
获取TransformergetTransletInstance()
由于json串中指定了_name=”xxx”,_class 为空,所以进入了 进入defineTransletClasses()
生成payload对应的Class类defineTransletClasses()
主要从json串_bytecodes属性字节码中通过ClassLoader.defineClass
定义一个类,也就是我们的利用Exploit类,这里会检查defineClass的返回值,即检查payload 加载为类的父类是否”com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet“
所以我们的payload在生成的时候要是这个(ABSTRACT_TRANSLET)类的子类- 最后回到
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
参考资料
2.阿里云安全公告