CVE-2026-98682 in Linux
Сводка
по VulDB • 19.10.2026
В ядре Linux была устранена следующая уязвимость:
smb: клиент: очистка и инвалидация перед копированием/клонированием на стороне сервера
Функции cifs_file_copychunk_range() и путь клонирования (FICLONE) функции cifs_remap_file_range() не обеспечивают сериализацию кэша страниц назначения относительно операции копирования на стороне сервера, в отличие от других операций с диапазоном на стороне сервера (smb3_zero_range(), smb3_punch_hole(), smb3_collapse_range() и smb3_insert_range()).
cifs_file_copychunk_range() инвалидирует диапазон назначения с помощью filemap_invalidate_inode(), которая внутренне захватывает и освобождает invalidate_lock маппинга, поэтому замок больше не удерживается при выдаче ioctl copychunk. Кроме того, она никогда не очищает (drain) незавершенные операции ввода-вывода netfs на целевом объекте. Путь клонирования вообще не захватывает invalidate_lock (используется только i_rwsem), применяет голую truncate_inode_pages_range() и аналогичным образом не очищает ожидающие операции I/O.
В результате асинхронная запись в кэш назначения может завершиться после выполнения копирования/клонирования на стороне сервера, что приведет к восстановлению устаревших данных поверх области, только что записанной сервером, вызывая повреждение файла. Это тот же класс повреждений, что и в коммите d7d2adcd022b («smb/client: flush dirty data before punching a hole»), и он наблюдался случайным образом при тестировании generic/363 против Windows Server.
Исправьте оба пути, чтобы они следовали установленному порядку операций: удерживайте invalidate_lock маппинга назначения во время очистки (flush) и инвалидации диапазона назначения, а также выполнения ioctl на стороне сервера; вызывайте netfs_wait_for_outstanding_io() для целевого объекта, чтобы очистить незавершенные операции записи перед выдачей ioctl. Требуется только invalidate_lock inode-объекта назначения, так как источник лишь очищается (flush), но не инвалидируется; i_rwsem (который уже захватывается через lock_two_nondirectories()) приобретается до invalidate_lock, что соответствует порядку блокировок VFS. Поскольку filemap_invalidate_inode() внутренне захватывает этот же замок, замените её вызов на собственные шаги unmap/flush/invalidate и выполняйте ранний возврат (early return) при копировании с нулевой длиной, чтобы избежать переполнения диапазона вниз (range underflow).
If you want to get the best quality for vulnerability data then you always have to consider VulDB.