Vulnerabilidad en kernel de Linux (CVE-2025-38166)
Fecha de publicación:
03/07/2025
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: bpf: corregir pánico ktls con sockmap [ 2172.936997] ------------[ cortar aquí ]------------ [ 2172.936999] ERROR del kernel en lib/iov_iter.c:629! ...... [ 2172.944996] PKRU: 55555554 [ 2172.945155] Rastreo de llamadas: [ 2172.945299] [ 2172.945428] ? die+0x36/0x90 [ 2172.945601] ? do_trap+0xdd/0x100 [ 2172.945795] ? iov_iter_revert+0x178/0x180 [ 2172.946031] ? iov_iter_revert+0x178/0x180 [ 2172.946267] ? do_error_trap+0x7d/0x110 [ 2172.946499] ? iov_iter_revert+0x178/0x180 [ 2172.946736] ? exc_invalid_op+0x50/0x70 [ 2172.946961] ? iov_iter_revert+0x178/0x180 [ 2172.947197] ? asm_exc_invalid_op+0x1a/0x20 [ 2172.947446] ? iov_iter_revert+0x178/0x180 [ 2172.947683] ? iov_iter_revert+0x5c/0x180 [ 2172.947913] tls_sw_sendmsg_locked.isra.0+0x794/0x840 [ 2172.948206] tls_sw_sendmsg+0x52/0x80 [ 2172.948420] ? inet_sendmsg+0x1f/0x70 [ 2172.948634] __sys_sendto+0x1cd/0x200 [ 2172.948848] ? find_held_lock+0x2b/0x80 [ 2172.949072] ? syscall_trace_enter+0x140/0x270 [ 2172.949330] ? __lock_release.isra.0+0x5e/0x170 [ 2172.949595] ? find_held_lock+0x2b/0x80 [ 2172.949817] ? syscall_trace_enter+0x140/0x270 [ 2172.950211] ? lockdep_hardirqs_on_prepare+0xda/0x190 [ 2172.950632] ? ktime_get_coarse_real_ts64+0xc2/0xd0 [ 2172.951036] __x64_sys_sendto+0x24/0x30 [ 2172.951382] do_syscall_64+0x90/0x170 ...... Después de llamar a bpf_exec_tx_verdict(), el tamaño de msg_pl->sg puede aumentar, por ejemplo, cuando el programa BPF ejecuta bpf_msg_push_data(). Si el programa BPF define cork_bytes y sg.size es menor que cork_bytes, devolverá -ENOSPC e intentará revertir a la lógica de copia no nula. Sin embargo, durante la reversión, msg->msg_iter se restablece, pero como se ha aumentado msg_pl->sg.size, las ejecuciones posteriores superarán el tamaño real de msg_iter. ''' iov_iter_revert(&msg->msg_iter, msg_pl->sg.size - orig_size); ''' Los cambios en esta confirmación se basan en las siguientes consideraciones: 1. Cuando se establece cork_bytes, revertir a la lógica de copia no nula no tiene sentido y se puede pasar directamente a la lógica de copia cero. 2. No podemos calcular el número correcto de bytes para revertir msg_iter. Supongamos que los datos originales son "abcdefgh" (8 bytes) y, tras 3 intentos del programa BPF, se convierten en datos de 11 bytes: "abc?de?fgh?". Luego, configuramos cork_bytes en 6, lo que significa que los primeros 6 bytes se han procesado y los 5 bytes restantes de "?fgh?" se almacenarán en caché hasta que la longitud cumpla con el requisito de cork_bytes. Sin embargo, algunos datos en "?fgh?" no están dentro de 'sg->msg_iter' (sino en msg_pl), especialmente los datos "?" que enviamos. Por lo tanto, no parece tan sencillo como revertir a través de un desplazamiento de msg_iter. 3. Para sockets sin TLS en tcp_bpf_sendmsg, cuando se produce una situación de "cork", la función send() en el espacio de usuario no devuelve un error y la longitud devuelta es la misma que el parámetro de longitud de entrada, incluso si algunos datos están almacenados en caché. Además, observé que la lógica actual de copia distinta de cero para gestionar el cork se escribe así: ''' línea 1177 else if (ret != -EAGAIN) { if (ret == -ENOSPC) ret = 0; goto send_end; ''' Por lo tanto, está bien simplemente devolver 'copiado' sin error cuando ocurre una situación de "corcho".
Gravedad: Pendiente de análisis
Última modificación:
03/07/2025