Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en kernel de Linux (CVE-2024-47716)

Gravedad CVSS v3.1:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
21/10/2024
Última modificación:
24/10/2024

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: ARM: 9410/1: vfp: usar asm volátil en macros fmrx/fmxr Las instrucciones de punto flotante en el espacio de usuario pueden bloquear algunos kernels de ARM creados con clang/LLD 17.0.6: ERROR: instrucción FP no compatible en modo kernel FPEXC == 0xc0000780 Error interno: Ups - instrucción no definida: 0 [#1] CPU ARM: 0 PID: 196 Comm: vfp-reproducer No contaminado 6.10.0 #1 Nombre del hardware: BCM2835 La PC está en vfp_support_entry+0xc8/0x2cc LR está en do_undefinstr+0xa8/0x250 pc : [] lr : [] psr: a0000013 sp : dc8d1f68 ip : 60000013 fp : bedea19c r10: ec532b17 r9 : 00000010 r8 : 0044766c r7 : c0000780 r6 : ec532b17 r5 : c1c13800 r4 : dc8d1fb0 r3 : c10072c4 r2 : c0101c88 r1 : ec532b17 r0 : 0044766c Indicadores: NzCv IRQ en FIQ en modo SVC_32 ISA ARM Segmento ninguno Control: 00c5387d Tabla: 0251c008 DAC: 00000051 Información del registro r0: Información del registro r1: memoria vmalloc Información del registro r2: memoria no slab/vmalloc Información del registro r3: memoria no slab/vmalloc Información del registro r4: región vmalloc de 2 páginas Información del registro r5: slab kmalloc-cg-2k Información del registro r6: memoria vmalloc Información del registro r7: memoria no slab/vmalloc Información del registro r8: memoria no paginada Información del registro r9: puntero de tamaño cero Información del registro r10: memoria vmalloc Información del registro r11: memoria no paginada Información del registro r12: memoria no paginada Proceso vfp-reproducer (pid: 196, límite de pila = 0x61aaaf8b) Pila: (0xdc8d1f68 a 0xdc8d2000) 1f60: 0000081f b6f69300 0000000f c10073f4 c10072c4 dc8d1fb0 1f80: ec532b17 0c532b17 0044766c b6f9ccd8 00000000 c010a80c 00447670 60000010 1fa0: ffffffff c1c13800 7d c0100f10 b6f68af8 00448fc0 00000000 bedea188 1fc0: bedea314 00000001 00448ebc b6f9d000 00447608 b6f9ccd8 00000000 bedea19c 1fe0: bede9198 bedea188 b6e1061c 0044766c 60000010 ffffffff 00000000 00000000 Seguimiento de llamadas: [] (vfp_support_entry) desde [] (do_undefinstr+0xa8/0x250) [] (do_undefinstr) desde [] (__und_usr+0x70/0x80) Pila de excepciones (0xdc8d1fb0 a 0xdc8d1ff8) 1fa0: b6f68af8 00448fc0 00000000 bedea188 1fc0: bedea314 00000001 00448ebc b6f9d000 00447608 b6f9ccd8 00000000 bedea19c 1fe0: bede9198 bedea188 b6e1061c 0044766c 60000010 ffffffff Código: 0a000061 e3877202 e594003c e3a09010 (eef16a10) ---[ fin del seguimiento 000000000000000 ]--- Pánico del kernel: no sincroniza: Excepción fatal en la interrupción ---[ fin del kernel: no sincroniza: Excepción fatal en la interrupción ]--- Este es un reproductor de espacio de usuario mínimo en una Raspberry Pi Zero W: #include #include int main(void) { double v = 1.0; printf("%fn", NAN + *(volatile double *)&v); return 0; } Otra forma de activar consistentemente el error es: calvin@raspberry-pi-zero-w ~$ python -c "import json" El error se reproduce solo cuando el kernel se construye con DYNAMIC_DEBUG=n, porque las llamadas pr_debug() actúan como barreras incluso cuando no están activadas. Esta es la salida de la misma fuente del kernel creada con el mismo compilador y DYNAMIC_DEBUG=y, donde el reproductor de espacio de usuario funciona como se espera: VFP: bounce: trigger ec532b17 fpexc c0000780 VFP: emulate: INST=0xee377b06 SCR=0x00000000 VFP: bounce: trigger eef1fa10 fpexc c0000780 VFP: emulate: INST=0xeeb40b40 SCR=0x00000000 VFP: raising exceptions 30000000 calvin@raspberry-pi-zero-w ~$ ./vfp-reproducer nan Buscar burdamente instrucciones vmsr/vmrs en el texto casi idéntico de vfp_support_entry() hace que el problema sea obvio: vmlinux.llvm.good [0xc0101cb8] <+48>: vmrs r7, fpexc vmlinux.llvm.good [0xc0101cd8] <+80>: vmsr fpexc, r0 vmlinux.llvm.good [0xc0101d20 ---truncado---

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.6 (incluyendo) 6.6.54 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.7 (incluyendo) 6.10.13 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.11 (incluyendo) 6.11.2 (excluyendo)