Re: [PATCH] HID: ft260: fix stack-use-after-return write in I2C read race
Jiri Kosina <[email protected]> Mon, 3 Aug 2026 19:17:56 +0200 (CEST)
| Newsgroups | org.kernel.vger.linux-i2c,org.kernel.vger.linux-input,org.kernel.vger.linux-kernel,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
On Wed, 10 Jun 2026, Raman Varabets wrote: > ft260_i2c_read() points dev->read_buf at a caller-supplied buffer > (often an on-stack variable), arms a completion and waits up to five > seconds for the device to return the data. The HID input callback > ft260_raw_event() runs in the input/IRQ path, independent of the > dev->lock mutex held by the read path, and copies the device-supplied > payload into dev->read_buf after a plain NULL check. > > These two paths share read_buf, read_idx and read_len with no > serialization. If the device delays its response until the read > times out, ft260_i2c_read() resets the controller, clears read_buf > and returns, unwinding the stack frame the buffer lived in. A > response that arrives at that moment lets ft260_raw_event() pass the > NULL check and then memcpy() the device-controlled payload into the > now-freed stack location, a bounded but attacker-influenced > stack-use-after-return write triggerable by malicious or > malfunctioning hardware. > > Add a dedicated spinlock that serializes every access to read_buf, > read_idx and read_len. ft260_raw_event() now holds it across the > NULL check, the memcpy and the index update, while the read path > takes it when arming and when clearing the buffer, so the teardown > can no longer slip between the check and the copy. Applied, thanks. -- Jiri Kosina SUSE Labs