Vulnerabilidad en kernel de Linux (CVE-2024-47706)
Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-416
Utilización después de liberación
Fecha de publicación:
21/10/2024
Última modificación:
08/11/2024
Descripción
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: bloque, bfq: corregir posible UAF para bfqq->bic con cadena de fusión 1) estado inicial, tres tareas: Proceso 1 Proceso 2 Proceso 3 (BIC1) (BIC2) (BIC3) | ? | ? | ? | | | | | | V | V | V | bfqq1 bfqq2 bfqq3 proceso ref: 1 1 1 2) bfqq1 fusionado con bfqq2: Proceso 1 Proceso 2 Proceso 3 (BIC1) (BIC2) (BIC3) | | | ? \--------------\| | | VV | bfqq1--------->bfqq2 bfqq3 proceso ref: 0 2 1 3) bfqq2 fusionado con bfqq3: Proceso 1 Proceso 2 Proceso 3 (BIC1) (BIC2) (BIC3) aquí -> ? | | \--------------\ \-------------\| VV bfqq1-------->bfqq2---------->bfqq3 ref. de proceso: 0 1 3 En este caso, la IO del Proceso 1 obtendrá primero bfqq2 de BIC1, y luego obtendrá bfqq3 a través de la cadena de fusión, y finalmente manejará la IO por bfqq3. Sin embargo, el código actual pensará que bfqq2 es propiedad de BIC1, como estado inicial, y establecerá bfqq2->bic en BIC1. bfq_insert_request -> por Proceso 1 bfqq = bfq_init_rq(rq) bfqq = bfq_get_bfqq_handle_split bfqq = bic_to_bfqq -> obtener bfqq2 de BIC1 bfqq->ref++ rq->elv.priv[0] = bic rq->elv.priv[1] = bfqq si (bfqq_process_refs(bfqq) == 1) bfqq->bic = bic -> grabar BIC1 en bfqq2 __bfq_insert_request new_bfqq = bfq_setup_cooperator -> obtener bfqq3 de bfqq2->new_bfqq bfqq_request_freed(bfqq) new_bfqq->ref++ rq->elv.priv[1] = new_bfqq -> manejar IO por bfqq3 Solucione el problema verificando que bfqq sea primero de la cadena de fusión. Y esto podría solucionar el siguiente problema informado por nuestro syzkaller (irreproducible): ===================================================================== ERROR: KASAN: slab-use-after-free en el bloque bfq_do_early_stable_merge/bfq-iosched.c:5692 [en línea] ERROR: KASAN: slab-use-after-free en el bloque bfq_do_or_sched_stable_merge/bfq-iosched.c:5805 [en línea] ERROR: KASAN: slab-use-after-free en el bloque bfq_get_queue+0x25b0/0x2610/bfq-iosched.c:5889 Escribir de tamaño 1 en la dirección ffff888123839eb8 por la tarea kworker/0:1H/18595 CPU: 0 PID: 18595 Comm: kworker/0:1H Contaminado: GL 6.6.0-07439-gba2303cacfda #6 Nombre del hardware: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014 Cola de trabajo: kblockd blk_mq_requeue_work Rastreo de llamadas: __dump_stack lib/dump_stack.c:88 [en línea] dump_stack_lvl+0x91/0xf0 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:364 [en línea] imprimir_informe+0x10d/0x610 mm/kasan/report.c:475 kasan_report+0x8e/0xc0 mm/kasan/report.c:588 bloque bfq_do_early_stable_merge/bfq-iosched.c:5692 [en línea] bloque bfq_do_or_sched_stable_merge/bfq-iosched.c:5805 [en línea] bloque bfq_get_queue+0x25b0/0x2610/bfq-iosched.c:5889 bloque bfq_get_bfqq_handle_split+0x169/0x5d0/bfq-iosched.c:6757 bloque bfq_init_rq/bfq-iosched.c:6876 [en línea] bloque bfq_insert_request/bfq-iosched.c:6254 [en línea] bloque bfq_insert_requests+0x1112/0x5cf0/bfq-iosched.c:6304 bloque blk_mq_insert_request+0x290/0x8d0/blk-mq.c:2593 bloque blk_mq_requeue_work+0x6bc/0xa70/blk-mq.c:1502 proceso_uno_trabajo kernel/workqueue.c:2627 [en línea] proceso_trabajos_programados+0x432/0x13f0 kernel/workqueue.c:2700 subproceso_trabajador+0x6f2/0x1160 kernel/workqueue.c:2781 subproceso_k+0x33c/0x440 kernel/kthread.c:388 ret_from_fork+0x4d/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1b/0x30 arch/x86/entry/entry_64.S:305 Asignado por la tarea 20776: kasan_save_stack+0x20/0x40 mm/kasan/common.c:45 kasan_set_track+0x25/0x30 mm/kasan/common.c:52 __kasan_slab_alloc+0x87/0x90 mm/kasan/common.c:328 kasan_slab_alloc include/linux/kasan.h:188 [en línea] slab_post_alloc_hook mm/slab.h:763 [en línea] slab_alloc_node mm/slub.c:3458 [en línea] kmem_cache_alloc_node+0x1a4/0x6f0 mm/slub.c:3503 ioc_create_icq block/blk-ioc.c:370 [en línea] ---truncado---
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.12 (incluyendo) | 5.10.227 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (incluyendo) | 5.15.168 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (incluyendo) | 6.1.113 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (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) |
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/18ad4df091dd5d067d2faa8fce1180b79f7041a7
- https://git.kernel.org/stable/c/6d130db286ad0ea392c96ebb2551acf0d7308048
- https://git.kernel.org/stable/c/7faed2896d78e48ec96229e73b30b0af6c00a9aa
- https://git.kernel.org/stable/c/880692ee233ba63808182705b3333403413b58f5
- https://git.kernel.org/stable/c/8aa9de02a4be2e7006e636816ce19b0d667ceaa3
- https://git.kernel.org/stable/c/a9bdd5b36887d2bacb8bc777fd18317c99fc2587
- https://git.kernel.org/stable/c/bc2140534b2aae752e4f7cb4489642dbb5ec4777
- https://git.kernel.org/stable/c/ddbdaad123254fb53e32480cb74a486a6868b1e0
- https://git.kernel.org/stable/c/e1277ae780cca4e69ef5468d4582dfd48f0b8320