Coverity检测到不安全反序列化问题,寻求合规修复方案
解决Coverity误报内部API来源的不安全反序列化问题
你的代码里先把内部API传来的body序列化为字符串,再反序列化为ContentDto,但Coverity 2022.3的新检测规则误判这个字符串为外部不可信来源,触发了不安全反序列化告警。以下是几个合理的解决方案,比单纯标记误报更稳妥:
去掉冗余的序列化-反序列化步骤
既然body是内部API传来的可信对象,完全没必要绕一圈转成JSON再转回来。直接做类型转换或者用Bean拷贝工具处理就行,从根源上消除反序列化操作,自然不会触发告警:// 如果body本身就是ContentDto类型,直接强转 ContentDto contentDto = (ContentDto) body; // 如果body是其他内部对象,用Bean拷贝(比如Spring的BeanUtils) ContentDto contentDto = new ContentDto(); org.springframework.beans.BeanUtils.copyProperties(body, contentDto);给Coverity标记可信来源
如果必须保留序列化-反序列化流程(比如有特殊业务逻辑),可以通过代码注释或配置让Coverity认可这个输入是安全的:- 在生成字符串的代码行添加Coverity专用注释,标记输入为可信:
// coverity[secure_source] String str = jacksonObjectMapper.writeValueAsString(body); ContentDto contentDto = jacksonObjectMapper.readValue(str, ContentDto.class); - 也可以在Coverity项目的扫描配置里,把
body的来源路径加入可信数据源白名单,让扫描器默认认定该路径的输入是安全的。
- 在生成字符串的代码行添加Coverity专用注释,标记输入为可信:
加固Jackson反序列化配置
要是非得保留反序列化操作,也可以通过配置Jackson来降低安全风险,同时让Coverity识别到你做了安全加固:// 禁用未知属性反序列化,避免恶意字段注入 jacksonObjectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 严格限定类型,禁止自动推断多态类型,防止恶意类型转换 jacksonObjectMapper.activateDefaultTyping( LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL );这种配置能有效限制反序列化的范围,也能让Coverity识别到安全防护措施,减少误报。
内容的提问来源于stack exchange,提问作者Shashank Jain
相关产品推荐
相关产品推荐

