CVE-2026-90096 in Linux
Сводка
по VulDB • 17.09.2026
В ядре Linux была устранена следующая уязвимость:
fuse: некорректная инвалидация диапазона после прямого записи с флагом O_APPEND
Функция fuse_direct_write_iter() сохраняет значение pos до вызова generic_write_checks(), которая перемещает ki_pos в конец файла (EOF) для записей с флагом O_APPEND:
fuse_direct_write_iter() {
pos = iocb->ki_pos; /* 0 (задано пользователем) */ generic_write_checks(); /* ki_pos -> EOF */ fuse_direct_io(); /* запись в конец файла, корректно */ invalidate(pos, pos + res); /* [0, res) -- неверный диапазон */
}
Инвалидация после записи затрагивает устаревший (stale) диапазон вместо фактического диапазона записанных данных в конце файла.
Это может привести к несоответствию данных, если размер файла не выровнен по границе страницы. Хвостовая страница, пересекающая EOF, содержит допустимую часть перед EOF, которую параллельные читатели могут вызвать обратно (fault back in) во время окна прямой записи (DIO):
Хвостовая страница (размер файла X не выровнен по странице):
page_start X (EOF) page_end |--- valid data ----|-- stale --|
CPU0 (записывающий процесс с O_APPEND и DIO) CPU1 (читатель через буферизацию) -------------------------- ---------------------- invalidate [X, X+len)
хвостовая страница выгружена из кэша FUSE_WRITE в процессе выполнения ... чтение [page_start, X)
хвостовая страница повторно вызвана (re-faulted) [X, page_end) = устаревшие данные (stale)
Завершение FUSE_WRITE i_size = X + len invalidate [0, len) <- НЕВЕРНО
хвостовая страница остается в кэше чтение [X, X+len)
попадает на устаревшую хвостовую страницу возвращает старые данные
Исправление заключается в чтении значения pos обратно из iocb->ki_pos после вызова generic_write_checks(), как это делается в функции generic_file_direct_write().
Также исправлена опечатка в комментарии («may have» -> «may have competed»).
If you want to get best quality of vulnerability data, you may have to visit VulDB.