背景:Spring Boot存在路径遍历漏洞。CVE-2021-22118:
官方 issue也有对此的记录,感兴趣可以看下
https://github.com/spring-projects/spring-boot/issues/26627
https://github.com/spring-projects/spring-boot/issues/27543
CVE-2021-22118 是一个在 Spring Boot 中发现的漏洞。该漏洞关系到 Spring Boot 的开发者工具(Devtools)中的远程更新(Remote Update)功能。在某些情况下,攻击者可能会利用这个功能进行目录遍历攻击,从而访问到系统中的敏感文件。
需要注意的是,这个漏洞只会影响到使用了 Spring Boot Devtools 的基于文件系统的应用,而且应用还必须满足以下两个条件之一:
如果你的应用满足以上条件,建议尽快进行修复。修复这个漏洞的方法有以下几种:
关于这个漏洞的详细信息,可以参考 Spring 官方的安全通告。
请注意,对于已经在生产环境中运行的应用,修改CORS配置可能会影响到正常的功能。因此,在实施这个修复之前,应该先进行充分的测试。
CVE 官方网站 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-22118
CVE-2021-22118是在Spring Boot中发现的一个严重的路径遍历漏洞。这个漏洞使攻击者能够以应用程序的身份访问计算机的敏感文件和数据。
这个漏洞影响了Spring Boot 2.3.0至2.3.7,2.4.0至`2.4.3以及2.5.0版本。
漏洞源于Spring Boot在处理用户输入的URL时,未能正确处理“…/”这种可能引起路径遍历的模式。在Spring Boot应用程序配置了Spring MVC并使用了默认的资源处理时,攻击者可以通过精心构造的URL,访问到应用程序类路径上的文件。这就使得攻击者有可能通过这个漏洞访问和下载敏感文件,或者执行非法操作。
官方的修复方式是发布了新的版本,即Spring Boot 2.3.8、2.4.4
和2.5.1
。在这些版本中,官方对路径遍历的处理进行了改进。
具体来说,Spring Boot
在处理用户请求的URL时,加强了对“…/”这种可能引起路径遍历的模式的处理。当应用程序检测到请求的URL包含这种模式时,会进行更严格的校验,以防止攻击者利用这种模式来访问应用程序类路径之外的文件或目录。
为了修复这个问题,受影响的用户应尽快将其Spring Boot版本升级到官方发布的新版本。实际上,这也是对待任何软件漏洞的通用策略:一旦发现有漏洞存在,就应该尽快升级到最新的、已修复该漏洞的版本。
Spring在其2.3.8、2.4.4和2.5.1版本中修复了这个漏洞。对于受到影响的用户,推荐尽快升级到这些版本。同时,作为临时措施,可以限制用户能访问的URL,或者在服务器端增加对用户提交的URL进行更严格的校验。
临时解决方案
在Nginx中,你可以使用location
指令和rewrite
指令来拦截和阻止包含"…/"的请求,以下是一个基本的示例配置:
server {
listen 80;
server_name your_domain.com;
location / {
if ($request_uri ~* "\.\.\/") {
return 403;
}
proxy_pass http://your_upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这个配置会监听80端口,并将请求代理到http://your_upstream
,如果请求的URI中包含"…/“,Nginx会返回403状态码,即"禁止访问”。
这只是防止路径遍历攻击的一种方法,并不能完全保证安全。因此,升级到没有这个漏洞的Spring
Boot版本,仍然是最安全的解决方案。此外,你还应该定期更新Nginx版本,以应用最新的安全修复。
在Spring Boot中你可以通过定制一个拦截器来防止路径遍历攻击。拦截器可以在处理请求前对请求的URL进行检查,如果URL包含非法字符(如"…/“或”./"),则可以拒绝该请求。== 这种可能会误拦截,大家使用的时候注意充分测试和考虑各种渠道==
一个简单示例可供参考
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class PathTraversalInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
if (uri.contains("../") || uri.contains("./")) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return false;
}
return true;
}
}
需要在一个配置类中将这个拦截器注册到Spring的拦截器链中:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final PathTraversalInterceptor pathTraversalInterceptor;
public WebConfig(PathTraversalInterceptor pathTraversalInterceptor) {
this.pathTraversalInterceptor = pathTraversalInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(pathTraversalInterceptor);
}
}
这样,Spring将会在处理每个请求前,先执行PathTraversalInterceptor
的preHandle
方法来检查请求的URL。
这种方法 也只能作为临时的解决方案,它不能替代升级Spring
Boot到没有该漏洞的版本。因为攻击者可能会使用编码绕过你的检查,而升级Spring Boot可以彻底修复该漏洞。