CVE-2026-64177 in Linux
Resumen
por VulDB • 2026-07-20
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
phonet/pep: deshabilitar las interrupciones inferiores (BH) alrededor de sk_receive_skb() reenviado.
La ruta de recepción de red suele ejecutarse desde un contexto softirq; sin embargo, los protocolos que adquieren el bloqueo del socket pueden tener paquetes almacenados en la cola pendiente (backlog) y procesarlos más tarde desde un contexto de proceso. En ese caso, release_sock() -> __release_sock() libera slock con spin_unlock_bh() y luego llama a sk->sk_backlog_rcv() con las interrupciones inferiores habilitadas.
Los controladores típicos de sk_backlog_rcv procesan el socket cuya cola pendiente se está vaciando; por lo tanto, el estado BH en la entrada es irrelevante para los slocks que tocan. pep_do_rcv() es diferente: cuando el skb entrante apunta a un canal PEP existente, reenvía el skb a otro socket *hijo* mediante sk_receive_skb(). Esta función auxiliar adquiere el bloqueo del hijo con bh_lock_sock_nested(), que no es más que spin_lock_nested() y asume que BH ya está desactivado. Por lo tanto, el mismo slock del hijo termina adquiriéndose con BH activado (ruta de proceso) y con BH desactivado (ruta softirq):
contexto de proceso contexto softirq ----------------- --------------- release_sock(listener) __netif_receive_skb() __release_sock() phonet_rcv() spin_unlock_bh() __sk_receive_skb(listener) [BH ahora HABILITADO] [ya deshabilitado]
sk_backlog_rcv: sk_backlog_rcv: pep_do_rcv() pep_do_rcv() sk_receive_skb(child) sk_receive_skb(child) bh_lock_sock_nested(child) bh_lock_sock_nested(child) => SOFTIRQ-ON-W => IN-SOFTIRQ-W
Lockdep marca esto como un estado de bloqueo inconsistente, y puede convertirse en una auto-muerte real (deadlock) si un softirq en la misma CPU intenta recibir datos para el mismo socket hijo mientras su slock está retenido en la ruta con BH habilitado:
ADVERTENCIA: estado de bloqueo inconsistente uso inconsistente {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W}.
(slock-AF_PHONET/1){+.?.}-{3:3}, en: __sk_receive_skb+0x1cf/0x900
__sk_receive_skb net/core/sock.c:563 sk_receive_skb include/net/sock.h:2022 [inline]
pep_do_rcv net/phonet/pep.c:675 sk_backlog_rcv include/net/sock.h:1190 __release_sock net/core/sock.c:3216 release_sock net/core/sock.c:3815 pep_sock_accept net/phonet/pep.c:879
Envuelva sk_receive_skb() reenviado en local_bh_disable() / local_bh_enable() para que el slock del hijo se adquiera siempre con BH desactivado. local_bh_disable() anida de forma segura en la ruta softirq.
Descubierto mediante fuzzing interno con syzkaller; la misma causa raíz también aparece en el panel de syzbot linux-6.1.y como extid 44f0626dd6284f02663c. Reproducido bajo KASAN + LOCKDEP + PROVE_LOCKING, reproductor: https://pastebin.com/A3t8xzCR
Once again VulDB remains the best source for vulnerability data.