Description
In the Linux kernel, the following vulnerability has been resolved:

Input: cs40l50-vibra - validate custom data from user space

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.
Published: 2026-08-26
Score: 7.8 High
EPSS: < 1% Very Low
KEV: No
Impact: Kernel buffer over-read and potential memory corruption leading to denial of service
Action: Immediate Patch
AI Analysis

Impact

The vulnerability arises in the Linux kernel's cs40l50 haptic driver when handling FF_CUSTOM effects supplied by user space. The driver copies custom data without verifying its length and then reads two 16‑bit words from that buffer. When the supplied length is zero or one, the driver reads beyond the allocated memory, potentially accessing arbitrary kernel memory. If the first word is 0x8000 or higher, the masked value is stored as a negative signed short and used as an index into an array of vibration banks, enabling an out‑of‑bounds array index and further memory corruption. Based on the description, the likely attack vector is a local attacker providing malicious FF_CUSTOM data via the EVIOCSFF ioctl, leading to a kernel crash or denial of service.

Affected Systems

All Linux kernel versions containing the cs40l50 haptic driver before the patch. The bug is identified in the generic Linux kernel source and affects any installation that includes this driver.

Risk and Exploitability

The CVSS score is 7.8. The EPSS score of <1% indicates a very low predicted exploitation probability, and the vulnerability is not listed in CISA KEV, meaning no known active exploitation reports. The attack would require local kernel access or the ability to inject data into the EVIOCSFF ioctl. If exploited, the impact is a kernel crash or denial of service, but no remote code execution is demonstrated by the current information.

Generated by OpenCVE AI on August 28, 2026 at 17:40 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Update the Linux kernel to a version that contains the cs40l50 driver patch.
  • If an update is impossible, disable the cs40l50 haptic driver module to eliminate the vulnerability.
  • Verify that custom_len checks are enforced by inspecting the driver source or applying a local patch that validates buffer length before copying and reading the custom data.
  • Monitor logs for any unexpected kernel panics that may indicate an attempted exploit.

Generated by OpenCVE AI on August 28, 2026 at 17:40 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Fri, 28 Aug 2026 16:15:00 +0000

Type Values Removed Values Added
Weaknesses CWE-195
CWE-20

Thu, 27 Aug 2026 18:00:00 +0000

Type Values Removed Values Added
Weaknesses CWE-476
References
Metrics threat_severity

None

threat_severity

Moderate


Thu, 27 Aug 2026 09:45:00 +0000

Type Values Removed Values Added
Weaknesses CWE-195
CWE-20

Thu, 27 Aug 2026 08:45:00 +0000

Type Values Removed Values Added
Weaknesses CWE-125
CWE-476

Thu, 27 Aug 2026 06:15:00 +0000

Type Values Removed Values Added
Metrics cvssV3_1

{'score': 7.8, 'vector': 'CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H'}


Wed, 26 Aug 2026 16:15:00 +0000

Type Values Removed Values Added
Weaknesses CWE-125
CWE-476

Wed, 26 Aug 2026 14:45:00 +0000

Type Values Removed Values Added
Description In the Linux kernel, the following vulnerability has been resolved: Input: cs40l50-vibra - validate custom data from user space 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.
Title Input: cs40l50-vibra - validate custom data from user space
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-08-27T05:01:57.416Z

Reserved: 2026-08-26T14:34:25.768Z

Link: CVE-2026-80575

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-08-26T15:17:13.530

Modified: 2026-08-27T06:17:43.243

Link: CVE-2026-80575

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-08-26T00:00:00Z

Links: CVE-2026-80575 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-08-28T17:45:04Z

Weaknesses