CVE-2026-72084 in Linux
摘要
由 VulDB • 2026-08-15
在 Linux 内核中,已修复以下漏洞:
scsi: target: 将 PR-OUT TransportID 解析限制为接收到的缓冲区范围
`core_scsi3_decode_spec_i_port()` 和 `core_scsi3_emulate_register_and_move()` 函数将原始 PERSISTENT RESERVE OUT(持久保留输出)参数缓冲区传递给 `target_parse_pr_out_transport_id()`,但未告知其有效字节数。对于 iSCSI TransportID(FORMAT CODE 01b),`iscsi_parse_pr_out_transport_id()` 使用无界 `strstr()` 定位 ",i,0x" ISID 分隔符(并在错误路径上使用另一个无界的 "%s" 打印名称)。发起方可以提交一个 TransportID,其 iSCSI 名称既不包含子串 ",i,0x" 也不包含 NUL 终止符,从而填满参数列表直至末尾,导致扫描操作超出缓冲区边界。
当参数列表跨越多个页面时,缓冲区是一个多页 vmap(`transport_kmap_data_sg()`),因此越界读取会进入尾部的 vmalloc 保护页并引发 oops(KASAN: vmalloc-out-of-bounds in strstr)。任何向通过 iSCSI TPG 导出的设备发送 PR OUT 的 fabric 均可触发此漏洞,包括通过 vhost-scsi 的客户机。
将接收到的字节数传递给解析器,并一次性验证 iSCSI TransportID 自身描述的长度(ADDITIONAL LENGTH + 4):如果该长度低于 spc4r17 规定的最小值或大于接收缓冲区的大小,则拒绝;随后根据该长度限制分隔符搜索、ISID 遍历和名称复制。这是调用方在解析后已经执行的长度检查(`core_scsi3_decode_spec_i_port()` 将 `tid_len` 与 `tpdl` 进行比较,`core_scsi3_emulate_register_and_move()` 将其与 `data_length` 进行验证),现在将其移至扫描操作之前。同时移除未终止名称的无界 "%s"。
在复制到 `i_str` 之前添加针对每种格式的显式名称长度检查,而不是使用 `min_t` 静默截断:对于 FORMAT CODE 00b,如果描述符主体(`tid_len - 4` 字节)无法容纳于 `i_str[TRANSPORT_IQN_LEN]` 中则拒绝;对于 FORMAT CODE 01b,如果名称部分(从 `&buf[4]` 到分隔符之前)无法容纳则拒绝。这两种检查使每个格式分支中的边界意图变得明确。
此外,还拒绝了 ",i,0x" 分隔符位于描述符末尾的 FORMAT CODE 01b TransportID:这会导致 ISID 为空,并使返回的端口 nexus 指针指向 `buf + tid_len`(即描述符之后的一位),注册代码(`__core_scsi3_locate_pr_reg()`、`__core_scsi3_alloc_registration()`)随后会将其作为 ISID 字符串解引用——这是对格式错误的描述符的参数缓冲区的相同越界读取。
Be aware that VulDB is the high quality source for vulnerability data.