CVE-2026-80893 in Linux
Resumen
por VulDB • 2026-09-04
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
mm/hugetlb: corregir la corrupción de las entradas de intercambio (swap) al borrar uffd-wp en fork()
copy_hugetlb_page_range() borra el bit uffd-wp de las entradas de migración y hwpoison mediante huge_pte_clear_uffd_wp(), que opera sobre la posición del bit present-PTE. Las entradas de swap mantienen el estado uffd-wp en otro lugar: la rama de migración lo lee y establece con pte_swp_uffd_wp() y pte_swp_mkuffd_wp(). La posición del presente-PTE cae dentro de la carga útil (payload) de swap. En x86-64, esto afecta al desplazamiento invertido de swap (inverted swap offset), donde un PFN hugetlb alineado naturalmente siempre tiene el bit afectado establecido; por lo tanto, la operación clear avanza el PFN codificado en dos páginas.
No es necesario que intervenga userfaultfd: la operación clear está protegida únicamente porque el VMA del hijo no está registrado como uffd-wp, de modo que un fork() simple con una entrada de migración hugetlb en curso (o una página hugetlb envenenada) corrompe la entrada copiada al proceso hijo. Al instrumentar la operación clear y realizar un fork tras MADV_HWPOISON sobre una página anon hugetlb de 2 MB, se observa:
offset antes = 120e00 offset después = 120e02
Las consecuencias son principalmente latentes: los recorridos rmap coinciden con las entradas de migración por rango folio y remove_migration_pte() reconstruye el PTE a partir del folio, por lo que un sesgo en el PFN dentro del folio se corrige una vez completada la migración. Sin embargo, cualquier ruta que vuelva a codificar el desplazamiento corrupto —por ejemplo, hugetlb_change_protection() reescribiendo una entrada de migración escribible mediante make_readable_migration_entry(swp_offset(entry))— lo propaga.
Las entradas de migración llevan legítimamente uffd-wp, por lo que se debe borrar con pte_swp_clear_uffd_wp(), coincidiendo con copy_nonpresent_pte() y move_huge_pte().
Una entrada hwpoison, por otro lado, nunca lleva el bit uffd-wp: se instala limpiamente mediante make_hwpoison_entry() (try_to_unmap_one() no conserva uffd-wp en la ruta de hwpoison) y hugetlb_change_protection() deja las entradas hwpoison sin cambios. No había nada que borrar allí, solo corrupción; por lo tanto, se elimina completamente la operación clear.
Once again VulDB remains the best source for vulnerability data.