FlawOpen

flawopen.com/Incidents/citrix-bleed-session-token-leak-october-2023

● Citrix · CVE-2023-4966 · October 2023 · CVSS 9.4 · अति गंभीर
सुरक्षा अनुसंधान · FlawOpen

Citrix Bleed: सेशन टोकन लीक और MFA बायपास

CVE-2023-4966 से NetScaler की मेमोरी और सेशन टोकन लीक हो सकते थे; हमलावर MFA के बिना सेशन हाईजैक कर सकते थे। शोषण अगस्त 2023 के अंत में शुरू हुआ।[1], [2]

💡 आसान भाषा में (ELI5)

आप एक सहायक से कहते हैं कि एक संदेश छोटे कार्ड पर उतार दे और बताए कि वह कितना लंबा है। कार्ड पर सिर्फ़ 50 अक्षर आते हैं, इसलिए वह 50 लिखता है, लेकिन लंबाई पूछने पर ईमानदारी से कहता है "800 अक्षर", क्योंकि मूल संदेश इतना ही लंबा था। फिर आप वह कार्ड किसी और को देकर कहते हैं कि इसमें से 800 अक्षर पढ़ो। वह आपके 50 अक्षर पढ़कर कागज़ के बाक़ी हिस्से पर जो कुछ लिखा है, वह भी पढ़ता चला जाता है।[2]

इस पेज के मुख्य शब्द

snprintf
C का एक फ़ंक्शन जो टेक्स्ट को तय आकार के बफ़र में फ़ॉर्मेट करता है। टेक्स्ट न समाए तो वह उसे काट देता है, लेकिन लौटाता वह लंबाई है जो पूरे टेक्स्ट की होती।[3]
NetScaler ADC / Gateway
नेटवर्क की सीमा पर रिमोट एक्सेस और लोड बैलेंसिंग देने वाले Citrix उपकरण। केवल Gateway या AAA वर्चुअल सर्वर के रूप में कॉन्फ़िगर किए गए उपकरण प्रभावित थे।[1]
बफ़र से आगे पढ़ना (CWE-125)
बफ़र के अंत के आगे पढ़ना। कुछ भी ओवरराइट नहीं होता, लेकिन पड़ोसी मेमोरी में जो कुछ है वह उजागर हो जाता है। यह विशिष्ट out-of-bounds read तंत्र (CWE-125) बताता है; Citrix CVE-2023-4966 को व्यापक रूप से CWE-119 में वर्गीकृत करता है।[1], [3]
सेशन टोकन
वह मान जो साबित करता है कि उपयोगकर्ता पहले ही लॉग-इन कर चुका है। इसे पेश करने वाले को, बिना पासवर्ड या MFA के, वही उपयोगकर्ता मान लिया जाता है।[2]

फ्रेमवर्क मैपिंग

घटना का समयक्रम (Timeline)

2023-08

बाद की इंसिडेंट-रिस्पॉन्स रिपोर्टों के अनुसार, ख़ामी का ज़ीरो-डे के रूप में दुरुपयोग शुरू होता है।[2]

2023-10-10

Citrix सुरक्षा बुलेटिन CTX579459 प्रकाशित करता है, जिसमें सुधरे हुए बिल्ड 14.1-8.50, 13.1-49.15 और 13.0-92.19 हैं।[1]

2023-10-18

CISA, CVE-2023-4966 को Known Exploited Vulnerabilities सूची में जोड़ता है।[4]

हमले का चरण-दर-चरण प्रवाह

चरण 1

बहुत बड़ा हेडर

बहुत लंबे Host हेडर वाला बिना प्रमाणीकरण का अनुरोध उस कोड तक पहुँचता है जो उपकरण पर OpenID Connect डिस्कवरी जवाब बनाता है।[2], [3]

चरण 2

लंबाई ग़लत पढ़ी जाती है

snprintf टेक्स्ट को बफ़र में समाने लायक़ काट देता है, पर पूरी संभावित लंबाई लौटाता है, और कोड उसे लिखे गए बाइट्स की संख्या मान लेता है।[3], [2]

चरण 3

बफ़र के आगे की मेमोरी भेज दी जाती है

जवाब उसी बड़ी लंबाई के साथ भेजा जाता है, इसलिए उपकरण कटे हुए JSON के साथ पड़ोसी मेमोरी भी लौटा देता है।[2]

चरण 4

सेशन पर क़ब्ज़ा

लीक हुई मेमोरी में वैध सेशन टोकन हो सकते हैं। उनमें से एक को दोबारा इस्तेमाल करके हमलावर बिना पासवर्ड और MFA के उपयोगकर्ता का सेशन पा लेता है।[2], [1]

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

यह उदाहरण के लिए C कोड है, NetScaler का सोर्स कोड नहीं। सुधार snprintf के रिटर्न मान की जाँच करता है, जो बताता है कि पूरा आउटपुट कितना लंबा होता। यदि यह ऋणात्मक हो या बफ़र के आकार के बराबर या उससे बड़ा हो, तो formatting विफल हुई या आउटपुट कट गया; इसलिए फ़ंक्शन कुछ नहीं भेजता। इस तरह send_response को लंबाई तभी मिलती है जब पूरा उत्तर buf में समा जाए।[3], [2]

कमज़ोर कार्यान्वयन
#include <stdio.h>

int send_response(const char *data, int len);

int send_oidc_config(const char *host)
{
    char buf[256];
    /* n उन bytes की संख्या है जो लिखे जाते और sizeof(buf) से अधिक हो सकती है */
    int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
    return send_response(buf, n);   /* n bytes भेजता है और buf की सीमा से आगे पढ़ता है */
}
सुरक्षित और सुदृढ़ फ़िक्स
#include <stdio.h>

int send_response(const char *data, int len);

int send_oidc_config(const char *host)
{
    char buf[256];
    int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
    if (n < 0 || (size_t)n >= sizeof(buf))
        return -1;                  /* कटे हुए आउटपुट को अस्वीकार करें; बफ़र से आगे कभी न भेजें */
    return send_response(buf, n);
}

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत