Vulnerabilidad en kernel de Linux (CVE-2025-38236)
Gravedad CVSS v3.1:
ALTA
Tipo:
CWE-416
Utilización después de liberación
Fecha de publicación:
08/07/2025
Última modificación:
18/12/2025
Descripción
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: af_unix: No se dejan skbs OOB consumidos consecutivos. Jann Horn reportó un error de use-after-free en unix_stream_read_generic(). Las siguientes secuencias reproducen el problema: $ python3 from socket import * s1, s2 = socketpair(AF_UNIX, SOCK_STREAM) s1.send(b'x', MSG_OOB) s2.recv(1, MSG_OOB) # dejar un skb OOB consumido s1.send(b'y', MSG_OOB) s2.recv(1, MSG_OOB) # dejar un skb OOB consumido s1.send(b'z', MSG_OOB) s2.recv(1) # recibir 'z' ilegalmente s2.recv(1, MSG_OOB) # acceder a 'z' skb (use-after-free) Aunque un usuario lea datos OOB, el skb que contiene los datos permanece en la cola de recepción para marcar el límite OOB y romper la siguiente recepción(). Tras el último envío () en el escenario anterior, la cola de recepción de sk2 tiene 2 skbs OOB consumidos principales y 1 skb OOB real. Entonces, ocurre lo siguiente durante la siguiente recepción () sin MSG_OOB: 1. unix_stream_read_generic() inspecciona el primer skb OOB consumido. 2. manage_oob() devuelve el siguiente skb OOB consumido. 3. unix_stream_read_generic() recupera el siguiente skb OOB aún no consumido. 4. unix_stream_read_generic() lee y libera el skb OOB, y la última recepción (MSG_OOB) activa KASAN splat. El punto 3 anterior ocurre debido al código SO_PEEK_OFF, que no espera que unix_skb_len(skb) sea 0, pero esto es cierto para dichos skbs OOB consumidos. while (skip >= unix_skb_len(skb)) { skip -= unix_skb_len(skb); skb = skb_peek_next(skb, &sk->sk_receive_queue); ... } Además de este use-after-free, existe otro problema: ioctl(SIOCATMARK) no funciona correctamente con skb OOB consumidos consecutivos. Por lo tanto, no se obtiene nada bueno de tal situación. En lugar de complicar la gestión de manage_oob(), ioctl() y la siguiente corrección de ECONNRESET mediante la introducción de un bucle para skb OOB consumidos consecutivos, no dejemos que dichos OOB consecutivos se agoten innecesariamente. Ahora, al recibir un skb OOB en unix_stream_recv_urg(), si su skb anterior es un skb OOB consumido, se libera. [0]: ERROR: KASAN: slab-use-after-free en unix_stream_read_actor (net/unix/af_unix.c:3027) Lectura de tamaño 4 en la dirección ffff888106ef2904 por la tarea python3/315 CPU: 2 UID: 0 PID: 315 Comm: python3 No contaminado 6.16.0-rc1-00407-gec315832f6f9 #8 PREEMPT(voluntario) Nombre del hardware: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-4.fc42 01/04/2014 Rastreo de llamadas: dump_stack_lvl (lib/dump_stack.c:122) print_report (mm/kasan/report.c:409 mm/kasan/report.c:521) kasan_report (mm/kasan/report.c:636) unix_stream_read_actor (net/unix/af_unix.c:3027) unix_stream_read_generic (net/unix/af_unix.c:2708 net/unix/af_unix.c:2847) unix_stream_recvmsg (net/unix/af_unix.c:3048) sock_recvmsg (net/socket.c:1063 (discriminator 20) net/socket.c:1085 (discriminator 20)) __sys_recvfrom (net/socket.c:2278) __x64_sys_recvfrom (net/socket.c:2291 (discriminator 1) net/socket.c:2287 (discriminator 1) net/socket.c:2287 (discriminator 1)) do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1)) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) RIP: 0033:0x7f8911fcea06 Code: 5d e8 41 8b 93 08 03 00 00 59 5e 48 83 f8 fc 75 19 83 e2 39 83 fa 08 75 11 e8 26 ff ff ff 66 0f 1f 44 00 00 48 8b 45 10 0f 05 <48> 8b 5d f8 c9 c3 0f 1f 40 00 f3 0f 1e fa 55 48 89 e5 48 83 ec 08 RSP: 002b:00007fffdb0dccb0 EFLAGS: 00000202 ORIG_RAX: 000000000000002d RAX: ffffffffffffffda RBX: 00007fffdb0dcdc8 RCX: 00007f8911fcea06 RDX: 0000000000000001 RSI: 00007f8911a5e060 RDI: 0000000000000006 RBP: 00007fffdb0dccd0 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000202 R12: 00007f89119a7d20 R13: ffffffffc4653600 R14: 0000000000000000 R15: 0000000000000000 Asignado por la tarea 315: kasan_save_stack (mm/kasan/common.c:48) kasan_save_track (mm/kasan/common.c:60 (discriminador 1) mm/kasan/common.c:69 (discriminador 1)) __kasan_slab_alloc (mm/kasan/common.c:348) ---truncado---
Impacto
Puntuación base 3.x
7.80
Gravedad 3.x
ALTA
Productos y versiones vulnerables
| CPE | Desde | Hasta |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.15 (incluyendo) | 5.15.194 (excluyendo) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (incluyendo) | 6.1.143 (excluyendo) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (incluyendo) | 6.6.96 (excluyendo) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (incluyendo) | 6.12.36 (excluyendo) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.13 (incluyendo) | 6.15.5 (excluyendo) |
| cpe:2.3:o:linux:linux_kernel:6.16:rc1:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:6.16:rc2:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:6.16:rc3:*:*:*:*:*:* | ||
| cpe:2.3:o:debian:debian_linux:11.0:*:*:*:*:*:*:* |
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/32ca245464e1479bfea8592b9db227fdc1641705
- https://git.kernel.org/stable/c/523edfed4f68b7794d85b9ac828c5f8f4442e4c5
- https://git.kernel.org/stable/c/61a9ad7b69ce688697e5f63332f03e17725353bc
- https://git.kernel.org/stable/c/8db4d2d026e6e3649832bfe23b96c4acff0756db
- https://git.kernel.org/stable/c/a12237865b48a73183df252029ff5065d73d305e
- https://git.kernel.org/stable/c/fad0a2c16062ac7c606b93166a7ce9d265bab976
- https://project-zero.issues.chromium.org/issues/423023990
- https://lists.debian.org/debian-lts-announce/2025/10/msg00008.html



