Ad

CVE-2026-89660

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

В ядре Linux устранена следующая уязвимость: NFSD: запретить использование клиента после освобождения во время отзыва состояния администратора. Stateid содержит только пустой указатель на свой nfs4_client; государственный идентификатор ссылка не закрепляет его. Клиент выживает только потому, что __destroy_client() очищает свои состояния перед запуском free_client(). nfsd4_revoke_states() удаляет nn->client_lock через revoke_one_stid(), который разыменовывает клиента, чтобы отозвать идентификатор состояния и прочитать clp->cl_minorversion.

Разборка гонок за упавшим замком может освободить клиент прежде всего. Закрепление cl_rpc_users под client_lock блокирует DESTROY_CLIENTID и Разрушение EXCHANGE_ID, которое отклоняется, пока cl_rpc_users не равно нулю. Force_expire_client() игнорирует его: как только он дождется, пока cl_rpc_users достижение нуля пройдено, более поздний вывод остается незамеченным. В client_lock пропустить клиента, cl_time которого уже равно нулю — Force_expire_client() очищает его перед ожиданием - в противном случае закрепите cl_rpc_users перед снятием блокировки.

Тогда прогулка либо увидит истечения срока действия и пропусков или закреплений вовремя, чтобы дождаться, чтобы покрыть отзыв.

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

In the Linux kernel, the following vulnerability has been resolved: NFSD: Prevent client use-after-free during admin state revocation A stateid holds only a bare pointer to its nfs4_client; a stateid reference does not pin it. The client survives only because __destroy_client() drains its stateids before free_client() runs. nfsd4_revoke_states() drops nn->client_lock across revoke_one_stid(), which dereferences the client to revoke a stateid and read clp->cl_minorversion. A teardown racing the dropped lock can free the client first. Pinning cl_rpc_users under client_lock blocks the DESTROY_CLIENTID and EXCHANGE_ID teardown, which refuses while cl_rpc_users is non-zero. force_expire_client() ignores it: once its wait for cl_rpc_users to reach zero has passed, a later pin goes unnoticed. Under client_lock, skip a client whose cl_time is already zero -- force_expire_client() clears it there before waiting -- otherwise pin cl_rpc_users before dropping the lock. The walk then either sees the expiry and skips, or pins in time for that wait to cover the revoke.

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

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

Последствия

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

Строка CVSS v3.1