Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-31624

CVE-2026-31624: Linux Kernel Buffer Overflow Vulnerability

CVE-2026-31624 is a buffer overflow flaw in the Linux Kernel's HID core that allows malicious devices to trigger undefined shift operations. This article covers technical details, affected versions, and mitigation.

Published:

CVE-2026-31624 Overview

A shift-out-of-bounds vulnerability exists in the Linux kernel's HID (Human Interface Device) core subsystem, specifically in the s32ton() function. This function performs bitwise shift operations based on the report_size field value, which comes directly from HID device descriptors. A malicious or malfunctioning HID device can supply a report descriptor with an excessively large field value (up to 256), causing undefined behavior when shift operations exceed the valid range for 32-bit types during output report generation.

Critical Impact

A malicious USB HID device can trigger undefined shift behavior in the kernel, potentially causing system instability or denial of service when building output reports via hid_output_field() or hid_set_field().

Affected Products

  • Linux Kernel (multiple versions)
  • Linux Kernel versions from 2.6.20 onwards
  • Systems with HID device support enabled

Discovery Timeline

  • 2026-04-24 - CVE CVE-2026-31624 published to NVD
  • 2026-04-28 - Last updated in NVD database

Technical Details for CVE-2026-31624

Vulnerability Analysis

The vulnerability resides in the HID core subsystem's s32ton() function, which converts signed 32-bit integers to n-bit representations. This function performs a left shift operation by n-1 bits, where n corresponds to the report_size field from HID device descriptors. The HID parser only validates that report_size is less than or equal to 256, but does not enforce the 32-bit boundary required for safe shift operations on 32-bit integer types.

When an attacker connects a specially crafted HID device (such as a malicious USB keyboard, mouse, or other input device), the device can supply a report descriptor containing an abnormally large report_size value. When the kernel subsequently calls hid_output_field() or hid_set_field() to build output reports, the s32ton() function attempts to perform shifts with exponents exceeding 32, resulting in undefined behavior according to the C standard.

This vulnerability is analogous to a previous issue fixed in commit ec61b41918587 where the companion function snto32() received a similar clamp fix. The s32ton() function was overlooked during that remediation, likely because fuzzing tools had not yet discovered a path to trigger it.

Root Cause

The root cause is insufficient input validation in the s32ton() function. While the HID parser bounds report_size to 256, the function does not clamp the value before using it as a shift exponent on 32-bit types. Shifting a 32-bit integer by more than 31 bits results in undefined behavior in C, which can manifest as incorrect values, crashes, or other unpredictable system behavior.

Attack Vector

This vulnerability requires local access with the ability to connect a USB device or emulate a HID device. An attacker can exploit this by:

  1. Creating a malicious HID device (physical or emulated) with a crafted report descriptor
  2. Connecting the device to the target Linux system
  3. The kernel parses the HID report descriptor containing an oversized report_size field
  4. When output reports are generated, the vulnerable s32ton() function triggers undefined shift behavior

The attack can be performed using USB device emulation tools or by modifying the firmware of programmable USB devices.

Detection Methods for CVE-2026-31624

Indicators of Compromise

  • Kernel panic or oops messages referencing the HID subsystem or s32ton function
  • System instability or crashes occurring after connecting USB HID devices
  • UBSAN (Undefined Behavior Sanitizer) warnings in kernel logs about shift-out-of-bounds operations
  • Unexpected HID device connection events from unknown or untrusted devices

Detection Strategies

  • Monitor kernel logs for undefined behavior sanitizer warnings related to shift operations in HID code paths
  • Implement USB device whitelisting to prevent unauthorized HID device connections
  • Deploy endpoint detection solutions that monitor for suspicious USB device enumeration patterns
  • Enable kernel debugging options (CONFIG_UBSAN) to detect undefined behavior at runtime

Monitoring Recommendations

  • Configure auditd to log all USB device connection events for forensic analysis
  • Monitor for repeated HID device connection/disconnection cycles that may indicate exploitation attempts
  • Set up alerts for kernel oops or panic events mentioning HID subsystem components
  • Review USB device authorization policies and logs regularly for anomalous activity

How to Mitigate CVE-2026-31624

Immediate Actions Required

  • Update the Linux kernel to a patched version that includes the s32ton() clamp fix
  • Restrict physical access to USB ports on sensitive systems
  • Disable USB HID device auto-enumeration on critical systems where possible
  • Enable USB device authorization to require explicit approval for new HID devices

Patch Information

The Linux kernel maintainers have released patches across multiple stable branches to address this vulnerability. The fix adds a clamp operation to the s32ton() function, limiting the shift exponent to a maximum of 32 bits, consistent with the existing fix in the snto32() function.

Patches are available from the following kernel git commits:

Workarounds

  • Disable USB ports via BIOS/UEFI settings on systems where USB input devices are not required
  • Use USB port blockers or physical security measures to prevent unauthorized device connections
  • Implement kernel module blacklisting for specific HID drivers if they are not needed
  • Enable and configure USBGuard to create allowlists of authorized USB devices
bash
# USBGuard configuration to restrict HID devices
# Install and enable USBGuard
sudo apt install usbguard
sudo systemctl enable usbguard

# Generate initial policy (allow currently connected devices)
sudo usbguard generate-policy > /etc/usbguard/rules.conf

# Block new HID devices by default - add to rules.conf
# reject with-interface one-of { 03:*:* }

# Apply and restart
sudo systemctl restart usbguard

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.