{"id":"CVE-2026-63803","title":"In the Linux kernel, the following vulnerability has been resolved:\n\nhdlc_ppp: sync per-proto timers before freeing hdlc state\n\nEach PPP control protocol (LCP/IPCP/IPV6CP) embedded in struct ppp\nregisters a timer via timer_setup()","summary":"In the Linux kernel, the following vulnerability has been resolved:\n\nhdlc_ppp: sync per-proto timers before freeing hdlc state\n\nEach PPP control protocol (LCP/IPCP/IPV6CP) embedded in struct ppp\nregisters a timer via timer_setup(). That …","severity":"high","published":"2026-07-19","updated":"2026-07-19","source":"NVD","sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-63803","references":[{"url":"https://git.kernel.org/stable/c/508a0139d3bf60f6a03d2fbfb63a89a9463d983a","label":"416baaa9-dc9f-4396-8d5f-8c081fb06d67"},{"url":"https://git.kernel.org/stable/c/5a84398101bf9f11e84b176343e4e3ba83e668c0","label":"416baaa9-dc9f-4396-8d5f-8c081fb06d67"},{"url":"https://git.kernel.org/stable/c/8308122bc9c065b1f376e081ed300129a2ac9545","label":"416baaa9-dc9f-4396-8d5f-8c081fb06d67"},{"url":"https://git.kernel.org/stable/c/a594debfd4e7ec39413647458907f689ef57fd2f","label":"416baaa9-dc9f-4396-8d5f-8c081fb06d67"},{"url":"https://git.kernel.org/stable/c/c64dbef1c0fbd36f9530aa75112acdf6a6d3cfd8","label":"416baaa9-dc9f-4396-8d5f-8c081fb06d67"},{"url":"https://git.kernel.org/stable/c/c78a4e41ab5ead6193ad8a2dd92e8906bae659fa","label":"416baaa9-dc9f-4396-8d5f-8c081fb06d67"},{"url":"https://git.kernel.org/stable/c/ce8f9ddca0c9f217342a8b49efd309aa35b81a36","label":"416baaa9-dc9f-4396-8d5f-8c081fb06d67"},{"url":"https://git.kernel.org/stable/c/86d80a231bde4cfb64bfbfbfffd83056fc93628f"}],"tags":["nvd","cve.org"],"ingestedAt":"2026-07-20T01:35:22.952Z","epss":0.00133,"epssPercentile":0.02804,"vendor":"Linux","product":"Linux","affected":["Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < 86d80a231bde4cfb64bfbfbfffd83056fc93628f","Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < 8308122bc9c065b1f376e081ed300129a2ac9545","Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < ce8f9ddca0c9f217342a8b49efd309aa35b81a36","Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < 508a0139d3bf60f6a03d2fbfb63a89a9463d983a","Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < c64dbef1c0fbd36f9530aa75112acdf6a6d3cfd8","Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < 5a84398101bf9f11e84b176343e4e3ba83e668c0","Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < a594debfd4e7ec39413647458907f689ef57fd2f","Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < c78a4e41ab5ead6193ad8a2dd92e8906bae659fa","Linux 2.6.12"],"cvss":7.8,"cvssVector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","ssvc":{"exploitation":"none","automatable":"no","technicalImpact":"total","timestamp":"2026-10-16T15:30:49.056800Z"},"cvssSource":"cna","slug":"CVE-2026-63803","body":"## Overview\n\nIn the Linux kernel, the following vulnerability has been resolved:\n\nhdlc_ppp: sync per-proto timers before freeing hdlc state\n\nEach PPP control protocol (LCP/IPCP/IPV6CP) embedded in struct ppp\nregisters a timer via timer_setup(). That struct ppp is the\nhdlc->state allocation, which detach_hdlc_protocol() frees with kfree()\nin both teardown paths: unregister_hdlc_device() and the re-attach inside\nattach_hdlc_protocol().\n\nThe ppp proto never registered a .detach callback, so\ndetach_hdlc_protocol() performs no timer synchronization before the\nkfree(). The only cancel, timer_delete(&proto->timer) in ppp_cp_event(),\nis partial (it does not wait for a running callback) and only runs on the\n->CLOSED transition; ppp_stop()/ppp_close() do not sync either. A\nppp_timer callback already executing (blocked on ppp->lock) survives the\nkfree and then dereferences proto->state / ppp->lock in freed memory,\nleading to a use-after-free.\n\nFix this by adding a .detach helper that calls timer_shutdown_sync() on\nevery per-proto timer. detach_hdlc_protocol() invokes proto->detach(dev)\nbefore kfree(hdlc->state), so timer_shutdown_sync()\nnow runs on both free paths.\ntimer_shutdown_sync() is used instead of timer_delete_sync() because the\nkeepalive path re-arms the timer through add_timer()/mod_timer() and\nshutdown blocks any re-activation during teardown.\n\nInitialize the per-protocol timers in ppp_ioctl() when the protocol is\nattached, and remove the now-redundant timer_setup() from ppp_start(), so\nthat the timers are initialized exactly once at attach time and\nppp_timer_release() never operates on uninitialized timer_list\nstructures. attach_hdlc_protocol() uses kmalloc() (not kzalloc), so\nstruct ppp's protos[i].timer is uninitialized garbage until the first\ntimer_setup(); without this init-at-attach, attaching the PPP protocol\nwithout ever bringing the device up would leave timer_shutdown_sync()\noperating on uninitialized memory in .detach. Moving the init out of\nppp_start() (which only runs on NETDEV_UP) into the attach path makes the\ninitialization unconditional and avoids initializing the same timer_list\ntwice.\n\nThis bug was found by static analysis.\n\n## Remediation\n\nRefer to the linked advisories for vendor-supplied fixes and affected version ranges.","depth":"twilight","depthScore":43,"depthScoreParts":{"impact":42.9,"likelihood":0,"exploitation":0,"ransomware":0},"changes":[{"seq":223136,"id":"CVE-2026-63803","ts":1792172309872,"field":"cvss","old":null,"new":"7.8"},{"seq":223135,"id":"CVE-2026-63803","ts":1792172309872,"field":"severity","old":"none","new":"high"}]}