From: Wei Jie Law <98lawweijie@gmail.com>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Andrew Duggan <aduggan@synaptics.com>,
Jiri Kosina <jikos@kernel.org>,
Benjamin Tissoires <bentiss@kernel.org>,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: [PATCH 0/2] Input: synaptics-rmi4 - fix two device-controlled out-of-bounds writes
Date: Mon, 24 Aug 2026 13:50:10 +0800 [thread overview]
Message-ID: <cover.1787549234.git.98lawweijie@gmail.com> (raw)
Hi Dmitry,
While putting together a reproducer for an out-of-bounds bug in hid-rmi
(v2 posted separately, [1]) I found two further memory-safety problems in
the shared RMI4 core. Both are driven entirely by data the *device*
supplies -- its Page Description Table -- so they are reachable from a
malicious USB HID device with no code running on the victim, and equally
from I2C and SMBus RMI4 devices. Neither depends on the hid-rmi bug;
they are in drivers/input/rmi4/ and need fixing separately.
Both are present in mainline and in every stable tree I looked at.
1/2 is an off-by-one: RMI_PDT_INT_SOURCE_COUNT_MASK is 0x07, so
interrupt_source_count can be 7, but struct rmi_function declares
int irq[RMI_FN_MAX_IRQS] with RMI_FN_MAX_IRQS == 6 and two loops walk it
up to fn->num_of_irqs. irq[6] is the storage of the next member,
unsigned int irq_pos, so the function's position in the interrupt bitmap
is silently replaced with a Linux virq number. UBSAN flags all five
stores plus the read on the unregister path.
2/2 is a time-of-check/time-of-use across two reads of the device: the
PDT is scanned three times and re-read from the device every time,
irq_mask[] is sized by the counting scan and filled by the creating scan,
and nothing verifies the two agree. KASAN catches the resulting
set_bit() walking off the end of the flexible array at the tail of every
struct rmi_function.
How this was verified
---------------------
Linux v6.12.69 (CONFIG_UBSAN_BOUNDS=y, booted slub_debug=FZPU) and
v6.12.105 (CONFIG_KASAN=y + CONFIG_KASAN_INLINE=y, CONFIG_UBSAN_BOUNDS=y,
booted kasan_multi_shot -- generic KASAN otherwise reports only the first
error per boot), x86_64. An emulated Synaptics RMI4 device publishes a
Page Description Table crafted for each case. Two independent
reproducers, giving identical results:
- a /dev/uhid program -- no hardware, fully deterministic, and the easy
one to run;
- the same device over dummy_hcd + raw-gadget with Facedancer, so the
reports really traverse usbcore -> usbhid -> hid-rmi.
Each bug was exercised on its own cold boot, because heap state left by a
previous run changes what the out-of-bounds read returns and UBSAN
reports each call site only once per boot.
With both patches applied 1/2 produces no UBSAN reports and the same
device -- F01 declaring the full 7 interrupt sources -- probes normally,
and 2/2 fails the probe cleanly instead of corrupting the heap.
I am happy to post the reproducers, or to send them privately if you
would rather they did not go to a public list.
[1] https://patchwork.kernel.org/project/linux-input/patch/00a489f38b240624dcb5a4bae36a53fcba9cfb47.1787549195.git.98lawweijie@gmail.com/
Wei Jie Law (2):
Input: synaptics-rmi4 - fix irq[] overrun with 7 interrupt sources
Input: synaptics-rmi4 - reject a PDT that grows between scans
drivers/input/rmi4/rmi_bus.h | 9 ++++++---
drivers/input/rmi4/rmi_driver.c | 18 ++++++++++++++++++
2 files changed, 24 insertions(+), 3 deletions(-)
--
2.43.0
next reply other threads:[~2026-08-24 5:50 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-24 5:50 Wei Jie Law [this message]
2026-08-24 5:50 ` [PATCH 1/2] Input: synaptics-rmi4 - fix irq[] overrun with 7 interrupt sources Wei Jie Law
2026-08-24 12:38 ` Wei Jie Law
2026-08-24 5:50 ` [PATCH 2/2] Input: synaptics-rmi4 - reject a PDT that grows between scans Wei Jie Law
2026-08-24 12:38 ` Wei Jie Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cover.1787549234.git.98lawweijie@gmail.com \
--to=98lawweijie@gmail.com \
--cc=aduggan@synaptics.com \
--cc=bentiss@kernel.org \
--cc=dmitry.torokhov@gmail.com \
--cc=jikos@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox