Vulnerabilidad en kernel de Linux (CVE-2024-26921)
Gravedad CVSS v3.1:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
18/04/2024
Última modificación:
16/09/2025
Descripción
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: inet: inet_defrag: evita la liberación de sk mientras aún está en uso ip_local_out() y otras funciones pueden pasar skb->sk como argumento de función. Si el skb es un fragmento y el reensamblaje ocurre antes de que regrese dicha llamada a la función, el sk no debe liberarse. Esto afecta a los fragmentos de skb reensamblados mediante netfilter o módulos similares, por ejemplo, openvswitch o ct_act.c, cuando se ejecutan como parte de la canalización tx. Eric Dumazet hizo un análisis inicial de este error. Citando a Eric: Llamar a ip_defrag() en la ruta de salida también implica skb_orphan(), lo cual tiene errores porque la ruta de salida depende de que sk no desaparezca. Un parche antiguo relevante sobre el problema era: 8282f27449bf ("inet: frag: Siempre skbs huérfanos dentro de ip_defrag()") [..] net/ipv4/ip_output.c depende de que skb->sk esté configurado, y probablemente en un inet socket, no uno arbitrario. Si dejamos el paquete huérfano en ipvlan, las cosas posteriores como el programador de paquetes FQ no funcionarán correctamente. Necesitamos cambiar ip_defrag() para usar skb_orphan() solo cuando sea realmente necesario, es decir, siempre que se vaya a usar frag_list. Eric sugirió guardar sk en la cola de fragmentos e hizo un parche inicial. Sin embargo, hay un problema con esto: si skb se vuelve a fragmentar inmediatamente después, ip_do_fragment() copiará head->sk a los nuevos fragmentos y configurará el destructor en sock_wfree. OIA, no tenemos más remedio que arreglar la contabilidad de sk_wmem para reflejar el skb completamente reensamblado; de lo contrario, wmem se desbordará. Este cambio mueve al huérfano hacia el núcleo, hasta el último momento posible. Como ip_defrag_offset tiene un alias con el miembro sk_buff->sk, debemos mover el desplazamiento a FRAG_CB; de lo contrario, skb->sk será golpeado. Esto permite retrasar el huérfano el tiempo suficiente para saber si el skb debe estar en cola o si el skb está completando la cola de reasm. En el primer caso, las cosas funcionan como antes, skb queda huérfano. Esto es seguro porque skb se pone en cola/se roba y no continúa más allá del motor de reasm. En el último caso, robaremos la referencia skb->sk, la volveremos a adjuntar al skb principal y arreglaremos la contabilidad de wmem cuando inet_frag infle el tamaño verdadero.
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.1 (incluyendo) | 5.4.285 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (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.85 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (incluyendo) | 6.6.26 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (incluyendo) | 6.8.5 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:6.9:rc1:*:*:*:*:*:* |
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/18685451fc4e546fc0e718580d32df3c0e5c8272
- https://git.kernel.org/stable/c/1b6de5e6575b56502665c65cf93b0ae6aa0f51ab
- https://git.kernel.org/stable/c/4318608dc28ef184158b4045896740716bea23f0
- https://git.kernel.org/stable/c/7d0567842b78390dd9b60f00f1d8f838d540e325
- https://git.kernel.org/stable/c/9705f447bf9a6cd088300ad2c407b5e1c6591091
- https://git.kernel.org/stable/c/e09cbe017311508c21e0739e97198a8388b98981
- https://git.kernel.org/stable/c/f4877225313d474659ee53150ccc3d553a978727
- https://git.kernel.org/stable/c/18685451fc4e546fc0e718580d32df3c0e5c8272
- https://git.kernel.org/stable/c/7d0567842b78390dd9b60f00f1d8f838d540e325
- https://git.kernel.org/stable/c/e09cbe017311508c21e0739e97198a8388b98981
- https://git.kernel.org/stable/c/f4877225313d474659ee53150ccc3d553a978727