Look up another CVE · open CVE-2026-97931 in the interactive tracker
CVE-2026-97931
ALSA: us122l: Prevent write upgrades for read mappings
Published 2026-09-25 (24 days ago) by the Linux kernel CNA. Subsystem sound/usb. Debian urgency: not yet assigned.
What to do, per Debian release
Debian's own status for CVE-2026-97931 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 | fixedDLA-4841-1 · 2026-10-17 · text | 6.1.190-1 | Update the kernel and reboot. DLA-4841-1 shipped the fix on 2026-10-17, in 6.1.190-1. A running kernel keeps the old code until the machine restarts. |
| Debian 13trixie | fixedDSA-6528-1 · 2026-09-29 · text | 6.12.111-1 | Update the kernel and reboot. DSA-6528-1 shipped the fix on 2026-09-29, in 6.12.111-1. A running kernel keeps the old code until the machine restarts. |
| Debian 14forky | fixed | 7.2.7-1 | Update the kernel and reboot. Fixed in 7.2.7-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.2.7-1 | Update the kernel and reboot. Fixed in 7.2.7-1. A running kernel keeps the old code until the machine restarts. |
| Debian 12bookworm · linux-6.12 | fixedDLA-4817-1 · 2026-10-04 · text | 6.12.111-1~deb12u1 | Update the kernel and reboot. DLA-4817-1 shipped the fix on 2026-10-04, in 6.12.111-1~deb12u1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
The hwdep mmap callback rejects read-buffer mappings that are initially writable, but leaves VM_MAYWRITE set on mappings created with PROT_READ. A process that can open the hwdep node O_RDWR can later use mprotect() to make the mapping writable. The read allocation begins with struct usb_stream. Its read_size member is used by the fault handler to decide which pages belong to the read buffer. The read VMA intentionally remains expandable because pcm_usb_stream uses mremap() after reading that size. Changing read_size first can therefore map and access pages beyond the allocation. The same member is also consumed by usb_stream_free(), where changing it can make free_pages_exact() release pages outside the allocation. Clear VM_MAYWRITE for read-buffer mappings after rejecting an initially writable VMA. This keeps the separate output-buffer mapping writable while preventing later permission upgrades.
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.
sound/usb/usx2y/us122l.c
- What this is
- SOUNDMAINTAINERS section matched on sound/ · linux-sound@vger.kernel.org · Maintained
- Kernel module
- snd_usb_us122l
Check it on the machine
grep -wE 'CONFIG_SND|CONFIG_SND_USB_US122L' /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.
lsmod | grep -w snd_usb_us122lPrints a line if that module is loaded right now, and nothing if it is not. One that is not loaded can still be loaded later by anything that needs it.
Show whether Debian builds this, per release
Debian builds this, but not on every flavour. At least one release below builds the code on some of its kernel flavours and not on others, so the answer depends on the architecture and flavour installed.
- bookwormMnot built on amd64/cloud-amd64, arm64/arm64, arm64/cloud-arm64, arm64/rt/arm64, armhf/armmp, armhf/armmp-lpae, armhf/rt/armmp, ppc64el/powerpc64le
- trixieMnot built on amd64/cloud-amd64, arm64/arm64, arm64/arm64-16k, arm64/cloud-arm64, arm64/rt/arm64, armel/rpi, armhf/armmp, armhf/armmp-lpae, armhf/rt/armmp, ppc64el/powerpc64le, ppc64el/powerpc64le-64k, riscv64/riscv64, s390x/s390x
- forky, sidMnot built on amd64/cloud-amd64, arm64/arm64, arm64/arm64-16k, arm64/cloud-arm64, arm64/rt-arm64, armhf/armmp, armhf/armmp-lpae, loong64/loong64, ppc64el/powerpc64le, ppc64el/powerpc64le-64k, riscv64/riscv64, s390x/s390x
- bookworm · linux-6.12Mnot built on amd64/cloud-amd64, arm64/arm64, arm64/arm64-16k, arm64/cloud-arm64, arm64/rt/arm64, armhf/armmp, armhf/armmp-lpae, armhf/rt/armmp, ppc64el/powerpc64le, ppc64el/powerpc64le-64k
- M
- a module where it is built at all; some flavours do not build it
- Build switches
- CONFIG_SND, CONFIG_SND_USB_US122L
- 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-09-25 (24 days ago)source
- CVSS
- 7.0 high
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it - Attack vector
- local (AV:L)source
- EPSS
- 0.14%, higher than 3.4% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- not yet assignedsource
- Subsystem
- sound/usb
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 2.6.28 | 5.10.271 | cbc1f954ce67 |
| 2.6.28 | 5.15.222 | becb89036a13 |
| 2.6.28 | 6.1.189 | 6a5f5a5a32c7 |
| 2.6.28 | 6.6.158 | 938e8d6cee8d |
| 2.6.28 | 6.12.111 | 64a879502398 |
| 2.6.28 | 6.18.53 | d9c537b14f49 |
| 2.6.28 | 7.2.7 | 0eb9dd4774af |
| 2.6.28 | 7.3 | 71c610aeb177 |
Debian advisories
| Advisory | Date | Shipped to | Debian |
|---|---|---|---|
| DLA-4841-1 | 2026-10-17 | bookworm 6.1.190-1 | tracker |
| DLA-4817-1 | 2026-10-04 | bookworm 6.12.111-1~deb12u1 | tracker |
| DSA-6528-1 | 2026-09-29 | trixie 6.12.111-1 | 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
- The bad data is written by a local process. It maps the us122l hwdep read buffer PROT_READ via usb_stream_hwdep_mmap(), upgrades it with mprotect() because VM_MAYWRITE was never cleared, and overwrites usb_stream.read_size. No remote protocol or USB packet carries the malicious value.
- AC:HAttack complexity, high
- The driver only binds, and only creates /dev/snd/hwC*D*, when a TASCAM US-122L/US-144 is attached. A local attacker can't produce that hardware without physical access. Once it is present, mmap, mprotect, a read_size overwrite and mremap are fully deterministic.
- PR:LPrivileges required, low
- The attacker needs an O_RDWR open of the hwdep node, which a normal user gets through audio group or seat uaccess ACLs. usb_stream_hwdep_open() and usb_stream_hwdep_ioctl() do no capability checks, and the stream already exists from probe.
- UI:NUser interaction, none
- The attacker's own process does the open, mmap, mprotect, write to read_size, mremap and page faults. No other user has to act.
- S:UScope, unchanged
- The result is corrupted kernel memory and local privilege escalation within the same kernel authority. No VM or hardware isolation boundary is crossed.
- C:HConfidentiality impact, high
- With an inflated read_size, usb_stream_hwdep_vm_fault() maps virt_to_page((char *)s + offset) for offsets past the alloc_pages_exact() buffer. Userspace can then directly read arbitrary adjacent kernel pages.
- I:HIntegrity impact, high
- Those out-of-bounds pages are mapped writable into userspace, giving direct write access to kernel memory. In addition, usb_stream_free() calls free_pages_exact(s, read_size) with the tampered size, freeing pages that are still in use, a page-level use-after-free.
- A:HAvailability impact, high
- Writing to foreign kernel pages, or freeing the wrong pages through usb_stream_free() on SET_PARAMS re-init or disconnect, corrupts the page allocator and kernel data, which leads to an oops or panic.