CVE-2017-4995: Jackson 配置允许通过未知的“反序列化小工具”执行代码
描述
当配置为启用默认类型(default typing)时,Jackson 存在一个反序列化漏洞,可能导致任意代码执行。Jackson 通过将已知的“反序列化小工具”(deserialization gadgets)列入黑名单来修复此漏洞。
Spring Security 将 Jackson 配置为启用全局默认类型(global default typing),这意味着通过之前的漏洞,如果满足以下所有条件,则可以执行任意代码
- 通过调用 SecurityJackson2Modules.getModules(ClassLoader) 或 SecurityJackson2Modules.enableDefaultTyping(ObjectMapper) 来利用 Spring Security 的 Jackson 支持
- 使用 Jackson 反序列化不受信任的数据。Spring Security 不使用 Jackson 执行反序列化,因此这是用户的明确选择。
- 在类路径中存在一个未知的(Jackson 尚未将其列入黑名单)允许执行代码的“反序列化小工具”(deserialization gadget)
Jackson 提供了黑名单方法来防范此类攻击,但当 Spring Security 启用默认类型(default typing)时,Spring Security 应该主动阻止未知的“反序列化小工具”(deserialization gadgets)。
受影响的 Spring 产品和版本
- Spring Security 4.2.0.RELEASE - 4.2.2.RELEASE
- Spring Security 5.0.0.M1
缓解措施
受影响版本的用户应采取以下缓解措施
- 已修复此问题的版本包括:<ul><li>Spring Security: 4.2.3.RELEASE+</li><li>Spring Security: 5.0.0.M2+</li></ul>
- 此修复确保默认情况下只反序列化明确映射的类。使用明确映射的类的效果是创建了一个白名单,这与所有受支持的 Jackson 版本兼容。如果用户明确选择启用全局默认类型(global default typing),则会恢复之前潜在危险的配置。