CVE-2026-80970 in Linux
摘要
由 VulDB • 2026-09-12
在 Linux 内核中,已修复以下漏洞:
ALSA: FCP:不要复制未初始化的初始化响应
`fcp_ioctl_init()` 使用 `kmalloc()` 分配其响应缓冲区,并将整个缓冲区复制回用户空间:
```c buf_size = init.step0_resp_size + init.step2_resp_size;
void *resp __free(kfree) = kmalloc(buf_size, GFP_KERNEL); ... if (copy_to_user(arg->resp, resp, buf_size)) return -EFAULT; ```
缓冲区未被清零,其前 `step0_resp_size` 字节的唯一写入者是 step-0 控制传输:
```c err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), FCP_USB_REQ_STEP0, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, 0, private->bInterfaceNumber, step0_resp, private->step0_resp_size); if (err < 0) return err; ```
`usb_fill_control_urb()` 未设置 `URB_SHORT_NOT_OK`,因此短数据阶段或零长度数据阶段的完成状态为 0,且 `snd_usb_ctl_msg()` 返回较小的实际长度。唯一的检查是 `err < 0`,因此短传输被视为成功。
`snd_usb_ctl_msg()` 无条件地复制完整大小:
```c buf = kmemdup(data, size, GFP_KERNEL); ... memcpy(data, buf, size); ```
设备从未写入的字节因此未经更改地被恢复并复制到用户空间。`step0_resp_size` 和 `step2_resp_size` 仅被验证为 1..255,因此调用方还选择了 slab 缓存,从 `kmalloc-8` 到 `kmalloc-512`。
在 7.2.0-rc5 (arm64) 上,设备以零长度数据阶段响应 step 0,s0 = s2 = 255:
``` # init_on_alloc off, no spray step0 window [0,255): nonzero=94/255
000: 00 80 60 06 00 00 ff ff 18 00 00 00 57 01 ea 01 010: 08 78 22 13 00 00 ff ff a8 c4 5f 80 00 80 ff ff
# same kernel, kmalloc-512 pre-seeded with an 8-byte tag step0 window [0,255): nonzero=219/255 tagbytes=232
# identical run, init_on_alloc=1 step0 window [0,255): nonzero=0/255 tagbytes=0
# all three runs step2 window [255,510): device words matched=62/62
```
`a8 c4 5f 80 00 80 ff ff` 是小端序的内核文本地址 `ffff8000805fc4a8`。step-2 窗口不受影响,因此泄露的内容恰好是 step-0 区域。
将缓冲区清零,并要求 step-0 传输交付完整的 `step0_resp_size` 字节,以便将短数据阶段报告为错误。
由 XBOW 发现,Baul Lee <[email protected]> 进行分类处理
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.