FlawOpen

flawopen.com/Teardowns/cve-2024-33066-qualcomm-wlan-log-redirection

● CVE-2024-33066 · CVSS 9.8 · अति गंभीर
सुरक्षा अनुसंधान · FlawOpen

CVE-2024-33066: Qualcomm WLAN लॉग मेमोरी करप्शन

CVE-2024-33066 में Qualcomm WLAN Resource Manager कॉलर के चुने पथ पर लॉग भेजते समय मेमोरी करप्ट कर सकता है। अक्टूबर 2024 में सुधार जारी हुआ।

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

एक होटल रिसेप्शन की कल्पना करें जहाँ कोई भी फ़ोन करके कह सकता है: "अब से मेहमानों के रजिस्टर की प्रतियाँ इस पते पर भेजना।" रिसेप्शनिस्ट जो कुछ बोला जाए उसे एक छोटे कार्ड पर लिख लेता है, भले ही लिखावट कार्ड से बाहर निकलकर मेज़ पर आ जाए, और फिर प्रतियाँ वहीं भेज देता है जहाँ लिखा हो, मैनेजर की तिजोरी में भी। समाधान यह है कि केवल एक छोटा लेबल स्वीकार किया जाए जो रिकॉर्ड-रूम की किसी दराज़ का नाम हो।

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

WLAN Resource Manager
CVE-2024-33066 पर Qualcomm की सलाह में नामित Wi-Fi घटक। यह Qualcomm के नेटवर्किंग प्लेटफ़ॉर्म पर चलता है, जिनका उपयोग राउटर, मेश सिस्टम और एक्सेस पॉइंट में होता है।
IPQ / QCN चिपसेट
Qualcomm के Wi-Fi नेटवर्किंग सिस्टम-ऑन-चिप परिवार। प्रभावित सूची में IPQ5332, IPQ8074A, IPQ9574, QCN9000 और Immersive Home प्लेटफ़ॉर्म शामिल हैं, फ़ोन के चिपसेट नहीं।
CWE-20
अनुचित इनपुट सत्यापन: सॉफ़्टवेयर इनपुट पर भरोसा कर लेता है और यह नहीं जाँचता कि उसमें वे गुण हैं जिन पर कोड निर्भर है, जैसे अधिकतम लंबाई या अनुमत डायरेक्टरी।
डायरेक्टरी-सापेक्ष ओपन
openat() से किसी डायरेक्टरी डिस्क्रिप्टर के सापेक्ष, बिना '/' वाले सादे नाम से फ़ाइल खोलना, ताकि परिणाम उस डायरेक्टरी के बाहर न पहुँच सके।
CVSS 3.1 वेक्टर
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H: नेटवर्क से पहुँच योग्य, कम जटिलता, किसी विशेषाधिकार या उपयोगकर्ता क्रिया की ज़रूरत नहीं, तीनों गुणों पर उच्च प्रभाव (स्कोर 9.8)।

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

  • इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-20

मूल कारण विश्लेषण (Root Cause)

Qualcomm की सलाह बस इतना कहती है कि WLAN Resource Manager में "while redirecting log file to any file location with any file name" मेमोरी करप्शन होता था (CWE-20)। लॉग रीडायरेक्शन अनुरोध के साथ दिया गया गंतव्य बिना उसकी लंबाई या उसके ठिकाने की जाँच किए इस्तेमाल होता था। नीचे का कोड इनपुट सत्यापन की इसी कमी का मॉडल है; यह केवल उदाहरण के लिए है और Qualcomm का सोर्स कोड नहीं है।

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

चरण 1

1. लॉग रीडायरेक्शन का अनुरोध आता है

WLAN Resource Manager अपने लॉग आउटपुट को कहीं और भेजने का अनुरोध स्वीकार करता है। CVSS वेक्टर (AV:N/PR:N/UI:N) इस ख़ामी को बिना विशेषाधिकार और बिना उपयोगकर्ता क्रिया के नेटवर्क से पहुँच योग्य मानता है।

चरण 2

2. कोई भी जगह और कोई भी नाम स्वीकार

Qualcomm के विवरण के अनुसार, रीडायरेक्शन किसी भी जगह और किसी भी फ़ाइल नाम से काम करता था: माँगे गए गंतव्य की न लंबाई जाँची जाती थी, न यह कि वह कहाँ ले जाता है।

चरण 3

3. बिना जाँचा इनपुट मेमोरी बिगाड़ता है

नीचे के मॉडल में, पथ के तय आकार वाले बफ़र से लंबा नाम उसे ओवरफ़्लो कर देता है (strcpy), और कोई भी पथ, कॉन्फ़िगरेशन फ़ाइलें भी, लिखने के लिए खोला जा सकता है। Qualcomm ने नहीं बताया कि उसके कोड में इनमें से कौन-सा मामला हुआ।

चरण 4

4. प्रभाव और स्थिति

CVSS 3.1 गोपनीयता, अखंडता और उपलब्धता, तीनों पर प्रभाव को उच्च आँकता है (9.8)। Qualcomm ने अक्टूबर 2024 के बुलेटिन में सुधार डिवाइस निर्माताओं को दिया; CISA के आकलन में किसी ज्ञात दुरुपयोग का रिकॉर्ड नहीं है।

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

यह इस तरह की कमज़ोरी का उदाहरण मॉडल है, Qualcomm का कोड नहीं। मज़बूत हैंडलर इनपुट को छूने से पहले strnlen से उसकी सीमा तय करता है, केवल तय अक्षरों से बना छोटा नाम स्वीकार करता है (न '/', न शुरुआत में '.') और उसे स्टार्ट-अप पर चुनी गई लॉग डायरेक्टरी के सापेक्ष openat() से O_NOFOLLOW के साथ खोलता है, ताकि पहले से रखा गया symlink लिखने की दिशा न बदल सके। कॉल करने वाला फ़ाइल का नाम चुन सकता है, जगह कभी नहीं, और बहुत लंबा इनपुट कॉपी होने के बजाय अस्वीकार हो जाता है।

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

#define LOG_PATH_MAX 64

struct rm_log_cfg {
    char path[LOG_PATH_MAX];
    int fd;
};

/* "redirect log" अनुरोध संभालता है; `requested` request body से आता है। */
int rm_set_log_destination(struct rm_log_cfg *cfg, const char *requested)
{
    strcpy(cfg->path, requested);   /* लंबाई की जाँच नहीं: लंबा input path[] की सीमा पार कर जाता है */
    cfg->fd = open(cfg->path, O_WRONLY | O_CREAT | O_APPEND, 0644);  /* कोई भी स्थान */
    return cfg->fd < 0 ? -1 : 0;
}
सुरक्षित और सुदृढ़ फ़िक्स
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

#define LOG_NAME_MAX 32

struct rm_log_cfg {
    int dir_fd;                /* fixed log directory, जिसे startup पर एक बार खोला जाता है */
    char name[LOG_NAME_MAX];
    int fd;
};

static int valid_log_name(const char *name, size_t len)
{
    if (len == 0 || len >= LOG_NAME_MAX || name[0] == '.')
        return 0;
    for (size_t i = 0; i < len; i++) {
        char c = name[i];
        int ok = (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
                 c == '-' || c == '_' || c == '.';
        if (!ok)
            return 0;          /* यह '/' को अस्वीकार करता है, इसलिए नाम dir_fd से बाहर नहीं जा सकता */
    }
    return 1;
}

int rm_set_log_destination(struct rm_log_cfg *cfg, const char *requested)
{
    size_t len = strnlen(requested, LOG_NAME_MAX);
    if (!valid_log_name(requested, len))
        return -EINVAL;

    int fd = openat(cfg->dir_fd, requested,
                    O_WRONLY | O_CREAT | O_APPEND | O_NOFOLLOW | O_CLOEXEC, 0600);
    if (fd < 0)
        return -errno;

    memcpy(cfg->name, requested, len + 1);
    if (cfg->fd >= 0)
        close(cfg->fd);
    cfg->fd = fd;
    return 0;
}

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

स्रोत