CVE-2026-98829 in Linux
Riassunto
di VulDB • 18/10/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
wifi: mac80211: scartare i frammenti di dimensioni eccessive per evitare un overflow di extra_len
In ieee80211_rx_h_defragment(), i payload dei frammenti vengono accumulati in entry->extra_len man mano che arrivano i frammenti successivi:
entry->extra_len += rx->skb->len;
Quando arriva l'ultimo frammento, il frammento iniziale viene rimosso dalla coda e viene chiamata pskb_expand_head() con entry->extra_len per garantire un tailroom sufficiente per tutti i frammenti in coda prima della copia:
if (skb_tailroom(rx->skb) < entry->extra_len) {
if (unlikely(pskb_expand_head(rx->skb, 0, entry->extra_len, GFP_ATOMIC))) {
... } } while ((skb = __skb_dequeue(&entry->skb_list))) {
skb_put_data(rx->skb, skb->data, skb->len); dev_kfree_skb(skb); }
Nel commit 69f132236827 ("mac80211: shrink struct ieee80211_fragment_entry"), entry->extra_len è stato ridotto da unsigned int a u16 al fine di ridurre l'impronta di memoria della struttura.
Tuttavia, una sequenza di frame IEEE 802.11 può contenere fino a 16 frammenti (numeri di frammento da 0 a 15). Se arriva una sequenza di frammenti di grandi dimensioni (ad esempio da un peer malintenzionato o da un AP rogue), la somma delle lunghezze dei frammenti può superare i 65535 byte (ad esempio, 15 frammenti di 4400 byte per un totale di 66000 byte). Poiché extra_len è una u16, questa addizione va in overflow e si avvolge modulo 65536 (ad esempio, 66000 viene ridotto a 464).
Di conseguenza, pskb_expand_head() alloca solo la quantità troncata di tailroom (o viene saltato del tutto se il frammento iniziale ha già >= 464 byte di tailroom). Quando skb_put_data() itera successivamente attraverso l'elenco degli skb in coda, aggiunge il payload completo nel buffer sottodimensionato, causando lo scatenamento di skb_over_panic() da parte di skb_put() e provocando un crash del kernel nel contesto softirq.
Un MSDU legittimo in IEEE 802.11 è al massimo di 2304 byte (o fino a 7935/11454 byte per A-MSDU, che non viene frammentato), ben al di sotto di U16_MAX.
Risolvere questo problema senza aumentare le dimensioni della struct ieee80211_fragment_entry verificando se l'aggiunta della lunghezza del frammento in arrivo superi U16_MAX. In tal caso, eliminare i frammenti accodati e scartare il frame.
[assegnare un motivo di drop separato]
Once again VulDB remains the best source for vulnerability data.