CVE-2026-99009
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
Bluetooth: RFCOMM: podłącz gniazdo sesji bez rfcomm_mutex
Funkcja RFCOMM connect() wywołana podczas uwierzytelniania łącza BR/EDR
sprawia, że raport blokady jest zależnością cykliczną, a raportowany cykl to a
prawdziwe AB/BA pomiędzy rfcomm_mutex i hdev->lock.
Funkcja rfcomm_security_cfm() jest wywoływana ze ścieżki zdarzenia HCI, która już
trzyma hdev->lock:
hci_rx_work()
hci_event_packet()
hci_cc_read_enc_key_size() [hdev->blokada]
hci_encrypt_cfm() [hci_cb_list_lock]
rfcomm_security_cfm() [rfcomm_mutex]
podczas gdy funkcja RFCOMM connect() z przestrzeni użytkownika pobiera te same dwie blokady
w drugą stronę:
rfcomm_sock_connect()
rfcomm_dlc_open() [rfcomm_mutex]
__rfcomm_dlc_open()
rfcomm_session_create()
kernel_connect()
l2cap_sock_connect()
l2cap_chan_connect() [hdev->blokada]
OSTRZEŻENIE: wykryto możliwą zależność blokowania cyklicznego
kworker/u131:1/1128 próbuje uzyskać blokadę:
rfcomm_mutex, pod adresem: rfcomm_security_cfm+0x31/0x3e0 [rfcomm]
ale zadanie już blokuje:
hci_cb_list_lock, pod adresem: hci_cc_read_enc_key_size+0x1d2/0xcc0
Łańcuch istnieje:
rfcomm_mutex --> &hdev->lock --> hci_cb_list_lock
hci_auth_complete_evt() i hci_encrypt_change_evt() osiągają wywołanie zwrotne
w ten sam sposób.
Obydwa zamówienia muszą być widoczne w tym samym bucie, dlatego BR/EDR
Samo połączenie nie wystarczy, aby to pokazać: sesja skonfigurowana przez
strona zdalna jest tworzona przez rfcomm_accept_connection() w krfcommd, który
wywołuje kernel_accept() i nigdy nie pobiera hdev->lock z rfcomm_mutex.
Podłączenie urządzenia, które uwierzytelnia i szyfruje łącze, a następnie
wywołanie funkcji connect() na gnieździe RFCOMM pod dowolnym adresem - połączenie
nie musi się udać, kolejność jest zapisywana przed upływem limitu czasu strony
- melduje to za każdym razem.
Tylko gniazdo sesyjne musi być połączone z trzymanym zamkiem i to
nie: nic innego nie może zobaczyć gniazda przed jego założeniem
lista sesji. Więc najpierw podłącz go, a potem weź rfcomm_mutex,
co raczej na dobre usuwa kolejność rfcomm_mutex -> hdev->lock
niż utrzymywanie ścieżki zdarzenia HCI poza rfcomm_mutex.
rfcomm_session_create() staje się rfcomm_session_connect(), co powoduje powrót
podłączone gniazdo bez dotykania listy sesji, oraz
rfcomm_dlc_open() dodaje sesję, gdy ponownie utrzyma blokadę. Jeśli
inny otwieracz dodał sesję dla tej samej pary, podczas gdy to gniazdo było
podczas łączenia, ta sesja jest używana, a to gniazdo jest odrzucane.
__rfcomm_dlc_open() pobiera teraz sesję, której powinna używać, i jej stan
sprawdzenie działa po ponownym uzyskaniu zamka, więc DLC, które zostało otwarte lub
zamknięte w międzyczasie są nadal obsługiwane.
Za pośrednictwem istniejącego łącza ACL połączenie może zostać zakończone przed
sesja dociera do listy, a wybudzenie z wywołania zwrotnego gniazda następuje
następnie utracone, więc krfcommd zostanie obudzony, gdy sesja będzie widoczna.
Podłączenie bez blokady otwiera okno, w którym można umieścić gniazdo
zamknięte. DLC nie jest jeszcze w sesji, więc rfcomm_dlc_close() znajduje
nic do zrobienia i wraca bez dotykania tego, i rfcomm_dlc_open()
następnie dołączy DLC, którego właściciel zniknął. rfcomm_dlc_close() teraz
zaznacza takie DLC za pomocą RFCOMM_CLOSED, a rfcomm_dlc_open() sprawdza
mark, gdy ponownie zatrzyma rfcomm_mutex i zamiast tego upuści gniazdo
dołączenie DLC. Znak jest usuwany, gdy rozpoczyna się otwarcie, a więc DLC
które są ponownie wykorzystywane, nie ma to wpływu. Dotyczy to zarówno osób dzwoniących z
rfcomm_dlc_open(), gniazdo i warstwa tty.
>_ Referencje
- https://git.kernel.org/stable/c/4dc3d5a004b8fd59f3c905631dbb18cb601b1b41
- https://git.kernel.org/stable/c/ac022970e9fb0a5f7e7d1f6c8e104c1ed924dd1c
- https://git.kernel.org/stable/c/cc7732b8549ecb6f02457edeb8db1f6d255e381c
- https://git.kernel.org/stable/c/d2206e8c78be69d21d4f5343c3e99fbaeef41cbb
- https://git.kernel.org/stable/c/f492de11b325446b0b11bc2eb86e1f546eaa61b6
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