CVE-2026-72222 in Linux
Сводка
по VulDB • 16.08.2026
В ядре Linux была устранена следующая уязвимость:
sunrpc: закрепление svc_xprt во время обратного вызова асинхронной рукопожатия TLS (TLS handshake)
Функция svc_tcp_handshake() сохраняет необработанный указатель svc_xprt в tls_handshake_args.ta_data и отправляет запрос через tls_server_hello_x509(). Ядро рукопожатия выполняет только sock_hold(req->hr_sk); ничего не ссылается на встроенную структуру svc_sock, к которой обращается svc_tcp_handshake_done() с помощью container_of().
Два близких состояния гонки (race conditions) приводят к тому, что выполняющийся обратный вызов записывает данные через освобожденную структуру svc_sock. Функция svc_sock_free() вызывает tls_handshake_cancel() и игнорирует возвращаемое значение: ложное значение означает, что handshake_complete() уже установила флаг HANDSHAKE_F_REQ_COMPLETED, но hp_done(), возможно, еще не завершила свою работу, однако svc_sock_free() продолжает выполнение и вызывает kfree(svsk). Сценарий «проигрыша при отмене» (cancel-loser fall-through) внутри самой функции svc_tcp_handshake() создает аналогичное окно уязвимости: когда wait_for_completion_interruptible_timeout() возвращает значение <= 0 (тайм-аут или сигнал), а tls_handshake_cancel() возвращает false, функция не выполняет очистку (drain), завершает работу, и svc_handle_xprt() вызывает svc_xprt_received(), что сбрасывает флаг XPT_BUSY и может привести к освобождению последней ссылки. Одновременное закрытие соединения затем запускает svc_sock_free() в то время как svc_tcp_handshake_done() все еще обновляет xpt_flags и проходит по списку svsk->sk_handshake_done.
Коррупция проявляется в виде операций чтения-изменения-записи (RMW) set_bit/clear_bit к слоту slab памяти, который уже был освобожден для xpt_flags, а также при прохождении complete_all() и записи в список wait_queue_head_t, встроенный в sk_handshake_done, — это примитив коррупции slab-памяти, а не безобидное чтение. Этот путь достижим на любом NFS-сервере с включенным TLS всякий раз, когда закрытие соединения пересекается с окном доставки вызова tlshd; прерываемое ожидание означает, что достаточно доставки сигнала, а не только истечения тайм-аута SVC_HANDSHAKE_TO.
Немедленно выполните svc_xprt_get(xprt) непосредственно перед tls_server_hello_x509(), чтобы выполняющийся обратный вызов владел собственной ссылкой. Освободите ее на двух границах (edge cases), где гарантируется, что обратный вызов не сработает — при неудаче отправки через tls_server_hello_x509() и успешном выполнении tls_handshake_cancel(), а также в конце функции svc_tcp_handshake_done() после complete_all().
[cel: переписано сообщение коммита для описания фактических изменений]
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.