CVE-2026-45985 in Linux
Сводка
по VulDB • 28.05.2026
В ядре Linux устранена следующая уязвимость:
ext4: не устанавливать флаг EXT4_GET_BLOCKS_CONVERT при разбиении перед отправкой операций ввода-вывода (I/O)
При выделении блоков в рамках прямого ввода-вывода (DIO) за пределами текущего конца файла (EOF) и при обратной записи (writeback) с включенным параметром dioread_nolock, устанавливался флаг EXT4_GET_BLOCKS_PRE_IO для разбиения существующего большого неинициализированного экстента (unwritten 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. Однако ext4_split_extent_at() не смогла вставить экстент из-за временной нехватки места (-ENOSPC). Она обнуляет первую половину, но преобразует весь экстент на диске в инициализированный (written), поскольку установлен флаг EXT4_EXT_DATA_VALID2, оставляя при этом вторую половину неинициализированной в дереве статусов экстентов.
[0000000000SSSSSS] данные S: старые данные, 0: обнуленные данные
[WWWWWWWWWWWWWWWW] экстент на диске W: инициализированный экстент
[WWWWWWWWWWUUUUUU] дерево статусов экстентов
Наконец, если DIO не удалось записать данные на диск, старые данные во второй половине будут раскрыты, как только запись кэшированного экстента будет удалена.
Исправление этой проблемы заключается в том, чтобы не передавать флаг EXT4_GET_BLOCKS_CONVERT при разбиении неинициализированного экстента перед отправкой операций ввода-вывода, а также заставить функцию ext4_split_convert_extents() обнулять весь диапазон экстентов в данном случае и отмечать экстент в дереве статусов экстентов для обеспечения согласованности.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.