CVE-2026-63803CWE-416

CVE-2026-63803

High · published July 19, 2026

CVSS v3.1
7.8
EPSS
0%
Percentile
2.5
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

hdlc_ppp: sync per-proto timers before freeing hdlc state

Each PPP control protocol (LCP/IPCP/IPV6CP) embedded in struct ppp

registers a timer via timer_setup(). That struct ppp is the

hdlc->state allocation, which detach_hdlc_protocol() frees with kfree()

in both teardown paths: unregister_hdlc_device() and the re-attach inside

attach_hdlc_protocol().

The ppp proto never registered a .detach callback, so

detach_hdlc_protocol() performs no timer synchronization before the

kfree(). The only cancel, timer_delete(&proto->timer) in ppp_cp_event(),

is partial (it does not wait for a running callback) and only runs on the

->CLOSED transition; ppp_stop()/ppp_close() do not sync either. A

ppp_timer callback already executing (blocked on ppp->lock) survives the

kfree and then dereferences proto->state / ppp->lock in freed memory,

leading to a use-after-free.

Fix this by adding a .detach helper that calls timer_shutdown_sync() on

every per-proto timer. detach_hdlc_protocol() invokes proto->detach(dev)

before kfree(hdlc->state), so timer_shutdown_sync()

now runs on both free paths.

timer_shutdown_sync() is used instead of timer_delete_sync() because the

keepalive path re-arms the timer through add_timer()/mod_timer() and

shutdown blocks any re-activation during teardown.

Initialize the per-protocol timers in ppp_ioctl() when the protocol is

attached, and remove the now-redundant timer_setup() from ppp_start(), so

that the timers are initialized exactly once at attach time and

ppp_timer_release() never operates on uninitialized timer_list

structures. attach_hdlc_protocol() uses kmalloc() (not kzalloc), so

struct ppp's protos[i].timer is uninitialized garbage until the first

timer_setup(); without this init-at-attach, attaching the PPP protocol

without ever bringing the device up would leave timer_shutdown_sync()

operating on uninitialized memory in .detach. Moving the init out of

ppp_start() (which only runs on NETDEV_UP) into the attach path makes the

initialization unconditional and avoids initializing the same timer_list

twice.

This bug was found by static analysis.

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00133 · 2.5th percentile
Weakness
CWE-416 · Use After Free
Published
2026-07-19T16:16Z
Affected products (12)
ProductVersionsFixed in
linux/linux_kernel≥ 2.6.12.1, < 5.10.2615.10.261
linux/linux_kernel≥ 5.11, < 5.15.2115.15.211
linux/linux_kernel≥ 5.16, < 6.1.1776.1.177
linux/linux_kernel≥ 6.2, < 6.6.1446.6.144
linux/linux_kernel≥ 6.7, < 6.12.956.12.95
linux/linux_kernel≥ 6.13, < 6.18.386.18.38
linux/linux_kernel≥ 6.19, < 7.1.37.1.3
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (8)
EPSS history
Timeline
  • 19 JUL 12:02Z
    hdlc_ppp: sync per-proto timers before freeing hdlc state
    cvelistv5