Jackson 反序列化漏洞防御指南

漏洞原理

Java 反序列化漏洞常通过恶意 JSON 数据触发,攻击者利用 Jackson 的多态类型处理机制(如 @JsonTypeInfo)注入恶意类。核心风险公式:
$$\text{风险} = \frac{\text{反序列化权限}}{\text{类型验证强度}}$$


关键防御配置
  1. 禁用默认类型推导

    ObjectMapper mapper = new ObjectMapper();
    mapper.activateDefaultTyping( // 避免使用
        LaissezFaireSubTypeValidator.instance, 
        ObjectMapper.DefaultTyping.NON_FINAL
    );
    

    ✅ 正确做法:完全移除 activateDefaultTyping() 调用

  2. 启用全局安全特性

    mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); // 检测重复键
    mapper.disable(JsonParser.Feature.IGNORE_UNDEFINED); // 禁止忽略未定义属性
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 遇到未知属性报错
    

  3. 多态类型安全验证(Jackson 2.12+)

    PolymorphicTypeValidator validator = BasicPolymorphicTypeValidator.builder()
        .allowIfSubType("com.trusted.pkg.") // 仅允许可信包
        .denyIfExplicit("java.io.") // 禁止危险包
        .build();
    
    mapper.activateDefaultTyping(validator, DefaultTyping.NON_FINAL);
    

  4. 注解级防护
    在需要多态处理的类上显式指定允许子类:

    @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 工具检测异常反序列化行为

配置检查清单
  1. 扫描代码中所有 ObjectMapper 实例
  2. 确认无 enableDefaultTyping() 调用
  3. 验证所有 @JsonTypeInfo 均配合 @JsonSubTypes
  4. 单元测试注入恶意类型(如 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
);

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐