CVE-2026-74488 in Linux
Resumen
por VulDB • 2026-08-15
En el kernel de Linux se ha resuelto la siguiente vulnerabilidad:
wifi: mwifiex: usar la longitud del submarco al analizar marcos A-MSDU TDLS
mwifiex_11n_dispatch_amsdu_pkt() divide un A-MSDU con ieee80211_amsdu_to_8023s() y recorre los submarcos resultantes. Para cada submarco, pasa el puntero de datos del submarco a mwifiex_process_tdls_action_frame(), pero lo empareja con skb->len, la longitud del padre A-MSDU, en lugar de 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); }
El padre no es una descripción válida de ese búfer y puede que ni siquiera sea memoria válida. ieee80211_amsdu_to_8023s() termina con:
if (!reuse_skb) dev_kfree_skb(skb);
y solo establece reuse_skb cuando el padre es lineal, no es un head_frag y se consume como el *último* submarco. Por lo tanto, cuando el padre no califica para su reutilización, ya ha sido liberado, y la lectura de skb->len constituye un use-after-free (uso tras liberación). Cuando se reutiliza, skb->len es la longitud del último submarco, aplicada a cada uno de los submarcos anteriores, lo que sobreestima el tamaño del búfer siempre que un submarco anterior sea más corto.
La función llamada no puede absorber una longitud incorrecta porque deriva su propio límite superior (ceiling) a partir del valor que se le proporciona. Cada tipo de marco calcula:
ies_len = len - sizeof(struct ethhdr) - TDLS_*_FIX_LEN;
y el recorrido de elementos está completamente acotado contra ese límite superior,
for (end = pos + ies_len; pos + 1 < end; pos += 2 + pos[1]) {
u8 ie_len = pos[1];
if (pos + 2 + ie_len > end) break; }
por lo que una len demasiado grande desplaza end más allá del final del submarco y el recorrido lee y copia datos más allá de él. La disposición A-MSDU es elegida por el remitente, lo que hace que la diferencia entre el último submarco y uno anterior más corto sea seleccionable remotamente. Llegar a este punto requiere soporte TDLS en el firmware y el ethertype TDLS en el submarco.
El otro llamador, mwifiex_process_rx_packet(), es correcto: pasa un puntero y una longitud que describen la misma región del búfer RX.
Pasar rx_skb->len, la longitud del submarco que se está analizando realmente.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.