Уязвимость в ext4 позволяет вызвать ошибки ввода-вывода при гонке DIO и буферизованной записи (CVE-2026-92501)
В ядре Linux устранена уязвимость в файловой системе ext4, связанная с гонкой между прямым (DIO) и буферизованным вводом-выводом. Проблема приводит к ложным ошибкам -EIO при fsync и предупреждениям о невозможности инвалидации кэша страниц. Затрагивает системы на базе Linux с ext4, особенно с inode без extent-ов и нетривиальной конфигурацией блоков.
Подробности
Уязвимость затрагивает компонент ext4 ядра Linux. На inode без extent-ов прямая запись в «дыры» не может использовать невыделенные extent-ы: ext4_iomap_alloc() оставляет m_flags=0, а ext4_map_blocks() возвращает 0, из-за чего слой iomap возвращает -ENOTBLK и происходит откат к буферизованному вводу-выводу. В функции ext4_dio_write_iter() откат вызывает ext4_buffered_write_iter(), который помечает страницы как «грязные», после чего выполняются flush и инвалидация. Однако между возвратом из ext4_buffered_write_iter() (когда блокировка inode уже снята) и последующими flush+invalidate существует незащищённое окно. В это окно параллельные асинхронные завершения DIO из других потоков могут выполнить kiocb_invalidate_post_direct_write(). Если страницы успели повторно стать «грязными», пост-инвалидация обнаруживает их, выдаёт предупреждение и устанавливает -EIO в последовательности ошибок. Проблема воспроизводится не только при намеренно перекрывающихся DIO-записях из пользовательского пространства: например, generic/746 использует loop-устройство, где несколько kworker-ов обращаются к нижележащему файлу. Также гонка возникает при block_size < folio_size, когда неперекрывающиеся DIO-записи делят большую folio. Для исправления в ext4_buffered_write_iter() добавлен вызов inode_dio_wait() перед ext4_write_checks(): он дожидается завершения всех незавершённых DIO, гарантируя, что страницы очищены до отправки IO, BIO дождутся всех DIO, а ext4_write_checks() увидит корректный размер inode без гонки с ext4_block_zero_eof().Что делать
Рекомендуется обновить ядро Linux до версии, содержащей исправление данной уязвимости. Проверьте наличие патча в вашем дистрибутиве и каналах обновлений ядра. Если немедленное обновление невозможно, оцените конфигурацию: риск повышается при использовании ext4 на inode без extent-ов, loop-устройств с конкурентным вводом-выводом и при block_size меньше размера folio. В качестве временной меры можно ограничить сценарии конкурентных DIO-записей к одним и тем же файлам и внимательнее отслеживать ошибки -EIO и предупреждения об инвалидации кэша страниц в журналах. В долгосрочной перспективе — планировать обновление ядра и проверить корректность обработки ошибок ввода-вывода в приложениях. Итог: CVE-2026-92501 — состояние гонки в ext4, способное приводить к ложным ошибкам ввода-вывода и предупреждениям ядра. Исправление уже включено в основную ветку; приоритет — обновление ядра и контроль конфигураций с интенсивным конкурентным вводом-выводом.Источник: CVE Project (cvelistV5)
