CVE-2017-4995: Jackson 配置允许通过未知的“反序列化小工具”执行代码

| 2017 年 6 月 8 日 | CVE-2017-4995

描述

当配置为启用默认类型(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),则会恢复之前潜在危险的配置。

参考资料

CVE-2017-4971: Spring Web Flow 中的数据绑定表达式漏洞

| 2017 年 5 月 31 日 | CVE-2017-4971

描述

未更改 MvcViewFactoryCreator 的 useSpringBinding 属性值(该属性默认禁用,即设置为“false”)的应用程序,在其视图状态中处理表单提交但没有子元素来声明显式数据绑定属性映射时,可能容易受到恶意 EL 表达式的影响。

受影响的 Spring 产品和版本

  • Spring Web Flow 2.4.0 至 2.4.4
  • 较旧的不受支持的版本也受到影响

缓解措施

受影响版本的用户应采取以下缓解措施

  • 2.4.x 用户应升级到 2.4.5
  • 请注意,通常建议在视图状态中始终使用显式数据绑定声明,这是一个很好的实践,以防止表单提交设置目标对象上不应设置的字段。
  • 使用 JSF 的 Spring Web Flow 用户不受此报告影响。

致谢

该问题由 Gotham Digital Science 的 Stefano Ciccone 发现

参考资料

CVE-2016-9879 路径变量中编码的 '/'

| 2016 年 12 月 28 日 | CVE-2016-9879

描述

Spring Security 在处理安全约束时未考虑 URL 路径参数。攻击者可以通过在请求中添加带有编码 '/' 的 URL 路径参数来绕过安全约束。此问题的根本原因是 Servlet Specification(参见下文)中关于路径参数处理的说明不够清晰。一些 Servlet 容器在 getPathInfo() 返回的值中包含路径参数,而另一些则不包含。Spring Security 使用 getPathInfo() 返回的值作为将请求映射到安全约束的过程的一部分。路径参数的意外存在可能导致约束被绕过。

Apache Tomcat(所有当前版本)的用户不受此漏洞影响,因为 Tomcat 遵循 Servlet Expert group 先前提供的指导,并从 getContextPath()、getServletPath() 和 getPathInfo() 返回的值中去除路径参数 [1]。

基于 Apache Tomcat 的其他 Servlet 容器的用户可能受到影响,也可能不受影响,具体取决于是否修改了路径参数的处理方式。

已知 IBM WebSphere Application Server 8.5.x 的用户受到影响。

实现 Servlet specification 的其他容器的用户可能受到影响。

[1] https://issues.apache.org/bugzilla/show_bug.cgi?id=25015

受影响的 Spring 产品和版本

  • Spring Security 3.2.0 - 3.2.9
  • Spring Security 4.0.x - 4.1.3
  • Spring Security 4.2.0
  • 较旧的不受支持的版本也受到影响

缓解措施

采取以下任一缓解措施将能防范此漏洞。

  • 使用已知在 getServletPath() 和 getPathInfo() 返回值中不包含路径参数的 Servlet 容器
  • 升级到 Spring Security 3.2.10、4.1.4 或 4.2.1 将在检测到编码 '/' 时拒绝请求,并抛出 RequestRejectedException。注意:如果您希望禁用此功能,可以通过设置 DefaultHttpFirewall.allowUrlEncodedSlash = true 来禁用。然而,禁用此功能意味着应用程序将存在漏洞(在 getServletPath() 或 getPathInfo() 返回路径参数的容器中)。

致谢

该问题由 NTT DATA Corporation 的 Shumpei Asahara 和 Yuji Ito 发现,并负责任地报告给了 Pivotal。

参考资料

CVE-2016-9878 Spring Framework ResourceServlet 中的目录遍历漏洞

| 2016 年 12 月 21 日 | CVE-2016-9878

描述

提供给 ResourceServlet 的路径未被正确清理,因此存在目录遍历攻击的风险。

受影响的 Spring 产品和版本

  • Spring Framework 4.3.0 至 4.3.4
  • Spring Framework 4.2.0 至 4.2.8
  • Spring Framework 3.2.0 至 3.2.17
  • 较旧的不受支持的版本也受到影响

缓解措施

受影响版本的用户应采取以下缓解措施

  • 4.3.x 用户应升级到 4.3.5
  • 4.2.x 用户应升级到 4.2.9
  • 3.2.x 用户应升级到 3.2.18

请注意,很少有应用程序可能使用 ResourceServlet。自版本 3.0(约 2009 年)以来,它通常已被 ResourceHttpRequestHandler 及相关类取代,后者默认使用并提供更高级的功能,请参阅参考文档中的“提供资源(Serving Resources)”。ResourceServlet 现在在 3.2.x 和 4.x 中已被弃用,并从版本 5 开始完全移除。

致谢

该问题由 NTT DATA Corporation 的 Shumpei Asahara 和 Yuji Ito 发现,并负责任地报告给了 Pivotal。

参考资料

CVE-2016-6652 Spring Data JPA 盲注 SQL 注入漏洞

| 2016 年 9 月 30 日 | CVE-2016-6652

描述

Sort 实例传递给使用手动声明的 JPQL 查询的用户定义 Spring Data 存储库查询方法时,这些实例会按原样传递给持久性提供程序,并允许攻击者将任意 JPQL 注入到 ORDER BY 子句中,攻击者可以利用它根据查询结果元素顺序的变化来推断未暴露字段的信息(取决于注入的 JPQL)。

如果 Sort 实例是从不可信来源(例如 Web 请求参数)创建的,则尤其会发生这种情况。

受影响的 Spring 产品和版本

  • Spring Data JPA 1.10.2, 1.9.4
  • 较旧的不受支持的版本也受到影响

缓解措施

受影响版本的用户应采取以下缓解措施

  • 建议用户升级到 Spring Data JPA 的 1.10.4 (Hopper SR4) 或 1.9.6 (Gosling SR6) 版本。这些版本对传递给数据访问层的 <code>Sort</code> 实例进行了清理,并仅允许引用查询方法背后的 JPQL 中使用的领域对象字段和别名。
  • 如果用户仍然需要将复杂的排序表达式传递给数据访问层,他们可以使用新引入的 <code>JpaSort.unsafe(…)</code> 来恢复旧的行为。

致谢

该漏洞由 Silverskin Information Security 的 Niklas Särökaari 以及来自… 的 Joona Immonen、Arto Santala、Antti Virtanen、Michael Holopainen 和 Antti Ahola 负责任地报告。

CVE-2016-4977 Spring Security OAuth 中的远程代码执行 (RCE) 漏洞

| 2016 年 7 月 5 日 | CVE-2016-4977

描述

在使用 whitelabel 视图处理授权请求时,response_type 参数值被作为 Spring SpEL 执行,这使得恶意用户可以通过精心构造 response_type 的值来触发远程代码执行。

受影响的 Spring 产品和版本

  • 2.0.0 至 2.0.9
  • 1.0.0 至 1.0.5

缓解措施

受影响版本的用户应采取以下缓解措施

  • 1.0.x 的用户不应使用 whitelabel 视图作为审批和错误页面
  • 2.0.x 的用户要么不使用 whitelabel 视图作为审批和错误页面,要么升级到 2.0.10 或更高版本

致谢

此问题由 David Vieira-Kurz (@secalert) 发现,并由 Oliver Schoenherr 代表 Immobilien Scout GmbH 报告。

参考资料

CVE-2016-2173 Spring AMQP 中的远程代码执行漏洞

严重 | 2016 年 4 月 11 日 | CVE-2016-2173

描述

org.springframework.core.serializer.DefaultDeserializer 类未根据白名单验证反序列化对象。通过提供经过精心构造的序列化对象(例如 Chris Frohoff 的 Commons Collection gadget),可以实现远程代码执行。

受影响的 Spring 产品和版本

  • 1.0.0 至 1.5.4

缓解措施

受影响版本的用户应采取以下缓解措施

  • 引用的类 (DefaultDeserializer) 不会被任何 Spring application context 自动注册;用户在使用此类别处理来自不受信任来源的对象时应谨慎,就像直接使用 ObjectInputStream 时一样。
  • Spring AMQP 有一个(可选的)消息转换器,可以使用此反序列化器;从版本 1.5.5 开始,该转换器现在可以配置一个可接受反序列化的包/类的白名单。
  • Spring AMQP 还有一个默认配置的 SimpleMessageConverter;它不使用反序列化器,但内部使用 ObjectInputStream;它现在也可以配置一个包/类的白名单。
  • 建议用户在使用 RabbitMQ 且可能接收不受信任数据的环境中不要使用 Java 序列化;如果使用,则应配置转换器以允许特定的对象。
  • 可能暴露于此漏洞的用户应升级到 Spring AMQP 1.5.5 或更高版本,并配置白名单。

致谢

Code White 的 Matthias Kaiser 发现了此漏洞 (www.code-white.com)

参考资料

CVE-2015-5258 Spring Social CSRF

| 2015 年 11 月 12 日 | CVE-2015-5258

描述

在针对 OAuth 2 API 提供程序授权应用程序时,Spring Social 容易受到跨站请求伪造 (CSRF) 攻击。该攻击涉及恶意用户使用伪造的 OAuth 2 API 提供程序账户开始 OAuth 2 授权流程,但通过诱骗受害者在其浏览器中访问回调请求来完成此过程。结果是,攻击者将通过伪造的提供程序账户访问受害者在易受攻击网站上的账户。

受影响的 Spring 产品和版本

  • Spring Social Core 1.0.0 至 1.0.3
  • Spring Social Core 1.1.0 至 1.1.2

缓解措施

受影响的 Spring Social 版本的用户应按如下方式升级

  • 对于 Spring Social 1.0.x,升级到 1.1.3+
  • 对于 Spring Social 1.1.x,升级到 1.1.3+

在上述版本中,Spring Social 要求回调请求中存在 `state` 参数。如果未找到,将抛出 IllegalStateException 并终止授权流程。

致谢

该问题最初由 Include Security 的 Kris Bosch 发现。随后,sourceclear (https://srcclr.com) 的 Paul Ambrosini 确定了根本原因、受影响的库和受影响的代码。

CVE-2015-5211 Spring Framework 中的 RFD 攻击

| 2015 年 10 月 15 日 | CVE-2015-5211

描述

在某些情况下,Spring Framework 容易受到反射式文件下载 (Reflected File Download, RFD) 攻击。该攻击涉及恶意用户精心构造一个带有批处理脚本扩展名的 URL,导致响应被下载而非渲染,并且响应中还包含一些反射的输入。

有关详细信息和具体示例,请参阅 Trustwave 的这篇非常有用的RFD 论文

受影响的 Spring 产品和版本

  • Spring Framework 3.2.0 至 3.2.14
  • Spring Framework 4.0.0 至 4.1.7
  • Spring Framework 4.2.0 至 4.2.1
  • 较旧的不受支持的版本也受到影响

缓解措施

受影响的 Spring Framework 版本的用户应按如下方式升级

  • 对于 3.2.x,升级到 3.2.15+。
  • 对于 4.0.x 和 4.1.x,升级到 4.1.8+。
  • 对于 4.2.x,升级到 4.2.2+。

在上述版本中,Spring MVC 在使用 HttpMessageConverter 写入之前会检查 URL 是否包含文件扩展名,如果扩展名未知,则会添加“Content-Disposition”响应头,建议下载文件名“f.txt”。默认情况下,“已知”扩展名列表包括与内置 HttpMessageConverter 实现相关的扩展名以及为内容协商目的而明确注册的任何附加扩展名。对于 4.x,修复还包括对 SockJS URL 进行 URL 检查以及在所有支持 JSONP 的区域验证 JSONP 回调参数。

简单地升级到上述版本即可保护应用程序免受 RFD 攻击。还可以采取一些进一步的措施

  • 对 JSON 响应进行编码而不是转义。这也是 OWASP XSS 的建议。有关如何使用 Spring 执行此操作的示例,请参阅 https://github.com/rwinch/spring-jackson-owasp
  • 配置后缀模式匹配以将其关闭或仅限于显式注册的后缀。
  • 配置内容协商,将属性“useJaf”和“ignoreUknownPathExtension”设置为 false,对于具有未知扩展名的 URL 将导致 406 响应。但请注意,如果 URL 自然地预期末尾带有小数点,则此选项可能不适用。
  • 在响应中添加 'X-Content-Type-Options: nosniff' 头部。Spring Security 4 默认执行此操作。

致谢

Trustwave 在一篇论文中描述了 RFD 攻击。Spring Framework 中的此问题由 HPE Security Research 的 Alvaro Muñoz 负责任地报告给了 Pivotal。特别感谢…

抢先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持及二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中即将举行的所有活动。

查看全部