Ad

CVE-2026-89540

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

В ядре Linux устранена следующая уязвимость: sunrpc: инициализировать gssp_lock перед публикацией записи процесса create_use_gss_proxy_proc_entry() публикует /proc/net/rpc/use-gss-proxy через proc_create_data() до того, как init_gssp_clnt() запустит mutex_init() sn->gssp_lock. Как только dentry будет связан с proc_subdir_lock, это будет немедленно доступен из пользовательского пространства, поэтому запись попадает в окно переводит set_gssp_clnt() в mutex_lock() на инициализированном нулем структура мьютекса. create_use_gss_proxy_proc_entry (сеть) proc_create_data("use-gss-proxy", ...) /* dentry live */ init_gssp_clnt (сн) mutex_init(&sn->gssp_lock) /* слишком поздно */ write_gssp() set_gssp_clnt (сеть) mutex_lock(&sn->gssp_lock) /* не инициализирован */ gssp_rpc_create(...) sn->gssp_clnt = clnt mutex_unlock(&sn->gssp_lock) Окно охватывает только два оператора между proc_create_data(). return и init_gssp_clnt(), поэтому писатель достигает его только в том случае, если поток регистрации вытесняется там, пока другая задача уже выполнена открытие только что опубликованного файла. Register_pernet_subsys() запускается вытесняемый контекст в pernet_ops_rwsem, так что вытеснение возможно, и окно расширяется при загрузке модуля auth_rpcgss, когда запись proc создается для каждого пространства имен живой сети, чьи задачи уже работает. Писатель, выигравший гонку, запирает заполненный нулями структура мьютекса.

В CONFIG_DEBUG_MUTEXES отсутствующее магическое значение вызывает ошибку. «блокировка используется без инициализации» splat; в производственном ядре быстрый путь получает блокировку через CMPXCHG(владелец, 0, текущий). В последнем случае второй модуль записи, который появляется до того, как init_gssp_clnt() обнуляет владельца может одновременно войти в set_gssp_clnt(), выключив первый записывающий clnt, пока он еще используется, и утечка clnt проигравшего. Исправьте, инициализировав sn->gssp_lock в sunrpc_init_net(), чтобы его время жизни соответствует sunrpc_net, в котором он находится. sn->gssp_clnt уже равен NULL из kzalloc, который поддерживает хранилище net_generic, поэтому ленивый помощник не нужен дольше необходим; отбросьте init_gssp_clnt(), его прототип и вызов из create_use_gss_proxy_proc_entry(). sunrpc.ko — это время сборки зависимость от auth_rpcgss.ko, поэтому sunrpc_init_net() всегда выполняется каждый netns до того, как любой инициализатор auth_gss pernet сможет опубликовать процесс вход.

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

In the Linux kernel, the following vulnerability has been resolved: sunrpc: init gssp_lock before publishing proc entry create_use_gss_proxy_proc_entry() publishes /proc/net/rpc/use-gss-proxy via proc_create_data() before init_gssp_clnt() runs mutex_init() on sn->gssp_lock. Once the dentry is linked under proc_subdir_lock it is immediately reachable from userspace, so a write that lands in the window drives set_gssp_clnt() into mutex_lock() on a zero-initialized struct mutex. create_use_gss_proxy_proc_entry(net) proc_create_data("use-gss-proxy", ...) /* dentry live */ init_gssp_clnt(sn) mutex_init(&sn->gssp_lock) /* too late */ write_gssp() set_gssp_clnt(net) mutex_lock(&sn->gssp_lock) /* uninitialized */ gssp_rpc_create(...) sn->gssp_clnt = clnt mutex_unlock(&sn->gssp_lock) The window spans only the two statements between proc_create_data() returning and init_gssp_clnt(), so a writer reaches it only if the registering thread is preempted there while another task is already opening the freshly published file. register_pernet_subsys() runs in preemptible context under pernet_ops_rwsem, so that preemption is possible, and the window widens on auth_rpcgss module load, when the proc entry is created for every live net namespace whose tasks are already running. A writer that wins the race locks a zero-filled struct mutex. On CONFIG_DEBUG_MUTEXES the missing magic value trips a "lock used without init" splat; on a production kernel the fast path acquires the lock via CMPXCHG(owner, 0, current). In the latter case a second writer that arrives before init_gssp_clnt() re-zeroes owner can enter set_gssp_clnt() concurrently, shut down the first writer's clnt while it is still in use, and leak the loser's clnt. Fix by initializing sn->gssp_lock in sunrpc_init_net() so its lifetime matches the sunrpc_net it lives in. sn->gssp_clnt is already NULL from the kzalloc that backs net_generic storage, so the lazy helper is no longer needed; drop init_gssp_clnt(), its prototype, and the call from create_use_gss_proxy_proc_entry(). sunrpc.ko is a build-time dependency of auth_rpcgss.ko, so sunrpc_init_net() has always run on every netns before any auth_gss pernet init can publish the proc entry.

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

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

Последствия

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

Строка CVSS v3.1