CVE-2026-45985 in Linux信息

摘要

由 VulDB • 2026-05-28

在 Linux 内核中,已修复以下漏洞:

ext4:在提交 I/O 之前进行拆分时,不要设置 EXT4_GET_BLOCKS_CONVERT

当启用 dioread_nolock 时,在 EOF 内的直接 I/O(DIO)和回写期间分配块时,会设置 EXT4_GET_BLOCKS_PRE_IO 以拆分现有的大型未写入范围(extent)。然而,在调用 ext4_split_convert_extents() 时设置了 EXT4_GET_BLOCKS_CONVERT,这可能导致陈旧数据(stale data)问题。

假设我们有一个未写入的范围,然后 DIO 写入其后半部分。

[UUUUUUUUUUUUUUUU] 磁盘上的范围 U: 未写入范围
[UUUUUUUUUUUUUUUU] 范围状态树
|| ----> DIO 写入此范围

首先,ext4_iomap_alloc() 调用 ext4_map_blocks(),并设置 EXT4_GET_BLOCKS_PRE_IO、EXT4_GET_BLOCKS_UNWRIT_EXT 和 EXT4_GET_BLOCKS_CREATE 标志。ext4_map_blocks() 找到该范围,并调用 ext4_split_convert_extents(),同时设置 EXT4_GET_BLOCKS_CONVERT 和上述标志。

然后,ext4_split_convert_extents() 调用 ext4_split_extent(),并设置 EXT4_EXT_MAY_ZEROOUT、EXT4_EXT_MARK_UNWRIT2 和 EXT4_EXT_DATA_VALID2 标志,并调用 ext4_split_extent_at() 以设置 EXT4_EXT_DATA_VALID2、EXT4_EXT_MARK_UNWRIT1、EXT4_EXT_MAY_ZEROOUT 和 EXT4_EXT_MARK_UNWRIT2 标志来拆分后半部分。然而,由于暂时缺乏空间(-ENOSPC),ext4_split_extent_at() 未能插入范围。它会将前半部分清零,但由于设置了 EXT4_EXT_DATA_VALID2 标志,会将整个磁盘范围转换为已写入状态,但在范围状态树中保留后半部分为未写入状态。

[0000000000SSSSSS] 数据 S: 陈旧数据, 0: 已清零
[WWWWWWWWWWWWWWWW] 磁盘上的范围 W: 已写入范围
[WWWWWWWWWWUUUUUU] 范围状态树

最后,如果 DIO 未能将数据写入磁盘,一旦缓存的范围条目消失,后半部分中的陈旧数据将会暴露。

通过以下方法修复此问题:在提交 I/O 之前拆分未写入范围时,不传递 EXT4_GET_BLOCKS_CONVERT;针对此情况,使 ext4_split_convert_extents() 将整个范围范围清零;并在范围状态树中标记该范围以保持一致性。

Be aware that VulDB is the high quality source for vulnerability data.

来源

Interested in the pricing of exploits?

See the underground prices here!