Vulnerabilidad en kernel de Linux (CVE-2024-26676)
Gravedad CVSS v3.1:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
02/04/2024
Última modificación:
29/04/2025
Descripción
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: af_unix: Llame a kfree_skb() para unix_(sk)->oob_skb muerto en GC. syzbot informó una advertencia [0] en __unix_gc() con una reproducción, que crea un par de sockets y se envía el fd de un socket a sí mismo utilizando el par. socketpair(AF_UNIX, SOCK_STREAM, 0, [3, 4]) = 0 sendmsg(4, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="\360", iov_len=1}], msg_iovlen=1, msg_control=[{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, cmsg_data=[3]}], msg_controllen=24, msg_flags=0}, MSG_OOB|MSG_PROBE|MSG_DONTWAIT|MSG_ZEROCOPY) = 1 Esto forma una referencia autocíclica ese GC finalmente debería desenredarse, pero no lo hace debido a la falta de manejo de MSG_OOB, lo que resulta en una pérdida de memoria. Recientemente, el commit 11498715f266 ("af_unix: Eliminar el código io_uring para GC.") eliminó el código inactivo de io_uring en GC y reveló el problema. El código se ejecutó en la etapa final de GC y movió incondicionalmente todos los candidatos de GC de gc_candidates a gc_inflight_list. Eso ocultó el problema informado haciendo siempre que lo siguiente WARN_ON_ONCE(!list_empty(&gc_candidates)) fuera falso. El problema ha estado ahí desde que el commit 2aab4b969002 ("af_unix: corrige fugas de struct pid en soporte OOB") agregó soporte completo de scm para MSG_OOB mientras solucionaba otro error. Para solucionar este problema, debemos llamar a kfree_skb() para unix_sk(sk)->oob_skb si el socket todavía existe en gc_candidates después de purgar el skb recopilado. Luego, necesitamos establecer NULL en oob_skb antes de llamar a kfree_skb() porque llama al último fput() y activa unix_release_sock(), donde llamamos al duplicado kfree_skb(u->oob_skb) si no es NULL. Tenga en cuenta que el socket filtrado seguía vinculado a una lista global, por lo que kmemleak tampoco pudo detectarlo. Necesitamos verificar /proc/net/protocol para notar el socket no liberado. [0]: ADVERTENCIA: CPU: 0 PID: 2863 en net/unix/garbage.c:345 __unix_gc+0xc74/0xe80 net/unix/garbage.c:345 Módulos vinculados en: CPU: 0 PID: 2863 Comm: kworker/ u4:11 No contaminado 6.8.0-rc1-syzkaller-00583-g1701940b1a02 #0 Nombre del hardware: Google Google Compute Engine/Google Compute Engine, BIOS Google 25/01/2024 Cola de trabajo: events_unbound __unix_gc RIP: 0010:__unix_gc+0xc74/0xe80 net/unix/garbage.c:345 Código: 8b 5c 24 50 e9 86 f8 ff ff e8 f8 e4 22 f8 31 d2 48 c7 c6 30 6a 69 89 4c 89 ef e8 97 ef ff ff e9 80 f9 ff ff e8 dd e4 22 f8 90 <0f> 0b 90 e9 7b fd ff ff 48 89 df e8 5c e7 7c f8 e9 d3 f8 ff ff e8 RSP: 0018:ffffc9000b03fba0 EFLAGS: 00010293 RAX: 0000000000000000 RBX: ffff c9000b03fc10 RCX: ffffffff816c493e RDX: ffff88802c02d940 RSI: ffffffff896982f3 RDI: ffffc9000b03fb30 RBP: ffffc9000b03fce0 R08: 0000000000000001 R09: fffff52001607f66 R10: 00000000000000003 R11: 00000000000000002 R12: dffffc 0000000000 R13: ffffc9000b03fc10 R14: ffffc9000b03fc10 R15: 0000000000000001 FS: 0000000000000000(0000) GS:ffff8880b9400000(0000) knlGS:000 0000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00005559c8677a60 CR3: 000000000d57a000 CR4: 00000000003506f0 DR0: 0000000000000000 DR1: 00000000 00000000 DR2: 0000000000000000 DR3: 00000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Seguimiento de llamadas: Process_one_work+0x889/0x15e0 kernel/workqueue.c :2633 Process_scheduled_works kernel/workqueue.c:2706 [en línea] work_thread+0x8b9/0x12a0 kernel/workqueue.c:2787 kthread+0x2c6/0x3b0 kernel/kthread.c:388 ret_from_fork+0x45/0x80 arch/x86/kernel/process. c:147 ret_from_fork_asm+0x1b/0x30 arch/x86/entry/entry_64.S:242
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:*:*:*:*:*:*:*:* | 5.15.103 (incluyendo) | 5.15.149 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.1.20 (incluyendo) | 6.1.78 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.3 (incluyendo) | 6.6.17 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (incluyendo) | 6.7.5 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:6.8:rc1:*:*:*:*:*:* | ||
cpe:2.3:o:linux:linux_kernel:6.8:rc2:*:*:*:*:*:* | ||
cpe:2.3:o:linux:linux_kernel:6.8:rc3:*:*:*:*:*:* |
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/1279f9d9dec2d7462823a18c29ad61359e0a007d
- https://git.kernel.org/stable/c/4fe505c63aa3273135a57597fda761e9aecc7668
- https://git.kernel.org/stable/c/82ae47c5c3a6b27fdc0f9e83c1499cb439c56140
- https://git.kernel.org/stable/c/b74aa9ce13d02b7fd37c5325b99854f91b9b4276
- https://git.kernel.org/stable/c/e0e09186d8821ad59806115d347ea32efa43ca4b
- https://git.kernel.org/stable/c/1279f9d9dec2d7462823a18c29ad61359e0a007d
- https://git.kernel.org/stable/c/4fe505c63aa3273135a57597fda761e9aecc7668
- https://git.kernel.org/stable/c/82ae47c5c3a6b27fdc0f9e83c1499cb439c56140
- https://git.kernel.org/stable/c/b74aa9ce13d02b7fd37c5325b99854f91b9b4276
- https://git.kernel.org/stable/c/e0e09186d8821ad59806115d347ea32efa43ca4b