In the Linux kernel, the following vulnerability has been resolved:
media: go7007: defer the ALSA v4l2 put until card release
go7007_snd_init() already takes a v4l2_device reference for the ALSA
side, but go7007_snd_remove() drops it immediately after calling
snd_card_free_when_closed().
That is too early when a userspace process still has the capture PCM open.
The ALSA card and its PCM callbacks remain alive until the last file is
closed, so the release path can still reach struct go7007 through
pcm->private_data and call go7007_snd_hw_free() after the V4L2 release path
has freed the object.
Move the matching v4l2_device_put() to the ALSA card private_free callback
so the existing ALSA reference covers the whole deferred card lifetime.
CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 7.8
AV:L - The UAF is reached locally by holding the go7007 ALSA capture PCM open, forcing go7007_usb_disconnect() via USBDEVFS_DISCONNECT or sysfs unbind, then closing the PCM; there is no network path. Physical unplug is only an extra path, matching USB disconnect UAF scores (CVE-2026-80971, CVE-2025-40283).
AC:L - The attacker fully controls the sequence: open the capture PCM, disconnect the already-bound device, then close. go7007_snd_remove() drops the ALSA v4l2 ref before snd_card_free_when_closed() finishes, so close deterministically hits hw_free/capture_close on the freed go7007 with no attacker-uncontrollable race.
PR:L - Opening /dev/snd/pcmCDc has no capability check (audio group or seat/udev ACL), and USBDEVFS_DISCONNECT has no capable() gate, only write access to /dev/bus/usb that plugdev/uaccess grants seat users. Init-namespace root is not required.
UI:N - The attacker performs PCM open, disconnect, and close on their own fds against an already-attached go7007 capture device (kiosk, industrial encoder, or shared workstation). No separate victim action such as plugging a cable or mounting a filesystem is required.
S:U - The slab use-after-free of struct go7007 and the later ALSA PCM/card teardown run entirely in the host kernel. This is ordinary local privilege escalation, not a VM, IOMMU, or sandbox boundary escape.
C:H - Per kernel UAF guidance confidentiality is High. After kfree(go), PCM close reads the dangling object (snd_pcm_substream_chip → go->snd_context and related fields); reclaiming that slab lets the attacker supply pointer-rich state and obtain a kernel disclosure primitive.
I:H - go7007_snd_hw_free() writes audio_deliver on the freed go7007, capture_close() writes through go->snd_context, and go7007_snd_free() kfree()s that pointer. A reclaimed object yields write-after-free and arbitrary-free primitives suitable for control-flow hijack.
A:H - Dereferencing the freed go7007 in PCM close/hw_free, and kfree of snd_context during deferred card free, reliably oopses or panics the kernel. The attacker can repeat disconnect/close to crash on demand, so availability impact is High.
| Attack Vector |
Local |
Scope |
Unchanged |
| Attack Complexity |
Low |
Confidentiality Impact |
High |
| Privileges Required |
Low |
Integrity Impact |
High |
| User Interaction |
None |
Availability Impact |
High |
AV:L - The UAF is reached locally by holding the go7007 ALSA capture PCM open, forcing go7007_usb_disconnect() via USBDEVFS_DISCONNECT or sysfs unbind, then closing the PCM; there is no network path. Physical unplug is only an extra path, matching USB disconnect UAF scores (CVE-2026-80971, CVE-2025-40283).
AC:L - The attacker fully controls the sequence: open the capture PCM, disconnect the already-bound device, then close. go7007_snd_remove() drops the ALSA v4l2 ref before snd_card_free_when_closed() finishes, so close deterministically hits hw_free/capture_close on the freed go7007 with no attacker-uncontrollable race.
PR:L - Opening /dev/snd/pcmCDc has no capability check (audio group or seat/udev ACL), and USBDEVFS_DISCONNECT has no capable() gate, only write access to /dev/bus/usb that plugdev/uaccess grants seat users. Init-namespace root is not required.
UI:N - The attacker performs PCM open, disconnect, and close on their own fds against an already-attached go7007 capture device (kiosk, industrial encoder, or shared workstation). No separate victim action such as plugging a cable or mounting a filesystem is required.
S:U - The slab use-after-free of struct go7007 and the later ALSA PCM/card teardown run entirely in the host kernel. This is ordinary local privilege escalation, not a VM, IOMMU, or sandbox boundary escape.
C:H - Per kernel UAF guidance confidentiality is High. After kfree(go), PCM close reads the dangling object (snd_pcm_substream_chip → go->snd_context and related fields); reclaiming that slab lets the attacker supply pointer-rich state and obtain a kernel disclosure primitive.
I:H - go7007_snd_hw_free() writes audio_deliver on the freed go7007, capture_close() writes through go->snd_context, and go7007_snd_free() kfree()s that pointer. A reclaimed object yields write-after-free and arbitrary-free primitives suitable for control-flow hijack.
A:H - Dereferencing the freed go7007 in PCM close/hw_free, and kfree of snd_context during deferred card free, reliably oopses or panics the kernel. The attacker can repeat disconnect/close to crash on demand, so availability impact is High.
CVSS 3.1