CVE-2026-98312: ALSA: 6fire: fix OOB write from device-reported iso length
ALSA: 6fire: fix OOB write from device-reported iso length
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 6.6.158.1-1 - Upgrade
Upgrade
debian/linuxto a version that resolves this vulnerability.Fixed in 6.1.190-1Fixed in 6.12.115-2Fixed in 7.2.12-1Fixed in 7.2.15-1 - Upgrade
Upgrade
debian/linux-6.12to a version that resolves this vulnerability.Fixed in 6.12.113-1~deb12u1 - Upgrade
Upgrade
ubuntu/linux-hwe-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-42.42~24.04.1 - Upgrade
Upgrade
ubuntu/linux-riscv-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-42.42.1~24.04.1 - Upgrade
Upgrade
ubuntu/linuxto a version that resolves this vulnerability.Fixed in 7.0.0-42.42 - Upgrade
Upgrade
ubuntu/linux-awsto a version that resolves this vulnerability.Fixed in 7.0.0-1016.17 - Upgrade
Upgrade
ubuntu/linux-gcpto a version that resolves this vulnerability.Fixed in 7.0.0-1016.18 - Upgrade
Upgrade
ubuntu/linux-ibmto a version that resolves this vulnerability.Fixed in 7.0.0-1017.17 - Upgrade
Upgrade
ubuntu/linux-oem-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-1017.17 - Upgrade
Upgrade
ubuntu/linux-oracleto a version that resolves this vulnerability.Fixed in 7.0.0-1015.16 - Upgrade
Upgrade
ubuntu/linux-riscvto a version that resolves this vulnerability.Fixed in 7.0.0-42.42.1 - Upgrade
Upgrade
linux/Kernelto a version that resolves this vulnerability.Fixed in 6.1.189 - Upgrade
Upgrade
linux/Kernelto a version that resolves this vulnerability.Fixed in 6.6.158 - Upgrade
Upgrade
linux/Kernelto a version that resolves this vulnerability.Fixed in 6.12.112 - Upgrade
Upgrade
linux/Kernelto a version that resolves this vulnerability.Fixed in 6.18.54 - Upgrade
Upgrade
linux/Kernelto a version that resolves this vulnerability.Fixed in 7.2.8 - Compensating control
In ALSA 6fire's usb6fire_pcm_in_urb_handler(), reject or safely handle packets with actual_length < 4 before subtracting 4, and limit the calculated frame count so the resulting total_length fits within rt->out_packet_size and the 4832-byte out_urb->buffer, while keeping each packet length aligned to a whole output frame.
Event History
Frequently Asked Questions
What conditions can cause the out-of-bounds write?
A successfully completed incoming isochronous packet with an actual length below 4 bytes can cause unsigned arithmetic to wrap before the outgoing packet size is calculated. Zero-length isochronous packets are valid on USB, and the handler previously rejected only packets with a non-zero completion status.
Can this occur without the integer-wrap condition?
Yes. At 88.2 kHz or 96 kHz, scaling from four input channels to six output channels can turn a 420-byte input packet into a 628-byte output packet. Across eight packets, this reaches 5024 bytes, exceeding the 4832-byte outgoing buffer.
Why does USB descriptor validation not prevent the memory corruption?
The outgoing buffer is cleared with memset() and populated with playback PCM data before usb_submit_urb() validates the descriptor length. The out-of-bounds operations therefore occur before the USB layer rejects an over-long descriptor.
What does the fix need to enforce?
The packet handler must reject or guard successful packets whose reported length is below 4 bytes before subtracting 4. It must also limit the calculated frame count to the size supported by the OUT endpoint's wMaxPacketSize.