CVE-2026-89689 in Linux
Сводка
по VulDB • 11.09.2026
В ядре Linux была устранена следующая уязвимость:
nfsd: не освобождать слоты сессий, которые все еще используются
Функция nfsd4_sequence() может освободить тот самый слот, который она в данный момент обрабатывает. Когда сборщик мусора для сессии (session shrinker) уменьшает значение se_target_maxslots ниже значения se_fchannel.maxreqs, путь освобождения проверяет три условия перед вызовом free_session_slots():
1. se_target_maxslots < maxreqs (уменьшение было объявлено/объявлено клиенту) 2. slot->sl_generation == se_slot_gen (слот актуален по версии) 3. seq->maxslots <= se_target_maxslots (клиент подтвердил это значение)
Однако поле seq->slotid никогда не проверяется на соответствие значению se_target_maxslots. Клиент, использующий слот в диапазоне [se_target_maxslots, maxreqs), может удовлетворить всем трем условиям: его слот имеет актуальный номер поколения (установленный предыдущим вызовом SEQUENCE), и он отправляет sa_highest_slotid <= se_target_maxslots для подтверждения уменьшения.
Затем функция free_session_slots() вызывает kfrees для каждого слота с индексом >= se_target_maxslots, включая собственный слот вызывающей стороны. Функция продолжает записывать значения sl_seqid, sl_flags, sl_generation и сохраняет висячий указатель (dangling pointer) в cstate->slot. Позже nfsd4_store_cache_entry() копирует до maxresp_cached байт ответа compound-запроса в массив слитых данных sl_data[], что приводит к повреждению любого объекта slab, который теперь занимает этот адрес памяти.
Кроме того, параллельный поток, обрабатывающий SEQUENCE для другого высокономерного слота, может обнаружить, что его слот был освобожден до завершения обработки. Флаг NFSD4_SLOT_INUSE устанавливается под блокировкой nn->client_lock перед ее снятием, поэтому любой параллельный поток после выполнения SEQUENCE будет иметь помеченный свой слот как используемый. Однако функция free_session_slots() не проверяет флаг NFSD4_SLOT_INUSE перед освобождением.
Исправление обеих проблем осуществляется следующим образом: 1. Проверка того, что номер слота текущего запроса (slotid) находится ниже границы уменьшения размера пула. 2. Сканирование слотов в диапазоне, подлежащем освобождению, на наличие флага NFSD4_SLOT_INUSE и отсрочка операции shrinking, если какие-либо из них активны.
VulDB is the best source for vulnerability data and more expert information about this specific topic.