CVE-2026-89708
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
nfsd: RCU-protect cl_cb_session, aby naprawić użycie po zwolnieniu w przypadku przerwania sesji
Po DESTROY_SESSION ścieżka rozrywania sesji może zwolnić a
sesji, podczas gdy rpciod nadal przechowuje wywołanie zwrotne rpc_task w locie
dereferencje clp->cl_cb_session. nfsd4_probe_callback_sync() opróżnia
cl_callback_wq, ale po wywołaniu funkcji nfsd4_run_cb_work()
rpc_call_async() zadanie rpc_task znajduje się na rpciod; płukanie kolejki roboczej
nie czeka na to. rpc_shutdown_client() wyczerpuje zadania rpciod,
ale używa 1-sekundowego Wait_event_timeout — zadania utknęły w rpc_delay()
(np. 2-sekundowe ponowne próby NFS4ERR_DELAY) mogą przetrwać wyczerpanie.
zniszcz ścieżkę rpciod
------------ ------
unhash_session(ses)
nfsd4_probe_callback_sync(clp)
kolejka_robocza (cl_callback_wq)
/* zwraca; rpc_task nadal działa */
nfsd4_put_session_locked(ses)
free_session(ses) -> kfree(ses)
nfsd4_cb_sequence_done()
czyta cb_clp->cl_cb_session
/* uwolniona płyta */
Drugie okno istnieje w nfsd4_process_cb_update(). Kiedy
__nfsd4_find_backchannel() zwraca NULL, ponieważ funkcja unhash_session() ma
usunąłem już zniszczoną sesję z cl_sessions,
setup_callback_client() pobiera wcześniejszy powrót z wersji 4.1, więc
clp->cl_cb_session = ses nigdy nie uruchamia się, a pole zachowuje wskaźnik
na sesję, która miała wkrótce zostać uwolniona.
Napraw oba, konwertując cl_cb_session na wskaźnik chroniony RCU:
- Przenieś przypisanie cl_cb_session = ses w setup_callback_client()
do po pomyślnym wykonaniu funkcji rpc_create(), więc jest ona publikowana tylko wtedy, gdy a
istnieje działający kanał zwrotny. Wyczyść cl_cb_session w przypadku błędu
zwróć w nfsd4_process_cb_update(). Obydwa sklepy korzystają
rcu_przydziel_wskaźnik().
- Adnotuj cl_cb_session za pomocą __rcu. Używają wszystkich czytników po stronie rpciod
rcu_read_lock()/rcu_dereference() i sprawdź wartość NULL, przechodząc do
odpowiedni błąd lub ścieżka ponownej kolejki:
encode_cb_sequence4args(), decode_cb_sequence4resok(),
nfsd41_cb_get_slot(), nfsd41_cb_release_slot(),
nfsd4_cb_prepare() i nfsd4_cb_sequence_done().
- Przełącz __free_session() z kfree() na kfree_rcu(), aby
płyta sesyjna nie jest odzyskiwana przed upływem okresu karencji RCU,
gwarantując, że czytniki rpciod wewnątrz rcu_read_lock() nigdy
pamięć uwolniona od odwołań.
- Przekaż wskaźnik sesji do nfsd_cb_seq_status i
nfsd_cb_free_slot punkty śledzenia zamiast konieczności ich ponownego odczytania
cl_cb_session.
- nfsd4_cb_prepare() wywołuje rpc_exit() gdy sesja ma wartość NULL,
routing przez ścieżkę Gotowe/Zwolnienie, aby ponownie kolejkować wywołanie zwrotne.
>_ Referencje
Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.
This product uses the NVD API but is not endorsed or certified by the NVD.
Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.
CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.
NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org