CVE-2020-5405 Spring Cloud Config 路径穿越漏洞浅析
字数 1478 2025-08-20 18:17:53

Spring Cloud Config 路径穿越漏洞(CVE-2020-5405)深度分析与利用指南

漏洞概述

CVE-2020-5405是Spring Cloud Config中存在的一个路径穿越漏洞,允许攻击者通过精心构造的URL访问服务器上的任意文件。该漏洞影响以下版本:

  • 2.2.x系列至2.2.2版本
  • 2.1.x系列至2.1.7版本
  • 以及已停止更新的更早版本

漏洞背景

Spring Cloud Config是一个为微服务架构提供集中化外部配置支持的组件,分为服务端和客户端两部分:

  • 服务端:分布式配置中心,连接配置服务器并为客户端提供获取配置信息的接口
  • 客户端:从指定配置中心获取和加载配置信息

默认情况下,配置服务器使用git存储配置信息,便于版本管理和访问控制。

漏洞复现

环境搭建

  1. 下载受影响版本(如2.1.5.RELEASE):

    https://github.com/spring-cloud/spring-cloud-config/archive/v2.1.5.RELEASE.zip
    
  2. 修改配置文件src/main/resources/configserver.yml

    info:
      component: Config Server
    spring:
      application:
        name: configserver
      autoconfigure.exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
      jmx:
        default_domain: cloud.config.server
      profiles:
        active: native
      cloud:
        config:
          server:
            native:
              search-locations:
                - file:///Users/rai4over/Desktop/spring-cloud-config-2.1.5/config-repo
    
    server:
      port: 8888
    management:
      context_path: /admin
    
  3. 运行org.springframework.cloud.config.server.ConfigServerApplication

漏洞利用POC

基本利用方式:

http://127.0.0.1:8888/1/1/..(_)..(_)..(_)..(_)..(_)..(_)..(_)..(_)..(_)etc/passwd

URL编码变形:

http://127.0.0.1:8888/1/1/..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29etc/passwd

漏洞分析

请求处理流程

  1. 请求路由到ResourceController#retrieve方法,路径结构为/{name}/{profile}/{label}/{path}

    • name: 仓库名称(解析为1)
    • profile: 配置文件环境(解析为1)
    • label: git分支名(解析为..(_)..(_)..(_)..(_)..(_)..(_)..(_)..(_)..(_)etc)
    • path: 文件路径(解析为passwd)
  2. 关键处理函数:

    • resolveName: 替换name中的(_),本例中name不变
    • resolveLabel: 将..(_)替换为../,最终label变为../../../../../../../../../etc
  3. GenericResourceRepository#findOne处理:

    • 获取配置的搜索路径(search-locations)
    • 通过getProfilePaths生成可能的文件路径集合
    • 进行安全检查(isInvalidPathisInvalidEncodedPath)

安全绕过机制

漏洞核心在于:

  1. 路径中的(_)被替换为/,但安全检查未完全覆盖这种变形
  2. 安全检查函数(isInvalidPathisInvalidEncodedPath)主要检测:
    • WEB-INFMETA-INF路径
    • URL格式路径
    • 直接的../路径遍历
  3. 但未检测..(_)这种变形形式,导致可以绕过路径检查

补丁分析

官方修复提交:

https://github.com/spring-cloud/spring-cloud-config/commit/651f458919c40ef9a5e93e7d76bf98575910fad0

主要修复内容:

  1. GenericResourceRepository中新增isInvalidLocation方法
  2. findOne函数中增加对..的严格检测
  3. 强化了路径规范化处理

防御建议

  1. 升级到安全版本:

    • 2.2.x用户升级到2.2.3+
    • 2.1.x用户升级到2.1.8+
  2. 配置限制:

    • 严格限制search-locations的目录范围
    • 避免使用高权限账户运行服务
  3. 网络层面:

    • 配置WAF规则拦截包含..(_)的异常请求
    • 限制外部访问配置服务器的权限

参考资源

  1. 官方漏洞公告:

    https://pivotal.io/security/cve-2020-5405
    
  2. Spring Cloud Config文档:

    https://cloud.spring.io/spring-cloud-static/spring-cloud.html#_serving_plain_text
    
  3. 相关技术分析:

    http://www.lmxspace.com/2019/04/26/Spring-Cloud-Config-Server-%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E5%88%86%E6%9E%90/
    
  4. 漏洞复现项目:

    https://github.com/DSO-Lab/defvul/tree/master/CVE-2020-5405_SpringCloudConfig
    
Spring Cloud Config 路径穿越漏洞(CVE-2020-5405)深度分析与利用指南 漏洞概述 CVE-2020-5405是Spring Cloud Config中存在的一个路径穿越漏洞,允许攻击者通过精心构造的URL访问服务器上的任意文件。该漏洞影响以下版本: 2.2.x系列至2.2.2版本 2.1.x系列至2.1.7版本 以及已停止更新的更早版本 漏洞背景 Spring Cloud Config是一个为微服务架构提供集中化外部配置支持的组件,分为服务端和客户端两部分: 服务端 :分布式配置中心,连接配置服务器并为客户端提供获取配置信息的接口 客户端 :从指定配置中心获取和加载配置信息 默认情况下,配置服务器使用git存储配置信息,便于版本管理和访问控制。 漏洞复现 环境搭建 下载受影响版本(如2.1.5.RELEASE): 修改配置文件 src/main/resources/configserver.yml : 运行 org.springframework.cloud.config.server.ConfigServerApplication 漏洞利用POC 基本利用方式: URL编码变形: 漏洞分析 请求处理流程 请求路由到 ResourceController#retrieve 方法,路径结构为 /{name}/{profile}/{label}/{path} name : 仓库名称(解析为1) profile : 配置文件环境(解析为1) label : git分支名(解析为 ..(_)..(_)..(_)..(_)..(_)..(_)..(_)..(_)..(_)etc ) path : 文件路径(解析为 passwd ) 关键处理函数: resolveName : 替换name中的 (_) ,本例中name不变 resolveLabel : 将 ..(_) 替换为 ../ ,最终label变为 ../../../../../../../../../etc GenericResourceRepository#findOne 处理: 获取配置的搜索路径( search-locations ) 通过 getProfilePaths 生成可能的文件路径集合 进行安全检查( isInvalidPath 和 isInvalidEncodedPath ) 安全绕过机制 漏洞核心在于: 路径中的 (_) 被替换为 / ,但安全检查未完全覆盖这种变形 安全检查函数( isInvalidPath 和 isInvalidEncodedPath )主要检测: WEB-INF 和 META-INF 路径 URL格式路径 直接的 ../ 路径遍历 但未检测 ..(_) 这种变形形式,导致可以绕过路径检查 补丁分析 官方修复提交: 主要修复内容: 在 GenericResourceRepository 中新增 isInvalidLocation 方法 在 findOne 函数中增加对 .. 的严格检测 强化了路径规范化处理 防御建议 升级到安全版本: 2.2.x用户升级到2.2.3+ 2.1.x用户升级到2.1.8+ 配置限制: 严格限制 search-locations 的目录范围 避免使用高权限账户运行服务 网络层面: 配置WAF规则拦截包含 ..(_) 的异常请求 限制外部访问配置服务器的权限 参考资源 官方漏洞公告: Spring Cloud Config文档: 相关技术分析: 漏洞复现项目: