Vulnerabilidad en kernel de Linux (CVE-2021-47350)
Gravedad CVSS v3.1:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
21/05/2024
Última modificación:
02/04/2025
Descripción
En el kernel de Linux, se resolvió la siguiente vulnerabilidad: powerpc/mm: corrige el bloqueo en el fallo de ejecución del kernel. El kernel de powerpc no está preparado para manejar fallos de ejecución del kernel. Especialmente, la función is_exec_fault() devolverá 'false' cuando el kernel tome un fallo de ejecución, porque la verificación se basa en la lectura de current->thread.regs->trap que contiene la trampa del usuario. Por ejemplo, al provocar una prueba LKDTM EXEC_USERSPACE, current->thread.regs->trap se establece en SYSCALL trap (0xc00), y set_access_flags_filter() no ve el error cometido por el kernel como un error de ejecución. La confirmación d7df2443cd5f ("powerpc/mm: corregir errores de segmentación falsos en radix con autonuma") lo dejó claro y lo manejó correctamente. Pero más tarde, la confirmación d3ca587404b3 ("powerpc/mm: corregir informes de fallas de ejecución del kernel") eliminó ese manejo, introduciendo una prueba basada en error_code. Y aquí está el problema, porque en el 603 todos los bits superiores de SRR1 se borran cuando el controlador de errores de instrucción TLB sale a ISI. Hasta la confirmación cbd7e6ca0210 ("powerpc/fault: Evite la verificación pesada de search_exception_tables()"), un fallo de ejecución del kernel en una dirección de espacio de usuario se detectaba indirectamente por la falta de entrada para esa dirección en las tablas de excepción. Pero después de esa confirmación, el kernel depende principalmente de KUAP o del manejo de mm del núcleo para detectar accesos de usuarios incorrectos. Aquí el acceso no es incorrecto, por lo que mm lo maneja. Es un fallo menor porque PAGE_EXEC no está configurada, set_access_flags_filter() debería configurar PAGE_EXEC y listo. Pero como is_exec_fault() devuelve false como se explicó al principio, set_access_flags_filter() sale sin configurar el indicador PAGE_EXEC, lo que conduce a un fallo de ejecución menor para siempre. Como el kernel no está preparado para manejar tales fallos de ejecución, lo que hay que hacer es activar bad_kernel_fault() para cualquier fallo de ejecución tomado por el kernel, como estaba antes de la confirmación d3ca587404b3.
Impacto
Puntuación base 3.x
5.50
Gravedad 3.x
MEDIA
Productos y versiones vulnerables
CPE | Desde | Hasta |
---|---|---|
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.14 (incluyendo) | 5.4.133 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (incluyendo) | 5.10.51 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (incluyendo) | 5.12.18 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.13 (incluyendo) | 5.13.3 (excluyendo) |
Para consultar la lista completa de nombres de CPE con productos y versiones, ver esta página
Referencias a soluciones, herramientas e información
- https://git.kernel.org/stable/c/500f81cec9f1bfa5210aa9dd5ba9a06e22f62a35
- https://git.kernel.org/stable/c/8a96ec5ebf96ad8e2ba7b1b34103a0be5140fc70
- https://git.kernel.org/stable/c/a82471a14aad90f79d1608d2bcbb019f0ffb53f0
- https://git.kernel.org/stable/c/cd5d5e602f502895e47e18cd46804d6d7014e65c
- https://git.kernel.org/stable/c/d2e52d4664097a6c1f591d869ec594bd7a0d4925
- https://git.kernel.org/stable/c/500f81cec9f1bfa5210aa9dd5ba9a06e22f62a35
- https://git.kernel.org/stable/c/8a96ec5ebf96ad8e2ba7b1b34103a0be5140fc70
- https://git.kernel.org/stable/c/a82471a14aad90f79d1608d2bcbb019f0ffb53f0
- https://git.kernel.org/stable/c/cd5d5e602f502895e47e18cd46804d6d7014e65c
- https://git.kernel.org/stable/c/d2e52d4664097a6c1f591d869ec594bd7a0d4925