Java 反序列化漏洞防御:Jackson 安全配置
·
Jackson 反序列化漏洞防御指南
漏洞原理
Java 反序列化漏洞常通过恶意 JSON 数据触发,攻击者利用 Jackson 的多态类型处理机制(如 @JsonTypeInfo)注入恶意类。核心风险公式:
$$\text{风险} = \frac{\text{反序列化权限}}{\text{类型验证强度}}$$
关键防御配置
-
禁用默认类型推导
ObjectMapper mapper = new ObjectMapper(); mapper.activateDefaultTyping( // 避免使用 LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL );✅ 正确做法:完全移除
activateDefaultTyping()调用 -
启用全局安全特性
mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); // 检测重复键 mapper.disable(JsonParser.Feature.IGNORE_UNDEFINED); // 禁止忽略未定义属性 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 遇到未知属性报错 -
多态类型安全验证(Jackson 2.12+)
PolymorphicTypeValidator validator = BasicPolymorphicTypeValidator.builder() .allowIfSubType("com.trusted.pkg.") // 仅允许可信包 .denyIfExplicit("java.io.") // 禁止危险包 .build(); mapper.activateDefaultTyping(validator, DefaultTyping.NON_FINAL); -
注解级防护
在需要多态处理的类上显式指定允许子类:@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "@type") @JsonSubTypes({ @Type(value = SafeClassA.class, name = "typeA"), @Type(value = SafeClassB.class, name = "typeB") }) // 仅允许注册的类 public abstract class BaseType {}
深度防御策略
| 层级 | 措施 |
|---|---|
| 代码层 | 使用 @JsonCreator 构造器替代 setter 反序列化 |
| 依赖层 | 升级 Jackson 至 ≥2.12.0(含 PolymorphicTypeValidator) |
| 架构层 | JSON 数据进入业务层前通过 API 网关进行 schema 校验 |
| 监控层 | 部署 RASP 工具检测异常反序列化行为 |
配置检查清单
- 扫描代码中所有
ObjectMapper实例 - 确认无
enableDefaultTyping()调用 - 验证所有
@JsonTypeInfo均配合@JsonSubTypes - 单元测试注入恶意类型(如
java.net.URL)验证防御生效
✦ 紧急修复示例 ✦
若必须使用多态反序列化:
PolymorphicTypeValidator validator = BasicPolymorphicTypeValidator.builder()
.allowIfBaseType("com.domain.model.")
.denyIfExplicit("java.lang.Runtime")
.build();
ObjectMapper mapper = new ObjectMapper();
mapper.activateDefaultTyping(
validator,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.PROPERTY
);
更多推荐
所有评论(0)