如何解决Spring RCE漏洞(CVE-2022-22965)?
How to resolve Spring RCE vulnerability(CVE-2022-22965)?
更新
此问题现已分配给 CVE-2022-22965. Other than below nice answers, please do check Spring Framework RCE: Early Announcement,因为它是解决此问题的最可靠和最新的站点。
根据不同的来源,我们似乎在使用 Spring 核心库时遇到了严重的安全问题。
引用上面 link,如果出现以下情况,我们将面临风险:
- 您使用 Spring 应用(5.3.17 及更高版本)
您的应用在 Java 9+
上运行
- 您使用名称=值对的表单绑定 – 未使用 Spring 更流行的 JSON/XML
消息转换
- 您没有使用许可名单 – 或者 – 您没有阻止“class”、“模块”、“classLoader”[=30= 等字段的拒绝名单]
link 提出了一些解决方案,但 implement/reliable 似乎并不容易。
我们应该如何以最简单和最可靠的方式解决此问题?
根据 Spring Framework RCE: Early Announcement,升级到 Spring Framework 5.3.18 或 5.2.20 将修复 RCE。
如果您使用 Spring 启动,Spring Boot 2.5.12 and Spring Boot 2.6.6 修复漏洞。
如果您无法更新:
您可以选择只升级Tomcat。 The Apache Tomcat team has released versions 10.0.20, 9.0.62, and 8.5.78 all of which close the attack vector on Tomcat’s side.
如果您无法执行上述任一操作,RCE announcement blog post 建议采用一种解决方法:通过 @ControllerAdvice
在 WebDataBinder
上设置 disallowedFields
:
@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
如果控制器通过其自己的 @InitBinder
方法在本地设置 disallowedFields
(覆盖全局设置),则此快速修复将不起作用。此外,更一般地说,如果您使用替代 REST 框架(例如 Jersey),解决方法将不会产生影响(但是,尚未证明此类配置会受到影响)。
Note
:Spring 稍后需要升级,因为 Tomcat
中没有漏洞
临时解决方法是升级 tomcat 到 10.0.20、9.0.62 和 8.5.78
更新
此问题现已分配给 CVE-2022-22965. Other than below nice answers, please do check Spring Framework RCE: Early Announcement,因为它是解决此问题的最可靠和最新的站点。
根据不同的来源,我们似乎在使用 Spring 核心库时遇到了严重的安全问题。
引用上面 link,如果出现以下情况,我们将面临风险:
- 您使用 Spring 应用(5.3.17 及更高版本) 您的应用在 Java 9+ 上运行
- 您使用名称=值对的表单绑定 – 未使用 Spring 更流行的 JSON/XML 消息转换
- 您没有使用许可名单 – 或者 – 您没有阻止“class”、“模块”、“classLoader”[=30= 等字段的拒绝名单]
link 提出了一些解决方案,但 implement/reliable 似乎并不容易。 我们应该如何以最简单和最可靠的方式解决此问题?
根据 Spring Framework RCE: Early Announcement,升级到 Spring Framework 5.3.18 或 5.2.20 将修复 RCE。
如果您使用 Spring 启动,Spring Boot 2.5.12 and Spring Boot 2.6.6 修复漏洞。
如果您无法更新:
您可以选择只升级Tomcat。 The Apache Tomcat team has released versions 10.0.20, 9.0.62, and 8.5.78 all of which close the attack vector on Tomcat’s side.
如果您无法执行上述任一操作,RCE announcement blog post 建议采用一种解决方法:通过 @ControllerAdvice
在 WebDataBinder
上设置 disallowedFields
:
@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
如果控制器通过其自己的 @InitBinder
方法在本地设置 disallowedFields
(覆盖全局设置),则此快速修复将不起作用。此外,更一般地说,如果您使用替代 REST 框架(例如 Jersey),解决方法将不会产生影响(但是,尚未证明此类配置会受到影响)。
Note
:Spring 稍后需要升级,因为 Tomcat
临时解决方法是升级 tomcat 到 10.0.20、9.0.62 和 8.5.78