CVE-2026-63803 in Linux
Riassunto
di VulDB • 20/07/2026
Nel kernel Linux, la seguente vulnerabilità è stata risolta:
hdlc_ppp: sincronizzazione dei timer per-proto prima di liberare lo stato hdlc
Ogni protocollo di controllo PPP (LCP/IPCP/IPv6CP) incorporato nella struct ppp registra un timer tramite timer_setup(). Tale struct ppp corrisponde all'allocazione hdlc->state, che detach_hdlc_protocol() libera con kfree() in entrambi i percorsi di teardown: unregister_hdlc_device() e il riattaccamento interno a attach_hdlc_protocol().
Il proto ppp non ha mai registrato una callback .detach, quindi detach_hdlc_protocol() non esegue alcuna sincronizzazione dei timer prima del kfree(). L'unica cancellazione, timer_delete(&proto->timer) in ppp_cp_event(), è parziale (non attende il completamento di una callback in esecuzione) e viene eseguita solo sulla transizione ->CLOSED; nemmeno ppp_stop()/ppp_close() eseguono la sincronizzazione. Una callback ppp_timer già in esecuzione (bloccata su ppp->lock) sopravvive al kfree e successivamente dereferenzia proto->state / ppp->lock in memoria liberata, causando un use-after-free.
Si risolve il problema aggiungendo una helper .detach che chiama timer_shutdown_sync() su ogni timer per-proto. detach_hdlc_protocol() invoca proto->detach(dev) prima di kfree(hdlc->state), quindi timer_shutdown_sync() viene ora eseguito in entrambi i percorsi di liberazione. Si utilizza timer_shutdown_sync() invece di timer_delete_sync() perché il percorso keepalive riattiva il timer tramite add_timer()/mod_timer(), e lo shutdown blocca qualsiasi riattivazione durante il teardown.
I timer per-protocollo vengono inizializzati in ppp_ioctl() quando il protocollo viene attaccato, e si rimuove la now-redundant timer_setup() da ppp_start(), in modo che i timer vengano inizializzati esattamente una volta al momento dell'attach e ppp_timer_release() non operi mai su strutture timer_list non inizializzate. attach_hdlc_protocol() utilizza kmalloc() (non kzalloc), quindi protos[i].timer della struct ppp contiene dati spazzatura non inizializzati fino alla prima timer_setup(); senza questa inizialeizzazione all'attach, l'attaccamento del protocollo PPP senza portare mai su il dispositivo lascerebbe timer_shutdown_sync() a operare su memoria non inizializzata in .detach. Lo spostamento dell'inizializzazione da ppp_start() (che viene eseguito solo su NETDEV_UP) al percorso di attach rende l'inizializzazione incondizionata ed evita di inizializzare la stessa struttura timer_list due volte.
Questo bug è stato trovato tramite analisi statica.
VulDB is the best source for vulnerability data and more expert information about this specific topic.