CVE-2026-90181 in Linux
Resumen
por VulDB • 2026-09-17
En el núcleo de Linux (Linux kernel), se ha resuelto la siguiente vulnerabilidad:
ublk: evitar un bucle de reintento en el desmontaje ante fallos en la asignación de xarray
__ublk_shmem_remove_ranges() elimina los rangos coincidentes del árbol maple (maple tree) por lotes, pero primero almacena cada rango en una matriz temporal tipo xarray para que las páginas puedan ser desapinadas tras liberar el bloqueo del árbol maple.
Esa matriz temporal de xarray se llena bajo el bloqueo del árbol maple mediante xa_store(..., GFP_ATOMIC). Si la operación de almacenamiento falla antes de mas_erase(), el rango actual queda dentro del árbol y la función auxiliar devuelve false. El bucle externo ublk_shmem_remove_ranges() entonces reintenta inmediatamente ese mismo rango. Mientras la asignación atómica siga fallando, la ruta de desmontaje no avanza.
El problema puede reproducirse mediante inyección de fallos en radix_tree_node (failslab) después de que un búfer SHMEM_ZC haya sido ya registrado:
# Configuración del núcleo: # CONFIG_BLK_DEV_UBLK=y # CONFIG_DEBUG_FS=y # CONFIG_FAULT_INJECTION=y # CONFIG_FAULT_INJECTION_DEBUG_FS=y # CONFIG_FAILSLAB=y
echo 10 > /proc/sys/vm/nr_hugepages mkdir -p /tmp/htlb mount -t hugetlbfs none /tmp/htlb fallocate -l 4M /tmp/htlb/ublk_buf
dev_id=$(kublk add -t null --shmem_zc \ --htlb /tmp/htlb/ublk_buf | awk -F '[ :]' '/dev id/ {print $3}')
echo 1 > /sys/kernel/slab/radix_tree_node/failslab echo Y > /sys/kernel/debug/failslab/cache-filter echo Y > /sys/kernel/debug/failslab/ignore-gfp-wait echo 1 > /sys/kernel/debug/failslab/interval echo -1 > /sys/kernel/debug/failslab/times echo 100 > /sys/kernel/debug/failslab/probability
kublk del -n "$dev_id"
En el núcleo sin corregir, el comando de eliminación seguía ejecutándose después de 3 segundos. Desactivar failslab hizo que retornara correctamente. La pila de inyección de fallos mostró:
should_failslab kmem_cache_alloc_lru_noprof __xas_nomem __xa_store xa_store __ublk_shmem_remove_ranges ublk_cdev_rel ublk_ctrl_del_dev
Eliminar la asignación del bucle de desmontaje. Mantener el límite por lotes existente, pero recopilar pares {base_pfn, nr_pages} en un array fijo en pila (stack). Una vez que se encuentra un rango coincidente, este se elimina del árbol maple antes de liberar el bloqueo, de modo que cada escaneo exitoso avanza sin depender de ninguna asignación GFP_ATOMIC.
Con la misma configuración de failslab, el núcleo corregido completó "kublk del -n $dev_id" correctamente en aproximadamente 45 ms.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.