Look up another CVE · open CVE-2026-98116 in the interactive tracker
CVE-2026-98116
ALSA: pcm: Serialize PCM mmap with buffer reallocation to fix page UAF
Published 2026-09-25 (24 days ago) by the Linux kernel CNA. Subsystem sound/core. Debian urgency: not yet assigned.
What to do, per Debian release
Debian's own status for CVE-2026-98116 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
snd_pcm_hw_params() and snd_pcm_hw_free() guard buffer reallocation with an mmap_count check performed under the PCM stream lock, but the lock is released long before the buffer is actually freed: snd_pcm_sync_stop(), constraint refinement and do_free_pages() all happen in between. snd_pcm_mmap_data(), on the other hand, takes no lock at all: it validates against the old buffer's state and dma_bytes, remaps its pages into the VMA, and only then increments mmap_count. A concurrent mmap() can therefore slip in between the check and the free. remap_pfn_range() installs writable PTEs for the old buffer's pages without taking page references, and the subsequent do_free_pages() returns those pages to the page allocator while the VMA still maps them. This leaves a stale, writable mapping of freed pages: a page-level use-after-free that can be leveraged for local privilege escalation. Make snd_pcm_mmap_data() participate in the buffer-access scheme introduced for hw_params/hw_free: acquire runtime->buffer_accessing before validating and remapping, and release it afterwards. Buffer reallocation already fails with -EBUSY while accessors are active, and the mmap side now fails with -EBUSY while a reallocation is in progress, so the validate/remap sequence and the check/free sequence can no longer interleave. A reproducer that turns this race into a stale writable mapping of the freed DMA buffer pages is available on request.
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/core/pcm_native.c
- What this is
- SOUNDMAINTAINERS section matched on sound/ · linux-sound@vger.kernel.org · Maintained
- Kernel module
- snd_pcm
Check it on the machine
grep -wE 'CONFIG_SND|CONFIG_SND_PCM' /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_pcmPrints 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.
- bookworm, trixie, forky, sid, bookworm · linux-6.12Mnot built on amd64/cloud-amd64, arm64/cloud-arm64
- M
- a module where it is built at all; some flavours do not build it
- Build switches
- CONFIG_SND, CONFIG_SND_PCM
- 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.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.13%, higher than 2.1% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- not yet assignedsource
- Subsystem
- sound/core
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 5.15.32 | 5.15.222 | e6cdd2a0470d |
| 5.18 | 6.1.189 | 9857a75714bb |
| 5.18 | 6.6.158 | cbadf2575d25 |
| 5.18 | 6.12.111 | cbc7ec97601d |
| 5.18 | 6.18.53 | fd137bf8149b |
| 5.18 | 7.2.7 | 8c1882dfee8f |
| 5.18 | 7.3 | 9b110a9dcecc |
| 4.14.279 | 0 | 0 |
| 4.19.243 | 0 | 0 |
| 5.4.193 | 0 | 0 |
| 5.10.109 | 0 | 0 |
| 5.16.18 | 0 | 0 |
| 5.17.1 | 0 | 0 |
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 bug is triggered by mmap() on a local /dev/snd/pcmC*D* file descriptor (snd_pcm_mmap -> snd_pcm_mmap_data) racing with SNDRV_PCM_IOCTL_HW_PARAMS/HW_FREE ioctls on the same fd. No remote protocol carries any of the inputs.
- AC:LAttack complexity, low
- One process controls both sides of the race: one thread calls mmap() and another calls hw_free/hw_params. The window runs from the mmap_count check under the stream lock through snd_pcm_sync_stop and refinement to do_free_pages, and the attacker can retry as often as needed.
- PR:LPrivileges required, low
- Opening the PCM device node takes ordinary local user access, either the audio group or the udev uaccess ACL given to the logged-in seat user. No capability is checked on the mmap or hw_params/hw_free paths.
- UI:NUser interaction, none
- The attacker opens the device, sets hw_params and races the mmap against hw_free entirely through their own syscalls. No other user has to do anything.
- S:UScope, unchanged
- This is a local kernel privilege escalation within the same kernel security authority. It crosses no VM or IOMMU boundary.
- C:HConfidentiality impact, high
- remap_pfn_range installs PTEs for the old DMA buffer pages without taking page references, and do_free_pages then frees them. The attacker keeps a direct mapping of whatever the page allocator reuses those pages for, such as page tables, cred or slab pages, and can read it.
- I:HIntegrity impact, high
- The stale mapping of the freed buffer pages is writable, which gives direct write access to reallocated kernel pages. This is a page-level UAF that enables privilege escalation, as the fix commit itself states.
- A:HAvailability impact, high
- Writing through the stale PTEs into pages that have been reallocated corrupts arbitrary kernel memory, which leads to oopses, panics or page-state BUGs.