Odebrany

CVE-2026-90171

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

smb: smbdirect: zwolnij oczekujące gniazda podrzędne poza blokadą modułu obsługi

smbdirect_socket_destroy() zwalnia oczekujące/gotowe dziecko słuchacza
gniazd, wciąż trzymając blokadę modułu obsługi słuchacza,
&id_priv->handler_mutex pobrane przez rdma_lock_handler(), nie
sc->listen.lock, a przed własną funkcją rdma_destroy_id() słuchacza.
To uporządkowanie ma jedną realną konsekwencję i jedną kosmetyczną.

Prawdziwy: smbdirect_socket_release() upuszcza ostatnią funkcję dziecka
referencja, która niszczy cm_id dziecka. Robiąc to przed
rdma_destroy_id() słuchacza pozwala _cma_cancel_litens(), uruchamiając
_destroy_id(), słuchacza, idź już uwolnione dziecko id_priv,
które KASAN łapie jako blok-użycie-po-wolności podczas wyłączania słuchacza:

[ 4758.909130] BŁĄD: KASAN: użycie płyty po zwolnieniu w __mutex_lock+0x1469/0x1560
[4758.911450] Odczyt rozmiaru 1 pod adresem ffff88821c381db4 przez zadanie ksmbd.control/1652
[ 4758.913262] Śledzenie połączenia:
[ 4758.913267] <ZADANIE>
[ 4758.913299] __mutex_lock+0x1469/0x1560
[ 4758.913408] _cma_cancel_listens+0x312/0x3b0
[ 4758.913413] _destroy_id+0x363/0xee0
[ 4758.913417] smbdirect_socket_destroy_sync+0x17d5/0x2440
[ 4758.913443] smbdirect_socket_release+0x124/0x230
[ 4758.913451] ksmbd_rdma_stop_listening+0x9f/0x190
[ 4758.913457] ksmbd_conn_transport_destroy+0x65/0x3c0
[ 4758.913463] sklep_serwera_zabicia+0x1fb/0x2b0
[ 4758.913501] kernfs_fop_write_iter+0x349/0x4d0
[ 4758.913507] vfs_write+0x5e7/0xc70
[ 4758.913528] ksys_write+0x12a/0x210
[ 4758.913541] do_syscall_64+0x135/0x460
[ 4758.913555] wpis_SYSCALL_64_after_hwframe+0x77/0x7f

Kosmetyczny: wypuszczenie dziecka powraca
smbdirect_socket_destroy(), która pobiera dane dziecka
blokada rdma_lock_handler() zagnieżdżona pod blokiem słuchacza. Słuchacza
i cm_id dziecka są zawsze różnymi instancjami, więc nie może
prawdziwy impas; sam rdzeń CM zagnieżdża nowe identyfikatory połączeń
handler_mutex pod identyfikatorami nasłuchiwania w cma_ib_req_handler(). Ale
lockdep widzi tylko jedną klasę blokady, zgłasza możliwe blokowanie rekurencyjne,
a następnie wyłącza się, ukrywając prawdziwe błędy blokowania przez resztę
biegnij:

[ 2424.579653] OSTRZEŻENIE: wykryto możliwe blokowanie rekurencyjne
[ 2424.581180] 7.1.0-next-20260623+ #89 Nieskażony
[ 2424.582548] ------------------------------------------------------
[2424.584500] ksmbd.control/8854 próbuje uzyskać blokadę:
[ 2424.586817] ffff888102303c20 (&id_priv->handler_mutex){+.+.}-{4:4}, pod adresem: smbdirect_socket_destroy_sync+0xc39/0x2440
[ 2424.590590]
[2424.590590], ale zadanie już blokuje:
[ 2424.591601] ffff888102046c20 (&id_priv->handler_mutex){+.+.}-{4:4}, pod adresem: smbdirect_socket_destroy_sync+0xc39/0x2440
[ 2424.594178]
[2424.594178] inne informacje, które mogą pomóc nam w debugowaniu tego:
[2424.596634] Możliwy niebezpieczny scenariusz blokowania:
[ 2424.596634]
[2424.598841] Procesor0
[ 2424.599765] ----
[2424.600695] lock(&id_priv->handler_mutex);
[2424.601836] lock(&id_priv->handler_mutex);
[ 2424.602590]
[ 2424.602590] *** ZAMKNIĘCIE ***
[ 2424.602590]
[2424.604512] Przyczyną może być brak zapisu zagnieżdżenia blokady

Połącz oczekujące/gotowe dzieci na listę lokalną pod
blokada słuchacza, podczas gdy blokada modułu obsługi jest utrzymywana jednocześnie
CM CONNECT_REQUEST nie może dodać więcej, ale odłożyć faktyczną
smbdirect_socket_release() wywołuje do czasu, aż cm_id słuchacza zostanie zakończone
został zniszczony, a zamek uchwytu opuszczony. Dzieci są
niezależne gniazda, których rozbiórka nie jest konieczna dla słuchacza
blokadę modułu obsługi ani jej cm_id.

Znaleziono wraz z ksmbdzzer [2], fuzzerem KSMBD, który steruje biblioteką libFuzzer za pomocą
wektor pokrycia kcov-dataflow [1]: składa każdy instrument
wartość operandu wykonania porównania/argumentu wraz z jego komputerem (
domyślne ramię miesza je jako pc⊕val), tak że nowa wartość operandu ma znaną wartość
miejsce liczy się jako nowe pokrycie.

[1] https://lwn.net/Articles/1077606/
[2] https://github.com/yskzalloc/kcov-dataflow

>_ 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