Spring?Boot存在路徑遍歷漏洞CVE-2021-22118的問題解析

0.前言
背景:Spring Boot存在路徑遍歷漏洞。CVE-2021-22118:

官方 issue也有對(duì)此的記錄,感興趣可以看下
https://github.com/spring-projects/spring-boot/issues/26627
https://github.com/spring-projects/spring-boot/issues/27543
CVE-2021-22118 是一個(gè)在 Spring Boot 中發(fā)現(xiàn)的漏洞。該漏洞關(guān)系到 Spring Boot 的開發(fā)者工具(Devtools)中的遠(yuǎn)程更新(Remote Update)功能。在某些情況下,攻擊者可能會(huì)利用這個(gè)功能進(jìn)行目錄遍歷攻擊,從而訪問到系統(tǒng)中的敏感文件。
需要注意的是,這個(gè)漏洞只會(huì)影響到使用了 Spring Boot Devtools 的基于文件系統(tǒng)的應(yīng)用,而且應(yīng)用還必須滿足以下兩個(gè)條件之一:
- 遠(yuǎn)程更新功能被開啟(spring.devtools.restart.enabled = true)。
- 應(yīng)用使用了默認(rèn)的 HTTP 更新 URL(spring.devtools.restart.remote-secret)。
如果你的應(yīng)用滿足以上條件,建議盡快進(jìn)行修復(fù)。修復(fù)這個(gè)漏洞的方法有以下幾種:
- 將 Spring Boot 升級(jí)到 2.3.10.RELEASE 或更高版本。
- 將 Spring Boot 升級(jí)到 2.4.5 或更高版本。
- 將 Spring Boot 升級(jí)到 2.5.0 或更高版本。
關(guān)于這個(gè)漏洞的詳細(xì)信息,可以參考 Spring 官方的安全通告。
請(qǐng)注意,對(duì)于已經(jīng)在生產(chǎn)環(huán)境中運(yùn)行的應(yīng)用,修改CORS配置可能會(huì)影響到正常的功能。因此,在實(shí)施這個(gè)修復(fù)之前,應(yīng)該先進(jìn)行充分的測試。
1.參考文檔
CVE 官方網(wǎng)站 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-22118
2.基礎(chǔ)介紹
CVE-2021-22118是在Spring Boot中發(fā)現(xiàn)的一個(gè)嚴(yán)重的路徑遍歷漏洞。這個(gè)漏洞使攻擊者能夠以應(yīng)用程序的身份訪問計(jì)算機(jī)的敏感文件和數(shù)據(jù)。
1. 影響的版本
這個(gè)漏洞影響了Spring Boot 2.3.0至2.3.7,2.4.0至`2.4.3以及2.5.0版本。
2. 漏洞利用原理:
漏洞源于Spring Boot在處理用戶輸入的URL時(shí),未能正確處理“…/”這種可能引起路徑遍歷的模式。在Spring Boot應(yīng)用程序配置了Spring MVC并使用了默認(rèn)的資源處理時(shí),攻擊者可以通過精心構(gòu)造的URL,訪問到應(yīng)用程序類路徑上的文件。這就使得攻擊者有可能通過這個(gè)漏洞訪問和下載敏感文件,或者執(zhí)行非法操作。
官方的修復(fù)方式是發(fā)布了新的版本,即Spring Boot 2.3.8、2.4.4和2.5.1。在這些版本中,官方對(duì)路徑遍歷的處理進(jìn)行了改進(jìn)。
具體來說,Spring Boot在處理用戶請(qǐng)求的URL時(shí),加強(qiáng)了對(duì)“…/”這種可能引起路徑遍歷的模式的處理。當(dāng)應(yīng)用程序檢測到請(qǐng)求的URL包含這種模式時(shí),會(huì)進(jìn)行更嚴(yán)格的校驗(yàn),以防止攻擊者利用這種模式來訪問應(yīng)用程序類路徑之外的文件或目錄。
為了修復(fù)這個(gè)問題,受影響的用戶應(yīng)盡快將其Spring Boot版本升級(jí)到官方發(fā)布的新版本。實(shí)際上,這也是對(duì)待任何軟件漏洞的通用策略:一旦發(fā)現(xiàn)有漏洞存在,就應(yīng)該盡快升級(jí)到最新的、已修復(fù)該漏洞的版本。
3.解決方案
3.1. 方案1
Spring在其2.3.8、2.4.4和2.5.1版本中修復(fù)了這個(gè)漏洞。對(duì)于受到影響的用戶,推薦盡快升級(jí)到這些版本。同時(shí),作為臨時(shí)措施,可以限制用戶能訪問的URL,或者在服務(wù)器端增加對(duì)用戶提交的URL進(jìn)行更嚴(yán)格的校驗(yàn)。
3.2. 方案2
臨時(shí)解決方案
在Nginx中,你可以使用location指令和rewrite指令來攔截和阻止包含"…/"的請(qǐng)求,以下是一個(gè)基本的示例配置:
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;
}
}這個(gè)配置會(huì)監(jiān)聽80端口,并將請(qǐng)求代理到http://your_upstream,如果請(qǐng)求的URI中包含"…/“,Nginx會(huì)返回403狀態(tài)碼,即"禁止訪問”。
這只是防止路徑遍歷攻擊的一種方法,并不能完全保證安全。因此,升級(jí)到?jīng)]有這個(gè)漏洞的Spring
Boot版本,仍然是最安全的解決方案。此外,你還應(yīng)該定期更新Nginx版本,以應(yīng)用最新的安全修復(fù)。
3.3. 方案3
在Spring Boot中你可以通過定制一個(gè)攔截器來防止路徑遍歷攻擊。攔截器可以在處理請(qǐng)求前對(duì)請(qǐng)求的URL進(jìn)行檢查,如果URL包含非法字符(如"…/“或”./"),則可以拒絕該請(qǐng)求。== 這種可能會(huì)誤攔截,大家使用的時(shí)候注意充分測試和考慮各種渠道==
一個(gè)簡單示例可供參考
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;
}
}需要在一個(gè)配置類中將這個(gè)攔截器注冊(cè)到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將會(huì)在處理每個(gè)請(qǐng)求前,先執(zhí)行PathTraversalInterceptor的preHandle方法來檢查請(qǐng)求的URL。
這種方法 也只能作為臨時(shí)的解決方案,它不能替代升級(jí)SpringBoot到?jīng)]有該漏洞的版本。因?yàn)楣粽呖赡軙?huì)使用編碼繞過你的檢查,而升級(jí)Spring Boot可以徹底修復(fù)該漏洞。
到此這篇關(guān)于Spring Boot存在路徑遍歷漏洞CVE-2021-22118的文章就介紹到這了,更多相關(guān)Spring Boot漏洞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java for循環(huán)常見優(yōu)化方法案例詳解
這篇文章主要介紹了Java for循環(huán)常見優(yōu)化方法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
多模字符串匹配算法原理及Java實(shí)現(xiàn)代碼
這篇文章主要介紹了多模字符串匹配算法原理及Java實(shí)現(xiàn)代碼,涉及算法背景,原理,構(gòu)建過程簡單介紹幾Java代碼實(shí)現(xiàn)等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Java中用POI實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到Excel
這篇文章主要介紹了Java中用POI實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到Excel,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
java項(xiàng)目中常用指標(biāo)UV?PV?QPS?TPS含義以及統(tǒng)計(jì)方法
文章介紹了現(xiàn)代Web應(yīng)用中性能監(jiān)控和分析的重要性,涵蓋了UV、PV、QPS、TPS等關(guān)鍵指標(biāo)的統(tǒng)計(jì)方法,并提供了示例代碼,同時(shí),文章還討論了性能優(yōu)化和瓶頸分析的策略,以及使用Grafana等可視化工具進(jìn)行監(jiān)控與告警的重要性2025-01-01
Spring?Cloud?Gateway?2.x跨域時(shí)出現(xiàn)重復(fù)Origin的BUG問題
這篇文章主要介紹了Spring?Cloud?Gateway?2.x跨域時(shí)出現(xiàn)重復(fù)Origin的BUG問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Spring使用@Filter注解創(chuàng)建自定義過濾器
Spring 中鮮為人知但非常有用的注解之一是 @Filter,它支持自定義過濾器,下面我們就來深入研究一下如何使用 Spring 的 @Filter 注解來創(chuàng)建自定義過濾器吧2023-11-11
Java設(shè)計(jì)模式常用的七大原則總結(jié)
今天給大家總結(jié)了Java設(shè)計(jì)模式的七大原則,主要有單一職責(zé)原則,接口隔離原則,依賴倒轉(zhuǎn)原則,里氏替換原則等,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06

