- File-Traversal(경로 탐색, Path Traversal) 취약점은 공격자가 웹 애플리케이션에서 파일 시스템의 권한을 우회하여 임의의 파일에 접근할 수 있도록 하는 취약점 이며 CWE-22로 지정 되어있는 공격의 일종 입니다.CVE-2024-38819은 WebFlux.fn, WebMVC.fn를 사용하는 애플리케이션에서 발생하며 본 문서는 해당 취약점이 WebFlux기준으로 어떻게 발생하는지 코드 흐름을 살펴보고 이에 따른 대응 방안을 모색 해보고자 합니다.
- Spring WebFlux는 Spring 5에서 도입된 리액티브 프로그래밍을 지원하는 모듈로, 비동기 논블로킹 애플리케이션 개발을 지원하며 WebFlux.fn은 함수형 엔드포인트 라우팅을 제공하여, 람다 표현식을 사용한 간결하고 유연한 라우팅 구성을 지원합니다.
-
Spring Webflux 6.13 에서 **정적 리소스(static resource)**를 서빙(Serving)하는 예제를 통해 File-Traversal 공격을 할수 있다.
예제를 살펴 보며 Spring Webflux를 이용해 어떻게 File-Traversal 유발 되는지 알아보고자 한다.
[그림 1] FileApplication.java
[그림 1]은 Spring WebFlux에서 /static/**로 들어오는 모든 요청을 서버의 C:/file 디렉터리에서 찾아 서빙(Serving) 합니다. 여기서
RouterFunctions.resources 호출 중에 [그림 2], [그림 3] webflux 의 PathResourceLookupFunction.class 에서 의 문제가 시작됩니다.
[그림 2] PathResourceLookupFunction.class - apply
[그림 2] PathResourceLookupFunction - apply은 Spring WebFlux에서 주어진 경로가 유효한 리소스를 가리키는지 확인하고, 해당 리소스를
Mono 형태로 반환하는 역할을 합니다. 이 과정에서 경로 매칭, 유효성 검사, 경로 디코딩, 리소스 접근 등의 여러 단계를 수행 중 isInvalidPath
함수 에서 취약점이 발생합니다.
[그림 3] PathResourceLookupFunction.class - isInvalidPath
[그림 3] PathResourceLookupFunction - isInvalidPath를 보면 StringUtils.cleanPath(path).contains("../") 해당 조건이 존재 하는데
http://localhost:8080/static/file/../Windows/System32/drivers/etc/hosts 요청 시 해당 조건은 True가 될 수 없습니다. 이유로
[그림 4] StringUtils.class - cleanPath
[그림 4] StringUtils.class - cleanPath 보면 StringUtils.cleanPath(path)는 TOP_PATH("..")를 제거 후 경로를 pathElements에 넣고 top은 0이 됨으로
".."가 1번 들어간 공격 구문은 정상 구문으로 처리 됩니다. 그러하여 [그림 3]의 isInvalidPath의 함수는 false를 리턴하고
[그림 5] PathResourceLookupFunction.class - apply - 2
[그림 6] PathResourceLookupFunction.class - isResourceUnderLocation
[그림 5] 의 isResourceUnderLocation의 cleanPath 호출로 [그림 6]을 통해 cleanPath를 통한 또 한번의 검증을 거치게 되며 [그림 5]에서 넘긴 경로는 C:/file../Windows/System32/drivers/etc/hosts 이며
[그림 7] StringUtils.class - cleanPath -2
[그림 7] 의 코드를 통해 prefix는 C:/ 가 되며 경로는 [그림 4]를 통해/ Windows/System32/drivers/etc/hosts로 변경 되어 최종 리턴은
C:/Windows/System32/drivers/etc/hosts로 처리 되는 흐름 입니다.
현재는 윈도우에서 C:/file로 테스트를 진행하였지만 해당 케이스가 리눅스 에 심볼릭 링크와 함께 동작 시 매우 위험하다.
(../../ 두번 설정 시 정상 로직 ../ 한번 일 경우만 취약점 발생)
리눅스 서버에 심볼릭 링크와 함께 공격
public RouterFunction<ServerResponse> staticResourceRouter() {
return RouterFunctions.resources("/static/**", new FileSystemResource("/app/static/"));
}
심볼릭 링크 추가 ln -s /static /app/static/link 후 공격
지금까지 Spring Webflux환경에서 File Traversal(CVE-2024-38819)이 수행되는 흐름을 체크 해봤습니다. 서버의 정보가 탈취 당하는 공격 방식이기에 대응 방안이 중요합니다. 이를 위해 최신 버전 업데이트, 추가 검수 로직 제작, IPS를 통한 차단 방안을 제시 하고자 합니다.
-
아래 표를 참고 하고 사용 버전을 체크 후 업그레이드 해주시기 바랍니다.
-
위 공격 예시를 보다시피 TOP_PATH(..)가 한번 포함 된 케이스가 문제 됨으로 간략한 필터 적용 로직(참고 후 개발자 분들이 더 추가)
@Bean public RouterFunction<ServerResponse> staticResourceRouter() { return RouterFunctions.resources("/static/**", new FileSystemResource("C:/file")) .filter((request, next) -> { String path = request.path(); if (path.contains("..")) { if(!StringUtils.cleanPath(path).contains("../")) { return ServerResponse.status(HttpStatus.FORBIDDEN).bodyValue("Vuln path access."); } } return next.handle(request); }); }
-
공격 예시 : 포스트 맨을 통해 url에 ../ 경로를 포함 하여 요청
../ 상위 경로의 이동을 유발하는 url 요청을 전부 차단
지금까지 Webflux를 통한 File Tarversal을 알아 봤습니다. 해당 취약점은 StringUtils.cleanPath()의 로직에서 비롯된 문제를 인지 못하고 사용한 경우 였습니다.
(POC) https://github.com/masa42/CVE-2024-38819-POC
(스프링 공식) https://spring.io/security/cve-2024-38819
(CVE-DETAIL) https://www.cvedetails.com/cve/CVE-2024-38819/
(NIST) https://nvd.nist.gov/vuln/detail/cve-2024-38819
'경로 및 정보' 카테고리의 다른 글
Fileuplad via Stored XSS (0) | 2025.10.07 |
---|---|
Powershell 파워쉘 실행정책 - Execution Policy (0) | 2025.10.05 |
Proving Grounds: Butch [OSCP Prep 2025 — Practice 14] (0) | 2025.08.31 |
What is Azure Application Gateway v2 (2) | 2025.06.06 |
Intercept HTTPS Traffic When all other Frida Scripts Fail (0) | 2025.06.06 |