flawopen.com/Teardowns/cve-2024-33066-qualcomm-wlan-log-redirection
CVE-2024-33066: Qualcomm WLAN लॉग मेमोरी करप्शन
CVE-2024-33066 में Qualcomm WLAN Resource Manager कॉलर के चुने पथ पर लॉग भेजते समय मेमोरी करप्ट कर सकता है। अक्टूबर 2024 में सुधार जारी हुआ।
एक होटल रिसेप्शन की कल्पना करें जहाँ कोई भी फ़ोन करके कह सकता है: "अब से मेहमानों के रजिस्टर की प्रतियाँ इस पते पर भेजना।" रिसेप्शनिस्ट जो कुछ बोला जाए उसे एक छोटे कार्ड पर लिख लेता है, भले ही लिखावट कार्ड से बाहर निकलकर मेज़ पर आ जाए, और फिर प्रतियाँ वहीं भेज देता है जहाँ लिखा हो, मैनेजर की तिजोरी में भी। समाधान यह है कि केवल एक छोटा लेबल स्वीकार किया जाए जो रिकॉर्ड-रूम की किसी दराज़ का नाम हो।
इस पेज के मुख्य शब्द
WLAN Resource ManagerCVE-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. लॉग रीडायरेक्शन का अनुरोध आता है
WLAN Resource Manager अपने लॉग आउटपुट को कहीं और भेजने का अनुरोध स्वीकार करता है। CVSS वेक्टर (AV:N/PR:N/UI:N) इस ख़ामी को बिना विशेषाधिकार और बिना उपयोगकर्ता क्रिया के नेटवर्क से पहुँच योग्य मानता है।
2. कोई भी जगह और कोई भी नाम स्वीकार
Qualcomm के विवरण के अनुसार, रीडायरेक्शन किसी भी जगह और किसी भी फ़ाइल नाम से काम करता था: माँगे गए गंतव्य की न लंबाई जाँची जाती थी, न यह कि वह कहाँ ले जाता है।
3. बिना जाँचा इनपुट मेमोरी बिगाड़ता है
नीचे के मॉडल में, पथ के तय आकार वाले बफ़र से लंबा नाम उसे ओवरफ़्लो कर देता है (strcpy), और कोई भी पथ, कॉन्फ़िगरेशन फ़ाइलें भी, लिखने के लिए खोला जा सकता है। Qualcomm ने नहीं बताया कि उसके कोड में इनमें से कौन-सा मामला हुआ।
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;
}
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓CI में rm_set_log_destination को 64 अक्षरों वाले नाम, '../etc/passwd', '/tmp/x', '.hidden' और '/' वाले नाम के साथ बुलाएँ, और जाँचें कि हर बार कोई फ़ाइल बनाए बिना -EINVAL लौटे।
- ✓अनुरोध के फ़ील्ड को तय आकार वाले बफ़र में लिखने वाली किसी भी नई strcpy या sprintf कॉल पर CI विफल करें (जैसे semgrep या clang-tidy नियम से); strnlen या snprintf जैसी स्पष्ट सीमा अनिवार्य करें।
- ✓कॉल करने वाले द्वारा चुनी जा सकने वाली हर आउटपुट फ़ाइल को स्टार्ट-अप पर खोले गए डायरेक्टरी डिस्क्रिप्टर के सापेक्ष
openat()से हल करें और O_NOFOLLOW दें, ताकि कोई नाम उस डायरेक्टरी से बाहर न जा सके। - ✓IPQ/QCN चिपसेट पर बने राउटर और एक्सेस पॉइंट की सूची बनाएँ, पुष्टि करें कि उनके फ़र्मवेयर में Qualcomm का अक्टूबर 2024 का सुधार है, और प्रबंधन व डायग्नोस्टिक इंटरफ़ेस को प्रशासनिक नेटवर्क तक सीमित रखें।