Spring Boot RabbitMQ attempt to deserialize unauthorized class exception

为什么会发生?

  • 因为存在:CVE-2023-34050 Spring AMQP Deserialization Vulnerability.出于安全考虑,Spring默认会限制反序列化某些类,以防止潜在的安全漏洞(例如,反序列化攻击)。
  • 如果你的Spring Boot 版本不是在2.7.173.0.123.1.53.2.0 起始之后,由于官方还未修正该漏洞,当然不会出现此异常。

怎么修复?

方法一:设置环境变量

  • 如果你信任消息的来源,可以设置环境变量SPRING_AMQP_DESERIALIZATION_TRUST_ALLtrue,允许反序列化所有类
export SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true

方法二:设置系统属性

  • 在应用启动时设置系统属性spring.amqp.deserialization.trust.alltrue
System.setProperty("spring.amqp.deserialization.trust.all", "true");

方法三:配置反序列化信任的包或者类

  • 配置包
@Configuration
public class RabbitMQConfig {
    @Bean
    public MessageConverter jsonToMapMessageConverter() {
        DefaultClassMapper defaultClassMapper = new DefaultClassMapper();
        // 指定反序列化期间要信任的一组包,星号 ( * ) 表示全部信任
        defaultClassMapper.setTrustedPackages("td");
        Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
        jackson2JsonMessageConverter.setClassMapper(defaultClassMapper);
        return jackson2JsonMessageConverter;
    }
}
  • 配置包或者类
@Configuration
public class RabbitMQConfig {
    @Bean
    public SimpleMessageConverter converter() {
        SimpleMessageConverter converter = new SimpleMessageConverter();
        // 示例: com. foo.* 、 *.MyClass 
        converter.setAllowedListPatterns("td");
        return converter;
    }
}
  • 以上二选一即可
    • 如果你只需要信任几个固定的包,使用 DefaultClassMapper 可能更简单。
    • 如果需要更灵活的控制,例如只信任某些特定的类名模式,使用 SimpleMessageConverter 的 allowedListPatterns 可能更合适。

参考文章地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容