Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en kernel de Linux (CVE-2020-36789)

Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-476 Desreferencia a puntero nulo (NULL)
Fecha de publicación:
17/04/2025
Última modificación:
29/04/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: can: dev: can_get_echo_skb(): evitar la llamada a kfree_skb() en el contexto de IRQ duro Si un controlador llama a can_get_echo_skb() durante un IRQ de hardware (que es a menudo, pero no siempre, el caso), el 'WARN_ON(in_irq)' en net/core/skbuff.c#skb_release_head_state() podría activarse, en circunstancias de congestión de la red, junto con el riesgo potencial de una desreferencia de puntero NULL. La causa raíz de este problema es la llamada a kfree_skb() en lugar de dev_kfree_skb_irq() en net/core/dev.c#enqueue_to_backlog(). Este parche evita que el skb se libere dentro de la llamada a netif_rx() incrementando su contador de referencias con skb_get(). El skb se libera finalmente mediante una de las funciones seguras en contexto IRQ: dev_consume_skb_any() o dev_kfree_skb_any(). Se utiliza la versión "any" porque algunos controladores podrían llamar a can_get_echo_skb() en un contexto normal. Este problema se debe a que, inicialmente, en la pila de red principal, no se esperaba que los skb de bucle invertido se recibieran en el contexto IRQ de hardware. La pila CAN es una excepción. Este error se reportó previamente en 2017 en [1], pero el parche propuesto nunca fue aceptado. Si bien [1] modifica directamente net/core/dev.c, aquí intentamos proponer una modificación más fluida local en la pila de red CAN (suponiendo que solo los dispositivos CAN se ven afectados por este problema). [1] http://lore.kernel.org/r/57a3ffb6-3309-3ad5-5a34-e93c3fe3614d@cetitec.com

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 2.6.31 (incluyendo) 4.4.244 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.5 (incluyendo) 4.9.244 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.10 (incluyendo) 4.14.207 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.15 (incluyendo) 4.19.158 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.20 (incluyendo) 5.4.78 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.5 (incluyendo) 5.9.9 (excluyendo)
cpe:2.3:o:linux:linux_kernel:5.10:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:5.10:rc2:*:*:*:*:*:*