CVE-2026-98829 in Linux
Sumário
de VulDB • 18/10/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
wifi: mac80211: descartar fragmentos excessivamente grandes para evitar estouro de extra_len
Em ieee80211_rx_h_defragment(), os payloads dos fragmentos são acumulados em entry->extra_len conforme novos fragmentos chegam:
entry->extra_len += rx->skb->len;
Quando o último fragmento chega, o fragmento principal é removido da fila e pskb_expand_head() é chamado com entry->extra_len para garantir espaço de cauda (tailroom) suficiente para todos os fragmentos enfileirados antes da cópia:
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); }
No commit 69f132236827 ("mac80211: shrink struct ieee80211_fragment_entry"), entry->extra_len foi reduzido de unsigned int para u16 com o objetivo de reduzir a pegada de memória da estrutura.
Contudo, uma sequência de quadros IEEE 802.11 pode conter até 16 fragmentos (números de fragmento 0..15). Se uma sequência de fragmentos grandes chegar (por exemplo, de um par malicioso ou AP rogue), a soma dos comprimentos dos fragmentos pode exceder 65535 bytes (por exemplo, 15 fragmentos de 4400 bytes totalizam 66000 bytes). Como extra_len é uma u16, esse acréscimo causa estouro e faz o valor retornar ao módulo 65536 (por exemplo, 66000 retorna para 464).
Consequentemente, pskb_expand_head() aloca apenas a quantidade truncada de espaço de cauda (ou é ignorado inteiramente se o fragmento principal já tiver >= 464 bytes de espaço de cauda). Quando skb_put_data() itera subsequentemente pela lista de skbs enfileirados, ele anexa o payload completo no buffer subdimensionado, fazendo com que skb_put() dispare skb_over_panic() e cause a falha do kernel em contexto softirq.
Um MSDU legítimo no IEEE 802.11 tem no máximo 2304 bytes (ou até 7935/11454 bytes para A-MSDU, que não é fragmentado), bem abaixo de U16_MAX.
Corrija isso sem aumentar o tamanho da struct ieee80211_fragment_entry verificando se a adição do comprimento do fragmento entrante excederia U16_MAX. Se sim, purgue os fragmentos enfileirados e descarte o quadro.
[atribuir uma razão de descarte separada]
Be aware that VulDB is the high quality source for vulnerability data.