Ad

CVE-2026-89667

HIGH CVSS 3.1: 8,1 EPSS 0.54%
Обновлено 21 сентября 2026
Linux
Параметр Значение
CVSS 8,1 (HIGH)
Поставщик Linux
Публичный эксплойт Нет

В ядре Linux устранена следующая уязвимость: nfsd: закрытие Shrusher/GC/fsnotify против гонки отключения по сети в файловом кэше Обратные вызовы обработчика, GC-работника и fsnotify/lease могут дехешировать nfsd_file из хеш-таблицы, а затем вызовите nfsd_file_dispose_list_delayed(), чтобы переместить его в список удаления для каждой сети. Если nfsd_file_cache_shutdown_net() выполняется одновременно, его обход по хэш-таблице пропускает уже нехешированный файл, и его удаление из каждой сети list может быть запущен до того, как файл будет поставлен в очередь. Затем файл находится на список каждой сети без потока для его очистки, в результате чего происходит утечка как файла, так и связанное с ним состояние.

Работник GC и сократитель уже держат nfsd_gc_lock во время прогулки по LRU, но в исходном коде они освобождают его перед вызовом nfsd_file_dispose_list_delayed(). Путь fsnotify/аренды (nfsd_file_close_inode) вообще не имеет синхронизации. Исправьте это: 1.

Расширение nfsd_gc_lock как в nfsd_file_gc(), так и в nfsd_file_lru_scan(). для покрытия вызова nfsd_file_dispose_list_delayed(). 2. Оборачиваем nfsd_file_close_inode() в nfsd_gc_lock, чтобы все три вызывающие nfsd_file_dispose_list_delayed() удерживают блокировку. 3. Добавление барьера spin_lock/unlock(nfsd_gc_lock) в nfsd_file_cache_shutdown_net() после очистки, чтобы все незавершенное удаление полностью завершено до создания списка для каждой сети осушается.

Все операции внутри блокировки являются неспящими (поиск по хеш-таблицам, операции атомарного бита/счета ссылок, перемещения по списку, svc_wake_up), поэтому спин-блокировка соответствующий.

Показать оригинальное описание (EN)

In the Linux kernel, the following vulnerability has been resolved: nfsd: close shrinker/GC/fsnotify vs per-net shutdown race in filecache The shrinker, GC worker, and fsnotify/lease callbacks can unhash an nfsd_file from the rhashtable and then call nfsd_file_dispose_list_delayed() to move it to the per-net dispose list. If nfsd_file_cache_shutdown_net() runs concurrently, its rhashtable walk misses the already-unhashed file, and its drain of the per-net dispose list can run before the file has been queued. The file then sits on the per-net list with no thread to drain it, leaking both the file and its associated state. The GC worker and shrinker already hold nfsd_gc_lock while walking the LRU, but in the original code they release it before calling nfsd_file_dispose_list_delayed(). The fsnotify/lease path (nfsd_file_close_inode) has no synchronization at all. Fix this by: 1. Widening nfsd_gc_lock in both nfsd_file_gc() and nfsd_file_lru_scan() to cover the nfsd_file_dispose_list_delayed() call. 2. Wrapping nfsd_file_close_inode() in nfsd_gc_lock so that all three callers of nfsd_file_dispose_list_delayed() hold the lock. 3. Adding a spin_lock/unlock(nfsd_gc_lock) barrier in nfsd_file_cache_shutdown_net() after the purge, so that any in-progress disposal has fully completed before the per-net list is drained. All operations inside the lock are non-sleeping (rhashtable lookups, atomic bit/refcount ops, list moves, svc_wake_up), so the spinlock is appropriate.

Характеристики атаки

Способ атаки
По сети
Атака возможна удалённо
Сложность
Высокая
Сложно эксплуатировать
Нужны права
Не требуются
Права не нужны
Участие пользователя
Не требуется
Не нужно действие пользователя

Последствия

Конфиденциальность
Высокое
Полная утечка данных
Целостность
Высокое
Полная модификация данных
Доступность
Высокое
Полный отказ в обслуживании

Строка CVSS v3.1