---
id: "CVE-2026-98741"
kind: "vulnerability"
aliases: ["CVE-2026-98741"]
title: "Linux kernel: malformed USB audio device can overwrite kernel memory on open"
severity: "high"
cvss: null
epss: null
exploited: false
status: "open"
category: "runtime"
products: []
ecosystems: []
tags: ["linux-kernel", "runtime", "usb-audio", "workstations"]
not_affected_if: ["driver-not-built", "no-ua101-hardware", "no-untrusted-usb"]
published_at: "2026-10-18T16:17:27+00:00"
first_seen_at: "2026-10-23T21:57:16+00:00"
updated_at: "2026-10-25T05:17:06+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-98741", "first_seen_at": "2026-10-23T21:57:16+00:00"}]
---

# Linux kernel: malformed USB audio device can overwrite kernel memory on open

The Linux kernel's ua101 USB audio driver accepts a device whose capture and playback endpoints declare mismatched packet sizes and channel counts, so opening the playback PCM node writes past a heap buffer. An attacker who can plug in or emulate such a USB device can corrupt kernel memory, which can lead to a crash or privilege escalation.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- Check whether the kernel includes the ua101 driver: `grep -i ua101 /boot/config-$(uname -r)` (CONFIG_SND_USB_UA101 set to m or y)
- Check the running kernel version: `uname -r`
- Check for the ua101 module loaded: `lsmod | grep snd_ua101`

## Fix

- Update the Linux kernel to a release that includes the upstream commit 'ALSA: ua101: reject mismatched capture/playback packet sizes' (exact fixed version: unknown)
- Until patched, blacklist the module if no UA-101 or UA-1000 hardware is used: `echo 'blacklist snd_ua101' > /etc/modprobe.d/ua101.conf`

## Timeline

- 2026-10-23T21:57:16+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-98741

## From the sources

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

ALSA: ua101: reject mismatched capture/playback packet sizes

detect_usb_format() cross-checks bSubframeSize, bBitResolution and
tSamFreq between the capture and playback interfaces, but never relates
the two endpoints' wMaxPacketSize and bNrChannels.  Each playback URB
gets a buffer of ua->playback.max_packet_bytes, while the number of
bytes written into it is derived from the capture stream:
capture_urb_complete() computes frames from the received capture packet
and capture.frame_bytes, and start_usb_playback() and playback_work()
multiply that by playback.frame_bytes.

A device declaring a large capture wMaxPacketSize with few capture
channels and a small playback wMaxPacketSize with many playback channels
therefore memset()s and memcpy()s past the end of the playback buffer,
in open() of the PCM node the driver registers during probe.
usb_submit_urb() rejects the over-long iso_frame_desc[0].length with
-EMSGSIZE, but only after the write.

Reject such descriptors at probe time.  Genuine UA-101/UA-1000 hardware
declares proportional packet sizes and is unaffected.

  BUG: KASAN: slab-out-of-bounds in start_usb_playback (sound/usb/misc/ua101.c:586)
  Write of size 2048 at addr ffff8881098f3c00 by task exploit/5021
  Call Trace:
   __asan_memset (mm/kasan/shadow.c:84)
   start_usb_playback (sound/usb/misc/ua101.c:586)
   playback_pcm_open (sound/usb/misc/ua101.c:679)
   snd_pcm_open_substream (sound/core/pcm_native.c:2829)
   snd_pcm_open (sound/core/pcm_native.c:2865 sound/core/pcm_native.c:2932)
   snd_pcm_playback_open (sound/core/pcm_native.c:2891)
   snd_open (sound/core/sound.c:166)
   chrdev_open (fs/char_dev.c:411)
   do_dentry_open (fs/open.c:996)
   vfs_open (fs/open.c:1101)
   path_openat (fs/namei.c:4837 fs/namei.c:5000)
   do_file_open (fs/namei.c:5029)
   do_sys_openat2 (fs/open.c:1417)
   __x64_sys_openat (fs/open.c:1423 fs/open.c:1439 fs/open.c:1434)
   do_syscall_64 (arch/x86/entry/syscall_64.c:61 arch/x86/entry/syscall_64.c:84)
   entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)

  The buggy address belongs to the object at ffff8881098f3c00
   which belongs to the cache kmalloc-192 of size 192
  The buggy address is located 0 bytes inside of
   allocated 168-byte region [ffff8881098f3c00, ffff8881098f3ca8)

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
