Look up another CVE · open CVE-2026-80575 in the interactive tracker
CVE-2026-80575
Input: cs40l50-vibra - validate custom data from user space
Published 2026-08-26 (2 months ago) by the Linux kernel CNA. Subsystem drivers/input. Debian urgency: unimportant.
What to do, per Debian release
Debian's own status for CVE-2026-80575 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source
| Release | Status | Version | What this means |
|---|---|---|---|
| Debian 12bookworm | not affected | 6.1.190-1 | Nothing to do. bookworm never shipped the vulnerable code. |
| Debian 13trixie | fixed | 6.12.105-1 | Update the kernel and reboot. Fixed in 6.12.105-1. A running kernel keeps the old code until the machine restarts. |
| Debian 14forky | fixed | 7.1.10-1 | Update the kernel and reboot. Fixed in 7.1.10-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.1.10-1 | Update the kernel and reboot. Fixed in 7.1.10-1. A running kernel keeps the old code until the machine restarts. |
| Debian 12bookworm · linux-6.12 | fixedDLA-4788-1 · 2026-09-19 · text | 6.12.107-1~deb12u1 | Update the kernel and reboot. DLA-4788-1 shipped the fix on 2026-09-19, in 6.12.107-1~deb12u1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
cs40l50_add() copies the custom data of an FF_PERIODIC/FF_CUSTOM effect straight from the ff_effect the user passed to EVIOCSFF, without requiring it to hold anything: work_data.custom_data = memdup_array_user(periodic->custom_data, periodic->custom_len, sizeof(s16)); work_data.custom_len = periodic->custom_len; The driver then reads two words out of that buffer: custom_data[0] as the waveform bank in cs40l50_effect_bank_set(), and custom_data[1] as the index within the bank in cs40l50_effect_index_set(). Neither read is covered by a length check, and custom_len is fully user controlled: - custom_len == 0 makes memdup_array_user() call memdup_user() with a length of zero, which returns ZERO_SIZE_PTR rather than an error, so custom_data[0] dereferences it. - custom_len == 1 allocates two bytes. A bank of ROM or RAM keeps effect->type out of the OWT case, and custom_data[1] is then read one word past the allocation. The bank value itself is also mishandled. It is masked with CS40L50_CUSTOM_DATA_MASK (0xffff) but stored in an s16, so a custom_data[0] of 0x8000 or above wraps to a negative value that passes the "bank_type >= CS40L50_WVFRM_BANK_NUM" test. cs40l50_effect_index_set() indexes vib->dsp.banks[] with it before the switch statement's default case gets a chance to reject it: base_index = vib->dsp.banks[effect->type].base_index; max_index = vib->dsp.banks[effect->type].max_index; Require the two words the driver reads to be present, and hold the masked bank in a u32 so the existing upper-bound test covers the whole range. The da7280 haptic driver already range checks custom_len this way.
Where it lives
The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.
drivers/input/misc/cs40l50-vibra.c
- What this is
- CIRRUS LOGIC HAPTIC DRIVERSMAINTAINERS section matched on drivers/input/misc/cs40l* · patches@opensource.cirrus.com · Supported
Check it on the machine
grep -wE 'CONFIG_INPUT|CONFIG_INPUT_CS40L50_VIBRA|CONFIG_INPUT_MISC' /boot/config-$(uname -r)Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.
Show whether Debian builds this, per release
Debian does not build this code in 4 releases. The build rule could not be established for 1 release, so nothing is claimed about those.
- bookworm?
- trixie, forky, sid, bookworm · linux-6.12n
- ?
- not established - no Makefile entry for the affected file
- n
- not enabled on any flavour - this release does not build the code
Where a release above reads "not established", no build rule for the affected file was found in that release's kernel tree. That is a gap in this lookup, not a finding that the code is absent.
- Build switches
- CONFIG_INPUT, CONFIG_INPUT_CS40L50_VIBRA, CONFIG_INPUT_MISC
- Reads as
- all on means the file is compiled; any one off means it is not.
From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages
Signals
- Published
- 2026-08-26 (2 months ago)source
- CVSS
- 7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it - Attack vector
- local (AV:L)source
- EPSS
- 0.18%, higher than 6.6% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- unimportantsource
- Subsystem
- drivers/input
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 6.11 | 6.12.105 | 3855b6a11f8a |
| 6.11 | 6.18.46 | 52a818c586ae |
| 6.11 | 7.1.10 | d38554602a0b |
| 6.11 | 7.2 | 7d5c576cb1c8 |
Debian advisories
| Advisory | Date | Shipped to | Debian |
|---|---|---|---|
| DLA-4788-1 | 2026-09-19 | bookworm 6.12.107-1~deb12u1 | tracker |
Why the CNA scored it this way
Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source
- AV:LAttack vector, local
- Exploitation requires a local EVIOCSFF ioctl on the cs40l50_vibra evdev node (/dev/input/event*), traversing evdev_do_ioctl(), input_ff_upload(), and cs40l50_add(); there is no network, adjacent-radio, or physical-insertion path to this driver.
- AC:LAttack complexity, low
- The attacker fully controls ff_effect fields (custom_len, custom_data[0]/[1], waveform type) passed through EVIOCSFF, so custom_len==0, custom_len==1, or bank values >=0x8000 deterministically trigger the missing checks without races or uncontrollable layout.
- PR:LPrivileges required, low
- No capability check exists on the EVIOCSFF path beyond opening the input device; on Android phones, Chromebooks, kiosks, and desktops, logged-in users or session uaccess ACLs commonly grant local access to haptic/input event nodes without init-namespace root.
- UI:NUser interaction, none
- Once the attacker can open the cs40l50_vibra event device, they issue EVIOCSFF themselves with crafted FF_PERIODIC/FF_CUSTOM parameters; no separate victim mount, plug-in, or interactive action is required.
- S:UScope, unchanged
- Impact is confined to kernel memory handling and haptic-driver state within the local host kernel; it does not cross VM, container, IOMMU, or other security-scope boundaries.
- C:HConfidentiality impact, high
- custom_len==1 forces a kmalloc heap out-of-bounds read of custom_data[1], and s16 bank sign-wrap indexes dsp.banks[] out of bounds before validation, leaking adjacent kernel memory; custom_len==0 dereferences ZERO_SIZE_PTR on read.
- I:HIntegrity impact, high
- Unchecked custom_len and sign-wrapped bank values cause out-of-bounds kernel memory accesses in the force-feedback upload path; per CNA guidance such heap/array boundary violations in ioctl handlers are scored High because they can corrupt subsequent kernel arithmetic and device register programming.
- A:HAvailability impact, high
- custom_len==0 makes memdup_array_user return ZERO_SIZE_PTR and cs40l50_effect_bank_set dereferences it, and the heap/array out-of-bounds reads can trigger kernel oops/panic or KASAN faults on affected CS40L50 haptic devices.