PT-2026-90341 · Linux · Linux
CVE-2026-89625
·
Published
2026-09-11
·
Updated
2026-09-11
None
No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.
In the Linux kernel, the following vulnerability has been resolved:
HID: sony: fix UAF of ghl poke timer / ghl urb at driver unbind
For GHL (Guitar Hero Live) dongles, sony probe() arms a periodic timer:
ghl magic poke() (the timer callback) submits sc->ghl urb, and the URB
completion ghl magic poke cb() re-arms the timer with mod timer().
sony remove() drained the timer with timer delete sync() and then freed
the URB with usb free urb():
timer delete sync(&sc->ghl poke timer);
usb free urb(sc->ghl urb);timer delete sync() does not block re-arming, and while the URB is in
flight the timer is not pending, so the sync delete is a no-op. A URB
completion that runs after the delete re-arms the timer, and usb free urb()
only drops a reference -- it does not kill an in-flight URB. sc is
allocated with devm kzalloc() and freed once sony remove() returns, so the
re-armed ghl poke timer (embedded in sc) then fires on freed memory, a
use-after-free from timer softirq. This is a disconnect/rmmod race.
Poison the URB first, then shut the timer down, before freeing the URB.
usb poison urb() kills any in-flight URB and permanently rejects further
submissions, so a poke timer that is still pending cannot re-submit the
URB from ghl magic poke() in the window before timer shutdown sync() runs.
usb kill urb() would not suffice: it only cancels the in-flight URB and
leaves it submittable once it returns, so the pending timer could
re-submit it and put a fresh URB in flight over the freed sc.
timer shutdown sync() then drains any last callback and blocks re-arming.
The probe error path is unaffected: it is only reached before the timer
is armed.
Reproduced under KASAN on next-20260710 via dummy hcd + raw-gadget
emulation of the GHL PS4 dongle (VID 0x1430 / PID 0x07bb): hid-sony binds
and arms the poke timer, the poke URB is held in flight, the driver is
unbound (freeing sc), then the URB is released. The completion re-arms the
timer on the freed sc, and the re-armed timer fires ~8 s later:
BUG: KASAN: slab-use-after-free in ghl magic poke+0x98/0xb0
Read of size 8 at addr ffff88810b02fd50 by task swapper/0/0
ghl magic poke+0x98/0xb0
call timer fn+0x35/0x2b0
run timers+0x69c/0x9a0
run timer softirq+0x173/0x2a0
Allocated by task 169: sony probe
Freed by task 338: devres release group <- hid device remove (sony remove)
Found by 0sec (https://0sec.ai) using automated source analysis.
Found an issue in the description? Have something to add? Feel free to write us 👾
Related Identifiers
Affected Products
Linux