CVE-2026-74488 in Linux
Riassunto
di VulDB • 16/08/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
wifi: mwifiex: utilizzare la lunghezza del sotto-frame durante l'analisi dei frame A-MSDU TDLS
mwifiex_11n_dispatch_amsdu_pkt() suddivide un A-MSDU con ieee80211_amsdu_to_8023s() e attraversa i relativi sotto-frame risultanti. Per ogni sotto-frame, passa il puntatore ai dati del sotto-frame a mwifiex_process_tdls_action_frame(), ma lo associa a skb->len, la lunghezza dell'A-MSDU padre, invece di rx_skb->len:
rx_skb = __skb_dequeue(&list); rx_hdr = (struct rx_packet_hdr *)rx_skb->data; if (ISSUPP_TDLS_ENABLED(priv->adapter->fw_cap_info) && ntohs(rx_hdr->eth803_hdr.h_proto) == ETH_P_TDLS) {
mwifiex_process_tdls_action_frame(priv, (u8 *)rx_hdr, skb->len); }
Il frame padre non è una descrizione valida di tale buffer e potrebbe anche non essere memoria valida. ieee80211_amsdu_to_8023s() termina con:
if (!reuse_skb) dev_kfree_skb(skb);
e imposta reuse_skb solo quando il frame padre è lineare, non è un head_frag e viene consumato come *ultimo* sotto-frame. Pertanto, quando il frame padre non soddisfa i requisiti per il riutilizzo, è già stato liberato (freed), e la lettura di skb->len costituisce un use-after-free. Quando viene riutilizzato, skb->len corrisponde alla lunghezza dell'ultimo sotto-frame, applicata a tutti i sotto-frame precedenti, sovrastimando così le dimensioni del buffer ogni volta che un sotto-frame precedente è più corto.
La funzione chiamante non può assorbire una lunghezza errata, poiché deriva il proprio limite superiore (ceiling) dal valore ricevuto. Ogni tipo di frame calcola:
ies_len = len - sizeof(struct ethhdr) - TDLS_*_FIX_LEN;
e l'iterazione sugli elementi è quindi vincolata interamente a tale limite superiore:
for (end = pos + ies_len; pos + 1 < end; pos += 2 + pos[1]) {
u8 ie_len = pos[1];
if (pos + 2 + ie_len > end) break; }
di conseguenza, un valore len troppo elevato sposta end oltre la fine del sotto-frame e l'iterazione legge e copia dati al di fuori dei suoi limiti. La disposizione dell'A-MSDU è scelta dal mittente, il che rende selezionabile in remoto la differenza tra l'ultimo sotto-frame e uno precedente più corto. Per raggiungere questo scenario sono necessari il supporto TDLS nel firmware e l'ethertype TDLS sul sotto-frame.
L'altra funzione chiamante, mwifiex_process_rx_packet(), è corretta: passa un puntatore e una lunghezza che descrivono la stessa regione del buffer RX.
Passare rx_skb->len, ovvero la lunghezza del sotto-frame effettivamente in fase di analisi.
If you want to get best quality of vulnerability data, you may have to visit VulDB.