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.

来源

Do you want to use VulDB in your project?

Use the official API to access entries easily!