Vulnerabilidad en kernel de Linux (CVE-2024-57937)
Fecha de publicación:
21/01/2025
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: mm: restablecer la capacidad de mapear asignaciones memfd selladas a escritura como de solo lectura Serie de parches "mm: restablecer la capacidad de mapear asignaciones memfd selladas a escritura como de solo lectura". En el commit 158978945f31 ("mm: realizar la comprobación mapping_map_writable() después de call_mmap()") (y cambios anteriores en la misma serie) se hizo posible mmap() F_SEAL_WRITE asignaciones memfd selladas como de solo lectura. El commit 5de195060b2e ("mm: resolver el comportamiento defectuoso de la ruta de error mmap_region()") deshizo involuntariamente esta lógica al mover la comprobación mapping_map_writable() antes de que se invoque el gancho shmem_mmap(), lo que hizo que este cambio retrocediera. Esta serie reelabora la forma en que permitimos que las asignaciones selladas de escritura se asignen a solo lectura y no permitimos que mprotect() deshaga el sello de escritura, solucionando esta regresión. También agregamos una prueba de regresión para asegurarnos de que no retrocedamos accidentalmente esto en el futuro. Gracias a Julian Orth por informar esta regresión. Este parche (de 2): En el commit 158978945f31 ("mm: realizar la comprobación mapping_map_writable() después de call_mmap()") (y cambios anteriores en la misma serie) se hizo posible mmap() asignaciones de memfd selladas de F_SEAL_WRITE a solo lectura. Esto anteriormente se deshabilitaba innecesariamente, a pesar de que la documentación de la página del manual indicaba que lo estaría, lo que limitaba la utilidad de la lógica de F_SEAL_WRITE. Hemos corregido esto adaptando la lógica que existía para el sello F_SEAL_FUTURE_WRITE (uno que no permite escrituras futuras en el memfd) para que también se use para F_SEAL_WRITE. En segundo plano, el sello F_SEAL_FUTURE_WRITE borra VM_MAYWRITE para una asignación de solo lectura para no permitir que mprotect() anule el sello, una operación realizada por seal_check_write(), invocada desde shmem_mmap(), el gancho f_op->mmap() utilizado por las asignaciones de shmem. Al extender esto a F_SEAL_WRITE y, críticamente, verificar mapping_map_writable() para determinar si podemos asignar el memfd DESPUÉS de invocar shmem_mmap(), la lógica deseada se vuelve posible. Esto se debe a que mapping_map_writable() verifica explícitamente VM_MAYWRITE, que habremos borrado. El commit 5de195060b2e ("mm: resolver el comportamiento de la ruta de error mmap_region() defectuoso") deshizo esta lógica sin querer al mover la comprobación mapping_map_writable() antes de que se invoque el gancho shmem_mmap(), lo que hace que este cambio se repita. Restablecemos esta funcionalidad al mover la comprobación de shmem_mmap() y, en su lugar, realizarla en do_mmap() en el punto en el que se están determinando los indicadores VMA, que parece ser, en cualquier caso, un lugar más apropiado para realizar esta determinación. Para lograr esto, rediseñamos la lógica del sello memfd para permitirnos acceder a esta información utilizando la lógica existente y eliminar la limpieza de VM_MAYWRITE de seal_check_write() que estamos realizando en do_mmap() en su lugar.
Gravedad: Pendiente de análisis
Última modificación:
22/01/2025