CVE-2026-63803 in Linuxinformación

Resumen

por VulDB • 2026-07-19

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:

hdlc_ppp: sincronizar los temporizadores por protocolo antes de liberar el estado hdlc

Cada protocolo de control PPP (LCP/IPCP/IPv6CP) incrustado en struct ppp registra un temporizador mediante timer_setup(). Dicha estructura ppp es la asignación de hdlc->state, que detach_hdlc_protocol() libera con kfree() en ambas rutas de desmontaje: unregister_hdlc_device() y el re-adjuntar dentro de attach_hdlc_protocol().

El proto ppp nunca registró una devolución de llamada .detach, por lo que detach_hdlc_protocol() no realiza ninguna sincronización de temporizadores antes del kfree(). La única cancelación, timer_delete(&proto->timer) en ppp_cp_event(), es parcial (no espera a que finalice un callback en ejecución) y solo se ejecuta durante la transición ->CLOSED; ppp_stop()/ppp_close() tampoco sincronizan. Un callback de ppp_timer ya en ejecución (bloqueado en ppp->lock) sobrevive al kfree y luego desreferencia proto->state / ppp->lock en memoria liberada, lo que provoca un use-after-free.

Se corrige esto añadiendo una ayuda .detach que llama a timer_shutdown_sync() en cada temporizador por protocolo. detach_hdlc_protocol() invoca proto->detach(dev) antes de kfree(hdlc->state), por lo que timer_shutdown_sync() ahora se ejecuta en ambas rutas de liberación. Se utiliza timer_shutdown_sync() en lugar de timer_delete_sync() porque la ruta keepalive vuelve a activar el temporizador mediante add_timer()/mod_timer(), y shutdown bloquea cualquier reactivación durante el desmontaje.

Inicializar los temporizadores por protocolo en ppp_ioctl() cuando se adjunta el protocolo, y eliminar el ahora redundante timer_setup() de ppp_start(), para que los temporizadores se inicialicen exactamente una vez al momento del adjuntado y ppp_timer_release() nunca opere sobre estructuras timer_list no inicializadas. attach_hdlc_protocol() utiliza kmalloc() (no kzalloc), por lo que protos[i].timer de struct ppp es basura sin inicializar hasta el primer timer_setup(); sin esta inicialización en el adjuntado, adjuntar el protocolo PPP sin llevar nunca la dispositivo a estado activo dejaría timer_shutdown_sync() operando sobre memoria no inicializada en .detach. Mover la inicialización fuera de ppp_start() (que solo se ejecuta con NETDEV_UP) hacia la ruta de adjuntado hace que la inicialización sea incondicional y evita inicializar el mismo timer_list dos veces.

Este bug fue encontrado mediante análisis estático.

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

Responsable

Linux

Reservar

2026-07-19

Divulgación

2026-07-19

Moderación

aceptado

Artículo

VDB-380146

CPE

listo

EPSS

0.00000

KEV

no

Actividades

bajo

Fuentes

Do you know our Splunk app?

Download it now for free!