spring-boot 使用啥版本的 Jackson?

Posted

技术标签:

【中文标题】spring-boot 使用啥版本的 Jackson?【英文标题】:What version of Jackson does spring-boot use?spring-boot 使用什么版本的 Jackson? 【发布时间】:2018-05-21 23:11:27 【问题描述】:

我正在努力确保以安全的方式使用 spring-boot 和 Jackson。 Jackson 的某些版本中存在反序列化错误(来源:https://github.com/FasterXML/jackson-databind/issues/1599)。

默认情况下,Spring Security 不使用 Jackson 执行反序列化,因此这是用户的明确选择(来源:https://pivotal.io/security/cve-2017-4995)。

如果 Jackson 用于执行反序列化,则版本 2.7、2.8、2.8.9 和 2.7.9.1 以及 2.9.0.pr3 已修补(来源:请参阅 cowtowncoder 于 4 月 13 日评论,https://github.com/FasterXML/jackson-databind/issues/1599)而不是容易受到该错误的影响。

那么使用作为 spring、spring-boot 或 Spring Security 一部分的 Jackson 版本执行反序列化是否安全?

【问题讨论】:

这取决于您使用的这些工具的版本。例如,Spring Boot 版本 1 可能使用 Jackson 版本 1,而 Spring Boot 版本 2 使用 Jackson 版本 2。不只有 1 个“Spring Boot”仅使用一组依赖项。一个真实的例子是 Spring Boot 1.5.2 使用 Jackson 2.8.7 我的意思是包含这些信息:Spring Boot 1.59 “当前”版本。 如果您查看父 pom 文件,您将看到正在使用的 jackson 版本。 如果你使用gradle,执行gradlew依赖,你就知道了。如果你使用 Maven,使用 mvn dependency:tree,你就会知道。您也可以只查看 pom:mvnrepository.com/artifact/org.springframework.boot/…(当然,您可能有另一个依赖项导致使用另一个版本)。 【参考方案1】:

每个版本的 SpringBoot 都使用易受攻击的 Jackson API 版本,因为确实没有任何版本至少部分易受攻击。如果您允许将不受信任的第三方数据反序列化为通用集合(Map、List. 等),则可能会发生这种情况。即使您在代码中向这些结构添加泛型,这些泛型也只是编译时的,不能强制在 JVM 运行时中键入。

如果您正在访问外部的 RESTful api,那么您将必须实现自己的类型。如果您使用的是 RestTemplate,则必须在它使用的对象映射器上手动设置。

仅供参考:SpringBoot 也使用易受攻击的 logback 版本。只需将其明确包含在您的构建中即可更新到最新版本。

【讨论】:

以上是关于spring-boot 使用啥版本的 Jackson?的主要内容,如果未能解决你的问题,请参考以下文章

Spring-boot01

Spring-boot01

Eclipse 中的“mvn spring-boot:run”和“添加到 Tomcat 服务器”有啥区别?

解决spring-boot 各版本包冲突兼容的方法

如何在 gradle 中获取 spring-boot 依赖版本?

Spring-Boot的第三方类库的依赖版本调整方法