
# CVE-2026-26717 का तकनीकी विवरण: OpenFUN Richie LMS वेबहुक प्रमाणीकरण में HMAC टाइमिंग हमला ## भेद्यता सारांश CVE-2026-26717 OpenFUN Richie LMS के वेबहुक प्रमाणीकरण तंत्र में एक HMAC टाइमिंग हमले की भेद्यता है। यह दोष हमलावरों को वैध हस्ताक्षर का अनुमान लगाने और अप्रमाणित वेबहुक अनुरोध भेजने की अनुमति देता है। ## प्रभावित घटक - **उत्पाद:** OpenFUN Richie LMS - **प्रभावित संस्करण:** 2.x (सभी संस्करण 2.27 से पहले) - **सुरक्षित संस्करण:** 2.27 और बाद के संस्करण - **CWE वर्गीकरण:** CWE-208 (समय-निर्भर सूचना प्रकटीकरण) ## भेद्य कोड निम्नलिखित कोड स्निपेट भेद्य प्रमाणीकरण तर्क को दर्शाता है: ```python import hmac import hashlib def verify_webhook_signature(payload, signature, secret): """ वेबहुक हस्ताक्षर सत्यापित करता है (भेद्य संस्करण) """ expected = hmac.new( secret.encode('utf-8'), payload, hashlib.sha256 ).hexdigest() # भेद्य तुलना: साधारण स्ट्रिंग तुलना return signature == expected ``` ## हमले का परिदृश्य हमलावर निम्नलिखित तरीके से टाइमिंग हमले का शोषण कर सकता है: 1. **हस्ताक्षर अनुमान:** `==` ऑपरेटर का उपयोग करके, Python पहले अक्षर से तुलना शुरू करता है और पहले अक्षर के मेल खाने पर ही अगले अक्षर पर जाता है। यह हमलावर को प्रतिक्रिया समय मापकर सही हस्ताक्षर का अक्षर-दर-अक्षर अनुमान लगाने की अनुमति देता है। 2. **समय मापन:** प्रत्येक अनुरोध के लिए, हमलावर प्रतिक्रिया समय को मापता है। लंबा समय इंगित करता है कि अधिक अक्षर मेल खाते हैं। 3. **क्रमिक निर्माण:** सही अक्षरों की पहचान करके, हमलावर धीरे-धीरे पूरा HMAC हस्ताक्षर बना सकता है। ## प्रभाव - **गंभीरता:** उच्च (CVSS स्कोर: 7.5) - **हमले का वेक्टर:** नेटवर्क - **हमले की जटिलता:** निम्न - **आवश्यक विशेषाधिकार:** कोई नहीं - **उपयोगकर्ता सहभागिता:** कोई नहीं - **प्रभाव:** अप्रमाणित वेबहुक अनुरोध, डेटा हेरफेर, संभावित RCE ## समाधान सुरक्षित संस्करण `hmac.compare_digest` का उपयोग करता है, जो निरंतर-समय तुलना प्रदान करता है: ```python import hmac import hashlib def verify_webhook_signature(payload, signature, secret): """ वेबहुक हस्ताक्षर सत्यापित करता है (सुरक्षित संस्करण) """ expected = hmac.new( secret.encode('utf-8'), payload, hashlib.sha256 ).hexdigest() # सुरक्षित तुलना: निरंतर-समय तुलना return hmac.compare_digest(signature, expected) ``` ## शमन उपाय 1. **तत्काल:** Richie LMS को संस्करण 2.27 या बाद में अपग्रेड करें। 2. **वैकल्पिक:** यदि अपग्रेड संभव नहीं है, तो वेबहुक एंडपॉइंट के सामने एक WAF (वेब एप्लिकेशन फ़ायरवॉल) तैनात करें जो अनुरोध दर सीमित करता है। 3. **निगरानी:** वेबहुक एंडपॉइंट पर असामान्य अनुरोध पैटर्न की निगरानी करें, विशेष रूप से कई अनुरोध जो समय-आधारित अनुमान लगाने का संकेत देते हैं। ## संदर्भ - [NVD - CVE-2026-26717](https://nvd.nist.gov/vuln/detail/CVE-2026-26717) - [OpenFUN Richie सुरक्षा सलाहकार](https://github.com/openfun/richie/security/advisories) - [OWASP - टाइमिंग हमले](https://owasp.org/www-community/attacks/Timing_Attack)
लेखक: एल्विन लतीफली
CVE ID: CVE-2026-26717
गंभीरता: मध्यम (CVSS 3.1: 4.8 — AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N)
प्रभावित उत्पाद: OpenFUN Richie (कमिट a1b5bbd से पहले के सभी संस्करण)
प्रभावित घटक: src/richie/apps/courses/api.py — sync_course_runs_from_request
फिक्स कमिट: a1b5bbda
Richie फ्रांस यूनिवर्सिटे न्यूमेरिक (OpenFUN) द्वारा विकसित एक ओपन-सोर्स CMS है, जो DjangoCMS के ऊपर बनाया गया है। इसे संगठनों को OpenEdX जैसे लर्निंग मैनेजमेंट सिस्टम (LMS) से सिंक्रोनाइज़ किए गए कोर्स कैटलॉग के साथ पूर्ण-विशेषताओं वाले ऑनलाइन शिक्षा पोर्टल बनाने में मदद करने के लिए डिज़ाइन किया गया है। Richie प्रमाणित वेबहुक के माध्यम से कोर्स डेटा सिंक्रोनाइज़ेशन को संभालता है — जिनमें से एक में इस रिपोर्ट में वर्णित भेद्यता थी।
sync_course_runs_from_request वेबहुक एंडपॉइंट आने वाले Authorization हेडर की तुलना अपेक्षित HMAC हस्ताक्षर से करने के लिए मानक == ऑपरेटर का उपयोग करता था:
# VULNERABLE
signature_is_valid = any(
authorization_header == get_signature(message, secret)
for secret in getattr(settings, "RICHIE_COURSE_RUN_SYNC_SECRETS", [])
)
== ऑपरेटर गैर-स्थिर-समय तुलना करता है — यह पहले बेमेल वर्ण मिलते ही शॉर्ट-सर्किट हो जाता है। कई क्राफ्टेड अनुरोध भेजकर और प्रतिक्रिया समय में अंतर मापकर, एक दूरस्थ हमलावर सही हस्ताक्षर का एक-एक करके अनुमान लगा सकता है, अंततः एक वैध प्रमाणीकरण टोकन बना सकता है और वेबहुक के प्रमाणीकरण को पूरी तरह से बायपास कर सकता है।
एक सफल हमला एक अनप्रमाणित दूरस्थ हमलावर को अनुमति देता है:
फिक्स == को Python के hmac.compare_digest() से बदल देता है, जो स्थिर-समय स्ट्रिंग तुलना के लिए डिज़ाइन किया गया है और टाइमिंग साइड-चैनल को समाप्त करता है:
# FIXED
signature_is_valid = any(
hmac.compare_digest(authorization_header, get_signature(message, secret))
for secret in getattr(settings, "RICHIE_COURSE_RUN_SYNC_SECRETS", [])
)