CVE-2026-63803 in Linux
Résumé
par VulDB • 19/07/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
hdlc_ppp : synchronisation des temporisateurs par protocole avant de libérer l'état hdlc
Chaque protocole de contrôle PPP (LCP/IPCP/IPv6CP) intégré dans struct ppp enregistre un temporisateur via timer_setup(). Cette structure struct ppp correspond à l'allocation hdlc->state, qui est libérée avec kfree() par detach_hdlc_protocol() dans les deux chemins d'arrêt : unregister_hdlc_device() et la réattachement au sein de attach_hdlc_protocol().
Le proto ppp n'a jamais enregistré de rappel .detach, donc detach_hdlc_protocol() ne réalise aucune synchronisation des temporisateurs avant le kfree(). L'appel unique à cancel_timer(), timer_delete(&proto->timer) dans ppp_cp_event(), est partiel (il n'attend pas qu'un rappel en cours s'exécute) et ne se déclenche que lors de la transition ->CLOSED ; ni ppp_stop() ni ppp_close() ne réalisent cette synchronisation. Un rappel ppp_timer déjà en cours d'exécution (bloqué sur le verrou ppp->lock) survit au kfree, puis déréférence proto->state / ppp->lock dans une mémoire libérée, entraînant un use-after-free.
Correction de ce problème en ajoutant une fonction auxiliaire .detach qui appelle timer_shutdown_sync() pour chaque temporisateur par protocole. detach_hdlc_protocol() invoque proto->detach(dev) avant kfree(hdlc->state), afin que timer_shutdown_sync() s'exécute désormais sur les deux chemins de libération. timer_shutdown_sync() est utilisé à la place de timer_delete_sync() car le chemin keepalive réarme le temporisateur via add_timer()/mod_timer(), et l'arrêt bloque toute nouvelle activation pendant la phase d'arrêt.
Initialisation des temporisateurs par protocole dans ppp_ioctl() lorsque le protocole est attaché, et suppression du désormais redondant timer_setup() de ppp_start(), afin que les temporisateurs soient initialisés exactement une fois lors de l'attachement et que ppp_timer_release() n'opère jamais sur des structures timer_list non initialisées. Comme attach_hdlc_protocol() utilise kmalloc() (et non kzalloc), protos[i].timer de struct ppp contient des données aléatoires jusqu'au premier appel à timer_setup(); sans cette initialisation lors de l'attachement, le fait d'attacher le protocole PPP sans jamais activer l'appareil laisserait timer_shutdown_sync() opérer sur une mémoire non initialisée dans .detach. Le déplacement de l'initialisation depuis ppp_start() (qui ne s'exécute que pour NETDEV_UP) vers la voie d'attachement rend cette initialisation inconditionnelle et évite d'initialiser deux fois le même timer_list.
Ce bug a été détecté par analyse statique.
If you want to get best quality of vulnerability data, you may have to visit VulDB.