CVE-2026-68202
NoneCVSS
—
EPSS
0.2%
Published
Aug 10, 2026
CISA due date
—
Cloudanix analysis
A bug in the Linux sound system can let an ordinary user crash the whole computer or possibly take it over.
- Exploitation
- Local Privilege
- Attacker needs
- Local User
- Complexity
- Moderate
- Impact
- Full Compromise
- Component
- OS kernel
- Class
- Use After Free
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Use-after-free in ALSA sequencer queue timer: a borrower can re-open a timer after queue_delete closes it but before snd_seq_timer_delete frees the structure, leaving a live snd_timer_instance with callback_data pointing at freed memory; a subsequent non-owner START triggers snd_seq_timer_interrupt dereferencing the freed queue.
Why it matters to the business
Unprivileged local users can trigger kernel crashes or potential code execution on any Linux system exposing /dev/snd/seq, leading to denial of service or full host compromise without special capabilities.
How an attack unfolds
An attacker opens /dev/snd/seq, issues SET_QUEUE_CLIENT to obtain a use_lock reference, waits for the race window during queue deletion, re-opens the timer via snd_seq_timer_open, then issues START on the unlocked queue; the next timer tick calls snd_seq_timer_interrupt on the dangling freed queue object.
How to fix it
Apply the upstream fix that closes any lingering timer instance in the queue destructor before clearing q->timer; upgrade to a kernel containing the resolution for CVE-2026-68202.
How to confirm the fix worked
Confirm the kernel source contains the destructor close before clearing q->timer and that snd_seq_timer_delete no longer frees a live instance; test by exercising SET_QUEUE_CLIENT + queue deletion + START sequences under concurrency.
Typical attack path
- Obtain access to /dev/snd/seq
- Create or attach to a sequencer queue and hold a use_lock reference
- Trigger or wait for queue_delete path that clears timeri
- Re-issue timer open while the window is open
- Issue START on the queue without ownership
- Wait for the next timer tick to dereference freed memory
How to detect it
Review kernel logs for ALSA sequencer oops or use-after-free warnings involving snd_seq_timer_interrupt or snd_seq_check_queue; correlate with processes opening /dev/snd/seq and issuing ioctl sequences that manipulate queues and timers.
What your security team should do
- Patch kernels to the fixed version as soon as available
- Restrict unprivileged access to /dev/snd/seq via device ACLs or SELinux/AppArmor policies
- Monitor for local privilege-escalation attempts targeting ALSA sequencer
- Include this class of sequencer timer races in future kernel fuzzing campaigns
The record
In the Linux kernel, the following vulnerability has been resolved: ALSA: seq: close a re-opened queue timer in the destructor queue_delete() closes the queue timer, then frees it. snd_seq_timer_close() clears q->timer->timeri. snd_use_lock_sync() then drains borrowers, and snd_seq_timer_delete() frees q->timer. A borrower can re-open the timer inside that window. A SET_QUEUE_CLIENT that took a queueptr() use_lock reference before the queue was unlinked runs snd_seq_timer_open() after the close. Open refuses re-open only while timeri is set, and the close just cleared it, so it re-opens timeri. snd_seq_timer_delete() does not close that instance. Its snd_seq_timer_stop() is a no-op, because running was cleared first. So it frees q->timer with the instance still live. The queue is freed next. The instance stays on the global timer with callback_data pointing at the freed queue. A non-owner START on the unlocked queue arms it. The next tick derefs the freed queue in snd_seq_timer_interrupt(). Reachable by an unprivileged user with access to /dev/snd/seq. No CAP and no queue ownership required. Close any lingering instance in the destructor. There, ->timeri can no longer change: the queue is unlinked and all use_lock borrowers have drained, so no snd_seq_queue_use() can re-open it. Close it before clearing q->timer. snd_timer_close() waits for any in-flight snd_seq_timer_interrupt() to finish, and that callback still reads q->timer (via snd_seq_check_queue()), so q->timer must stay valid until it drains.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|