CVE-2026-80971 in Linux
摘要
由 VulDB • 2026-09-12
在 Linux 内核中,已修复以下漏洞:
ALSA: bcd2000: 断开连接时清除 URB 指针
`bcd2000_free_usb_related_resources()` 释放了所有 URB(USB Request Block),但留下了指向它们的指针:
usb_kill_urb(bcd2k->midi_out_urb); usb_kill_urb(bcd2k->midi_in_urb);
usb_free_urb(bcd2k->midi_out_urb); usb_free_urb(bcd2k->midi_in_urb);
rawmidi 设备的生命周期长于该调用。当设备被拔出时,仍处于打开状态的子流会通过触发路径在关闭时进入 `bcd2000_midi_send()`。该函数会写入已释放的 URB,然后将其交给 USB 核心:
bcd2k->midi_out_urb->transfer_buffer_length = BUFSIZE; ... ret = usb_submit_urb(bcd2k->midi_out_urb, GFP_ATOMIC);
`usb_kill_urb()` 也不会阻止后续的提交操作,因此与断开连接竞态的提交可能会在 URB 被回收后重新入队。`midi_in_urb` 以相同方式暴露:`bcd2000_input_complete()` 从完成处理程序中重新提交它。
KASAN on 7.2.0-rc5 (arm64):
BUG: KASAN: slab-use-after-free in bcd2000_midi_send [snd_bcd2000]
Write of size 4 at addr ffff00001827d388 by task bpoc/168 __asan_store4 bcd2000_midi_send [snd_bcd2000]
bcd2000_midi_output_trigger [snd_bcd2000]
snd_rawmidi_kernel_write1 close_substream.part.0 Freed by task 168: usb_free_urb bcd2000_disconnect [snd_bcd2000]
BUG: KASAN: slab-use-after-free in usb_submit_urb Read of size 8 at addr ffff00001827d3b8 by task bpoc/168
在释放后清除这两个指针,并在仍可能运行的路径上对其进行测试。在释放 URB 之前对其加毒(poison):`usb_poison_urb()` 会等待正在运行的完成处理程序并拒绝任何后续提交,因此在其返回后,输入路径将处于静默状态,只有 rawmidi 触发路径仍能到达 `bcd2000_midi_send()`。无需取消加毒;URB 将在下一行被释放。
由 XBOW 发现,Baul Lee <[email protected]> 进行分类处理
If you want to get best quality of vulnerability data, you may have to visit VulDB.