PT-2026-64585 · Linux · Linux
CVE-2026-64364
·
Published
2026-07-25
·
Updated
2026-07-25
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: multitouch: fix out-of-bounds bit access on mt io flags
mt io flags is a single unsigned long, but mt process slot(),
mt release pending palms() and mt release contacts() use it as a
per-slot bitmap indexed by the slot number. That slot number is only
bounded by td->maxcontacts, which is taken from the device's
ContactCountMaximum feature report and can be up to 255, not by
BITS PER LONG.
As a result, a multitouch device that advertises a large contact count
makes set bit()/clear bit() operate past the mt io flags word and
corrupt the adjacent members of struct mt device. The sticky-fingers
release timer is the easiest way to reach this. mt release contacts()
runs
for (i = 0; i < mt->num slots; i++)
clear bit(i, &td->mt io flags);with num slots == maxcontacts. For maxcontacts around 250 the loop
clears the bits that overlap td->applications.next, zeroing that list
head, and the list for each entry() that immediately follows then
dereferences NULL. The kernel panics from timer (softirq) context. On a
KASAN build this shows up as a general protection fault in
mt release contacts() with a null-ptr-deref at offset 0x58, which is
offsetof(struct mt application, num received).
The state is reachable from an untrusted USB or Bluetooth HID
multitouch device; no local privileges are required.
Store the per-slot active state in a separately allocated bitmap sized
for maxcontacts, the same pattern already used for pending palm slots,
and keep only MT IO FLAGS RUNNING in mt io flags. The two
"mt io flags & MT IO SLOTS MASK" arming checks become
bitmap empty(td->active slots, td->maxcontacts).
Move MT IO FLAGS RUNNING back to bit 0. It was bumped to bit 32 by the
same commit to leave the low byte for the slot bits; with the slot bits
gone it fits in bit 0 again, which also keeps it within the unsigned
long on 32-bit.
Found an issue in the description? Have something to add? Feel free to write us 👾
Related Identifiers
Affected Products
Linux