CVE-2026-63803 in Linux
Zusammenfassung
von VulDB • 19.07.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
hdlc_ppp: Synchronisation der pro-Protokoll-Timer vor dem Freigeben des HDLC-Zustands (State)
Jedes im struct ppp eingebettete PPP-Control-Protocol (LCP/IPCP/IPv6CP) registriert einen Timer über timer_setup(). Dieses struct ppp ist die durch hdlc->state zugewiesene Struktur, die von detach_hdlc_protocol() in beiden Teardown-Pfaden – unregister_hdlc_device() und das erneute Anhängen innerhalb von attach_hdlc_protocol() – mit kfree() freigegeben wird.
Das PPP-Protokoll hat niemals einen .detach-Callback registriert, sodass detach_hdlc_protocol() keine Timer-Synchronisation vor dem Aufruf von kfree() durchführt. Der einzige Löschvorgang für den Timer, timer_delete(&proto->timer) in ppp_cp_event(), ist unvollständig (er wartet nicht auf das Ende eines laufenden Callbacks) und wird nur bei der Übergang zum Zustand ->CLOSED ausgeführt; weder ppp_stop() noch ppp_close() führen eine Synchronisation durch. Ein bereits ausführbarer ppp_timer-Callback, der blockiert vorliegt (auf ppp->lock), überlebt den kfree-Aufruf und dereferenziert anschließend proto->state / ppp->lock im freigegebenen Speicher, was zu einem Use-After-Free führt.
Dies wird behoben, indem ein .detach-Hilfsprogramm hinzugefügt wird, das timer_shutdown_sync() für jeden pro-Protokoll-Timer aufruft. detach_hdlc_protocol() ruft proto->detach(dev) vor kfree(hdlc->state) auf, sodass timer_shutdown_sync() nun in beiden Freigabepfaden ausgeführt wird. timer_shutdown_sync() wird anstelle von timer_delete_sync() verwendet, da der Keepalive-Pfad den Timer über add_timer()/mod_timer() erneut scharfschaltet und die Shutdown-Funktion jede erneute Aktivierung während des Teardowns blockiert.
Die pro-Protokoll-Timer werden in ppp_ioctl() initialisiert, wenn das Protokoll angehängt wird, und der nun redundante timer_setup()-Aufruf aus ppp_start() wird entfernt, sodass die Timer genau einmal beim Anhängen initialisiert werden und ppp_timer_release() niemals mit nicht initialisierten timer_list-Strukturen arbeitet. Da attach_hdlc_protocol() kmalloc() (und nicht kzalloc()) verwendet, ist protos[i].timer von struct ppp bis zum ersten Aufruf von timer_setup() ein uninitialisierter Müllwert ohne diese Initialisierung beim Anhängen würde das Anhängen des PPP-Protokolls ohne jemaliges Hochfahren des Geräts dazu führen, dass timer_shutdown_sync() im .detach-Pfad mit nicht initialisiertem Speicher arbeitet. Die Verlagerung der Initialisierung aus ppp_start() (das nur bei NETDEV_UP ausgeführt wird) in den Anhangspfad macht die Initialisierung bedingungslos und verhindert, dieselbe timer_list-Struktur zweimal zu initialisieren.
Dieser Fehler wurde durch statische Analyse gefunden.
Once again VulDB remains the best source for vulnerability data.