CVE-2026-98368 in Linux
Resumen
por VulDB • 2026-10-06
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
esp: degradar los frags gestionados con zerocopy antes de mutar los frags del skb
En la ruta de salida fuera de lugar (donde esp->inplace == false), ESP reescribe el array de frags del skb: esp_output_head() añade un frag de trailer y esp_output_tail() sustituye los frags por una página de destino, ambos referenciados con get_page().
Cuando el skb lleva frags gestionados con zerocopy (SKBFL_MANAGED_FRAG_REFS), los frags de la carga útil son propiedad del ubuf y no deben ser referenciados o desreferenciados individualmente; sin embargo, ESP muta el array de frags sin degradar nunca el skb. Esto rompe la invariantes de los frags gestionados de dos maneras:
- esp_ssg_unref() recorre la lista dispersa (scatterlist) de origen y reduce una referencia a página por cada frag, incluyendo los frags de carga útil propiedad del ubuf, lo que hace que su contador de referencias caiga por debajo del sesgo GUP pin mientras las páginas siguen estando fijadas (pinned), es decir, un use-after-free de las páginas zerocopy;
- esp_output_tail() instala su página de destino como frag 0 con get_page(), pero deja SKBFL_MANAGED_FRAG_REFS establecido, por lo que skb_release_data() toma la rama skip_unref y nunca reduce esa referencia, provocando una fuga (leak) de la página x->xfrag a la tasa de paquetes.
Corrija esto de la misma manera que cualquier otro sitio que muta frags (__ip_append_data(), __ip6_append_data(), tcp_sendmsg_locked()) llamando a skb_zcopy_downgrade_managed() antes de que ESP toque el array de frags: esta función toma una referencia real en cada frag existente y borra SKBFL_MANAGED_FRAG_REFS, por lo que la desreferenciación por frag en esp_ssg_unref() y la liberación de frags en skb_release_data() están equilibradas correctamente, sin dejar atrás un array de frags con propiedad mixta.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.