{"id":14880,"date":"2026-09-04T19:02:16","date_gmt":"2026-09-04T11:02:16","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-63803"},"modified":"2026-09-04T19:02:16","modified_gmt":"2026-09-04T11:02:16","slug":"cve-2026-63803","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-63803","title":{"rendered":"CVE-2026-63803 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nhdlc_ppp: sync per-pr"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>hdlc_ppp: sync per-proto timers before freeing hdlc state<\/p>\n<p>Each PPP control protocol (LCP\/IPCP\/IPV6CP) embedded in struct ppp<br \/>\nregisters a timer via timer_setup(). That struct ppp is the<br \/>\nhdlc-&gt;state allocation, which detach_hdlc_protocol() frees with kfree()<br \/>\nin both teardown paths: unregister_hdlc_device() and the re-attach inside<br \/>\nattach_hdlc_protocol().<\/p>\n<p>The ppp proto never registered a .detach callback, so<br \/>\ndetach_hdlc_protocol() performs no timer synchronization before the<br \/>\nkfree(). The only cancel, timer_delete(&amp;proto-&gt;timer) in ppp_cp_event(),<br \/>\nis partial (it does not wait for a running callback) and only runs on the<br \/>\n-&gt;CLOSED transition; ppp_stop()\/ppp_close() do not sync either. A<br \/>\nppp_timer callback already executing (blocked on ppp-&gt;lock) survives the<br \/>\nkfree and then dereferences proto-&gt;state \/ ppp-&gt;lock in freed memory,<br \/>\nleading to a use-after-free.<\/p>\n<p>Fix this by adding a .detach helper that calls timer_shutdown_sync() on<br \/>\nevery per-proto timer. detach_hdlc_protocol() invokes proto-&gt;detach(dev)<br \/>\nbefore kfree(hdlc-&gt;state), so timer_shutdown_sync()<br \/>\nnow runs on both free paths.<br \/>\ntimer_shutdown_sync() is used instead of timer_delete_sync() because the<br \/>\nkeepalive path re-arms the timer through add_timer()\/mod_timer() and<br \/>\nshutdown blocks any re-activation during teardown.<\/p>\n<p>Initialize the per-protocol timers in ppp_ioctl() when the protocol is<br \/>\nattached, and remove the now-redundant timer_setup() from ppp_start(), so<br \/>\nthat the timers are initialized exactly once at attach time and<br \/>\nppp_timer_release() never operates on uninitialized timer_list<br \/>\nstructures. attach_hdlc_protocol() uses kmalloc() (not kzalloc), so<br \/>\nstruct ppp&#8217;s protos[i].timer is uninitialized garbage until the first<br \/>\ntimer_setup(); without this init-at-attach, attaching the PPP protocol<br \/>\nwithout ever bringing the device up would leave timer_shutdown_sync()<br \/>\noperating on uninitialized memory in .detach. Moving the init out of<br \/>\nppp_start() (which only runs on NETDEV_UP) into the attach path makes the<br \/>\ninitialization unconditional and avoids initializing the same timer_list<br \/>\ntwice.<\/p>\n<p>This bug was found by static analysis.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>hdlc_ppp: sync per-proto timers before freeing hdlc state<\/p>\n<p>Each PPP control protocol (LCP\/IPCP\/IPV6CP) embedded in struct ppp<br \/>\nregis<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-14880","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/14880","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14880"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14880"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}