漏洞分析 Spring Framework路径遍历漏洞(CVE-2024-38816)

漏洞概述

VMware Spring Framework是美国威睿(VMware)公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。

近期,监测到Spring Framework在特定条件下,存在目录遍历漏洞(网宿评分:高危、CVSS 3.1 评分:7.5):

当同时满足使用 RouterFunctions 和 FileSystemResource 来处理和提供静态文件时,攻击者可构造恶意请求遍历读取系统上的文件。

目前该漏洞POC状态已在互联网公开,建议客户尽快做好自查及防护。

受影响版本

Spring Framework 5.3.0 - 5.3.39

Spring Framework 6.0.0 - 6.0.23

Spring Framework 6.1.0 - 6.1.12

其他更旧或者官方已不支持的版本

漏洞分析

根据漏洞描述(https://spring.io/security/cve-2024-38816)可知,关键变更在于如何处理静态资源路径。

https://github.com/spring-projects/spring-framework/commit/d86bf8b2056429edf5494456cffcb2b243331c49#diff-25869a3e3b3d4960cb59b02235d71d192fdc4e02ef81530dd6a660802d4f8707R4

这里改了两处,分别是:

webflux --> org.springframework.web.reactive.function.server.PathResourceLookupFunction

webmvc --> org.springframework.web.servlet.function.PathResourceLookupFunction

它们都旨在为 Web 应用程序提供静态内容的访问。

以webmvc --> org.springframework.web.servlet.function.PathResourceLookupFunction为例,展开分析。

先是动态处理了资源请求,确保只返回有效并且可访问的资源。

@Override
public Optional<Resource> apply(ServerRequest request) {
        PathContainer pathContainer = request.requestPath().pathWithinApplication();
        if (!this.pattern.matches(pathContainer)) {
                return Optional.empty();
        }
 
        pathContainer = this.pattern.extractPathWithinPattern(pathContainer);
        String path = processPath(pathContainer.value());
        if (path.contains("%")) {
 
<< Spring Web MVC 框架中存在路径遍历漏洞CVE-2024-38819),该漏洞使得攻击者可以通过构造恶意请求访问或操作服务器上未授权的文件资源。这一问题主要源于 Spring 对用户输入参数的安全验证不足,特别是对 `ResourceLoader` 或类似功能处理不当。 ### 问题分析与解决方案 #### 1. **漏洞描述** - 在某些场景下,当使用 `@RequestMapping` 注解或其他相关机制时,如果开发者直接将用户的输入作为文件路径的一部分进行加载而没有做严格的校验,则可能导致路径遍历攻击。 - 攻击者可能通过发送类似于 `/../../etc/passwd` 的 URL 参数绕过安全限制,并读取敏感信息。 #### 2. **修复方案** 为防止此类漏洞的发生,建议采取以下措施: ##### 方法一:白名单校验 确保所有传入的路径都经过合法性的检查,仅允许特定目录下的文件被访问。 ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; @RestController public class SecureController { private static final String BASE_DIR = "/safe/path/"; @GetMapping("/secure") public String secureFileAccess(@RequestParam("file") String fileName) { Path baseDirPath = Paths.get(BASE_DIR); Path filePath = Paths.get(fileName); // 使用 toRealPath() 防止路径穿越 try { File resolvedFile = baseDirPath.resolve(filePath).toRealPath().toFile(); if (!resolvedFile.toString().startsWith(baseDirPath.toAbsolutePath().toString())) { return "Invalid file path."; } // 只有确认无误后才返回实际内容 return "You requested: " + resolvedFile.getAbsolutePath(); } catch (Exception e) { return "Error accessing the file."; } } } ``` **解释**: - 上述代码首先定义了一个基础目录 (`BASE_DIR`) ,所有的文件访问必须基于此目录展开; - 利用 Java NIO API 中的 `resolve()` 和 `toRealPath()` 方法保证生成的目标地址不会脱离指定范围外的有效区域之外; - 如果检测到尝试突破设定边界的行为,则立即中断执行并反馈错误提示给调用方; ##### 方法二:升级框架版本 官方已经针对这个问题发布了补丁更新,请及时迁移到最新稳定版以获得更全面防护能力。(具体可查阅 https://spring.io/projects/spring-framework#learn 获取当前支持状况) --- ### 总结 为了有效防范路径穿越攻击,在设计涉及动态文件读写的接口时应当始终贯彻最小权限原则——即只授予必要且足够的存取许可权限,并结合程序内建逻辑严密过滤掉潜在危险字符组合如点号、斜杠等符号序列以防万一发生意外情况导致系统遭受损害。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值