Spring Cloud Config Server 任意文件讀取漏洞安全通告
發布時間 2019-04-18漏洞編號和級別
CVE編號:CVE-2019-3799,危險級別:高危,CVSS分值:官方未評定
影響版本
Spring Cloud Config 2.1.0 to 2.1.1
Spring Cloud Config 2.0.0 to 2.0.3
Spring Cloud Config 1.4.0 to 1.4.5
其他不受支持的老版本 (如Spring Cloud Config1.3及其以下版本)
值得注意的是通過maven自動構建的應用,如果不指定spring-cloud-config-server的版本,默認安裝的還是spring-cloud-config-server 1.3.0不安全版本
漏洞概述
Spring Cloud Config一套開源分布式系統配置服務,為分布式環境提供外部配置服務支持。Spring Cloud Config Server 路徑穿越與任意文件讀取漏洞,可通過構造的惡意請求直接讀取服務器任意文件,風險較大。
漏洞驗證
環境搭建: https://github.com/spring-cloud/spring-cloud-config#quick-start
GET /foo/default/master/..%252F..%252F..%252F..%252Fetc%252fpasswd HTTP/1.1
Host: localhost:8888
Spring Cloud Config項目是一個解決分布式系統的配置管理方案。它包含了Client和Server兩個部分,server提供配置文件的存儲、以接口的形式將配置文件的內容提供出去,client通過接口獲取數據、并依據此數據初始化自己的應用。Spring cloud使用git或svn存放配置文件,默認情況下使用git。
Pom.xml 配置依賴
Application.yml 設置配置文件存放的遠程倉庫地址
啟動文件
org/springframework/cloud/config/sever/resource/ResourceController.java中可以查看http請求格式為@RequestMapping("/{name}/{profile}/{label}/**")
name為應倉庫名稱
profile為應配置文件環境
label 為git分支名
** 為具體文件名
實際測試中只需要label為存在的分支名即可,一般git倉庫都存在master分支
所以通用poc地址為:
/test/dev/master/..%252F..%252F..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd
傳入參數后 會調用this.resourceRepository.findOne(name, profile, label, path)并根據配置文件中的倉庫地址去組裝新的地址并獲取文件內容。我們跟入到org.springframework.cloud.config.server.resource的findOne方法中。
findOne 中location為遠程git地址下載到本地的tmp目錄地址,然后和我們傳入的path拼裝為file:/var/folders/2t/2pcjgph96ms9jltyfnm5brr40000gn/T/config-repo-1763575875528585941/..%2F..%2F..%2F..%2F..%2F..%2F.-dev.%2Fetc%2Fpasswd。
this.resourceLoader.getResource(path)方法為 spring.core中封裝的獲取資源文件方法,默認會還原URLdecode的地址并通過 ../../將前面的tmp路徑地址吃掉,最終達到穿越到任意路徑,讀取任意文件的效果。
修復建議
Spring Cloud Config 2.1.x 升級至 to 2.1.2,Spring Cloud Config 2.0.x u升級至 2.0.4,Spring Cloud Config 1.4.x 升級至 1.4.6老版本升級到指定的安全版本spring-cloud-config-server應部署在內網中并使用Spring Security進行用戶身份鑒定。
Spring Security配置支官方文檔Securing Spring Cloud Config Server
https://github.com/spring-cloud/spring-cloud-config/commit/3632fc6f64e567286c42c5a2f1b8142bfde505c2
參考鏈接
https://pivotal.io/security/cve-2019-3799