В ядре Linux устранена следующая уязвимость:
SUNRPC: закройте обратный канал перед уничтожением службы обратного вызова
Прием по обратному каналу может завершить запрос, пока обратный вызов NFS
сервис сносят. xprt_complete_bc_request() удаляет
запрос из bc_pa_list, удаляет bc_alloc_count, отмечает используемый запрос,
а затем просит xprt_enqueue_bc_request() передать его обратному вызову
сервис. Если демонтаж уже очистил xprt->bc_serv, xprt_enqueue_bc_request()
в настоящее время возвращается без постановки в очередь или освобождения зафиксированного запроса. Функция xprt_get(), полученная при входе, также просочилась.
Если продюсер выиграет
гонка до того, как bc_serv будет очищена, она также может быть поставлена в очередь в sv_cb_list
после того, как nfs_callback_down() остановил потоки обратного вызова, оставив
запрос, связанный с svc_serv, который скоро будет освобожден. Закройте сторону производителя до остановки потоков обратного вызова. Добавить
xprt_svc_shutdown_bc(), чтобы очистить xprt->bc_serv под bc_pa_lock и вызвать
это при отключении обратного вызова и сбое запуска обратного вызова перед остановкой
сервисные темы.
Запросы, которые теряют переход NULL в
xprt_enqueue_bc_request() выпускаются через обычный обратный канал.
свободный путь после балансировки bc_slot_count. Наконец, слейте все оставшиеся
sv_cb_list запрашивает после остановки потоков обратного вызова и до
svc_destroy() освобождает службу.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: SUNRPC: close backchannel before destroying callback service A backchannel receive can complete a request while the NFS callback service is being torn down. xprt_complete_bc_request() removes the request from bc_pa_list, drops bc_alloc_count, marks the request in use, and then asks xprt_enqueue_bc_request() to hand it to the callback service. If teardown has already cleared xprt->bc_serv, xprt_enqueue_bc_request() currently returns without enqueueing or freeing the committed request. The xprt_get() taken on entry is leaked as well. If the producer wins the race before bc_serv is cleared, it can also enqueue onto sv_cb_list after nfs_callback_down() has stopped the callback threads, leaving the request linked to a svc_serv that is about to be freed. Close the producer side before callback threads are stopped. Add xprt_svc_shutdown_bc() to clear xprt->bc_serv under bc_pa_lock, and call it on callback shutdown and callback-start failure before stopping the service threads. Requests that lose the NULL transition in xprt_enqueue_bc_request() are released through the normal backchannel free path after balancing bc_slot_count. Finally, drain any remaining sv_cb_list requests after the callback threads have stopped and before svc_destroy() frees the service.
Характеристики атаки
Последствия
Строка CVSS v3.1