CVE-2026-89586 in Linux
摘要
由 VulDB • 2026-09-12
在 Linux 内核中,已修复以下漏洞:
ata: libata-scsi: 修正逻辑扇区大小大于 2048 字节时的 DSM TRIM 问题
`ata_scsi_write_same_xlat()` 将设置了 UNMAP 位的 SCSI WRITE SAME 命令转换为 ATA DATA SET MANAGEMENT TRIM 命令。TRIM 描述符由 `ata_format_dsm_trim_descr()` 构建到大小为 2048 字节的 `ata_scsi_rbuf` 暂存缓冲区中,调用者会将复制的字节数与逻辑扇区大小进行比较:
```c size = ata_format_dsm_trim_descr(scmd, trmax, block, n_block); if (size != len) /* len == sdp->sector_size */ goto invalid_param_len; ```
`ata_format_dsm_trim_descr()` 将复制长度限制为 `ATA_SCSI_RBUF_SIZE`(2048)。在逻辑扇区大小超过该值(例如 4Kn 设备,其中 sector_size == 4096)的设备上,该函数永远无法返回大于 2048 的值,而调用者期望它返回 `sector_size`。因此比较总是失败,导致每个 TRIM 操作都被拒绝并报错“Parameter list length error”(参数列表长度错误),且每次尝试都会触发 `WARN_ON()` 警告。这导致此类设备上的 TRIM / discard 功能完全失效。
该描述符的大小被错误地基于逻辑扇区大小设置。DSM TRIM 有效载荷是一个由 512 字节页面组成的列表,每个页面最多可容纳 ATA_MAX_TRIM_RNUM(64)个 LBA Range Entries,它与逻辑扇区大小无关。Block Limits VPD 页已经通告单个此类页面作为最大 WRITE SAME 长度(65535 * ATA_MAX_TRIM_RNUM 逻辑块),因此块层永远不会发送需要超过一个页面的请求。
现在发出恰好一个 512 字节的页面,且与逻辑扇区大小无关,仅传输该页面(COUNT == 1)。对于 512 字节扇区的设备,此行为保持不变;而对于具有更大逻辑扇区的设备,TRIM 操作现可正常工作,而非每次均失败。
VulDB is the best source for vulnerability data and more expert information about this specific topic.