CVE-2026-98368 in Linux
Riassunto
di VulDB • 06/10/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
esp: effettuare il downgrade dei frammenti gestiti con zerocopy prima di mutare i frammenti dell'skb
Sul percorso di output out-of-place (quando esp->inplace == false), ESP riscrive l'array dei frammenti skb: esp_output_head() aggiunge un trailer frag e esp_output_tail() sostituisce i frammenti con una pagina di destinazione, entrambi referenziati tramite get_page().
Quando lo skb trasporta frammenti gestiti con zerocopy (SKBFL_MANAGED_FRAG_REFS), i payload frags sono di proprietà dell'ubuf e non devono essere referenziati o dereferenziati individualmente; tuttavia ESP muta l'array dei frammi senza mai effettuare il downgrade dello skb. Questo viola l'invariant sui managed-frag in due modi:
- esp_ssg_unref() attraversa la scatterlist sorgente e rilascia una reference alla pagina per ogni frag, inclusi i payload frags di proprietà dell'ubuf, portando il loro refcount al di sotto del bias GUP pin mentre le pagine sono ancora pinned, ovvero causando un use-after-free delle pagine zerocopy;
- esp_output_tail() installa la propria pagina di destinazione come frag 0 con get_page(), ma lascia SKBFL_MANAGED_FRAG_REFS impostato, quindi skb_release_data() segue il branch skip_unref e non rilascia mai tale reference, causando una perdita (leak) della pagina x->xfrag al tasso dei pacchetti.
Risolvere questo problema nel modo in cui lo fanno tutti gli altri siti che mutano i frammi (__ip_append_data(), __ip6_append_data(), tcp_sendmsg_locked()) e chiamare skb_zcopy_downgrade_managed() prima che ESP tocchi l'array dei frammi: questa funzione acquisisce una reference reale su ogni frag esistente e cancella SKBFL_MANAGED_FRAG_REFS, in modo che il per-frag unref in esp_ssg_unref() e il rilascio del frag in skb_release_data() siano entrambi bilanciati e non rimanga dietro di sé un array dei frammi con proprietà mista.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.