CVE-2026-90001
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
HID: bpf: serializuj wersję referencyjną urządzenia w ścieżce zniszczenia struct_ops
__hid_bpf_ops_destroy_device() i hid_bpf_unreg() mogą ścigać się na
ten sam numer rejestracyjny, podwójne umieszczenie struktury hid_device i
uwalniając go, podczas gdy funkcja hid_destroy_device() nadal go używa. Serializuj
decyzja o usunięciu/NULL w hdev->bpf.prog_list_lock, więc dokładnie jedna
ścieżka zwalnia każde odniesienie do rejestracji: unreg ponownie sprawdza ops->hdev
pod zamkiem i wraca bez umieszczania ścieżki zniszczenia
już to wyczyściłem; wszystkie wywołania put_device() mają miejsce po zamknięciu blokady
upuszczony, co jest bezpieczne, ponieważ jednocześnie obserwuje to unreg
ops->hdev == NULL pod blokadą.
Tło: każde pomyślne dołączenie (hid_bpf_ops_reg) nabywa jeden
odniesienie do urządzenia (hid_get_device()). Dwie ścieżki mogą go zwolnić:
- zniszczenie urządzenia: hid_destroy_device() -> hid_bpf_destroy_device()
-> __hid_bpf_ops_destroy_device(), która obsługuje hdev->bpf.prog_list
pod rcu_read_lock() i usuwa jedno odniesienie na każdy dołączony program;
- Zwolnienie łącza BPF: usuwanie mapy bpf (bez BPF_F_LINK) wywołuje synchronicznie
st_ops->unreg() -> hid_bpf_unreg(), która usuwa odniesienie do
własną rejestrację.
Uzgadnianie koordynacji (e->hdev = NULL po stronie niszczącej vs
„if (!hdev) return” po stronie unreg) to test TOCTOU: dwa
ścieżki działają w różnych domenach blokujących (rcu_read_lock vs
prog_list_lock), więc współbieżne wyrejestrowanie może czytać ops->hdev jako
różna od NULL, zablokuj prog_list_lock, a następnie kontynuuj podczas
niszczy wykonywanie przechodzenia - obie ścieżki następnie upuszczają to samo
odniesienie. Przeliczenie zgodnie z prawem osiąga zero (każde zmniejszenie
jest indywidualnie ważny), więc nie uruchamia się nasycenie refcount_t: the
urządzenie jest po prostu zwalniane, gdy transport jest nadal w środku
hid_destroy_device(), a późniejsze rozbicie powoduje zwolnienie pamięci.
Poprawka serializuje decyzję o usunięciu/NULL w obszarze prog_list_lock on
obie strony i przesuwa stronę zniszczenia, umieszczając ją na zewnątrz zamka. Z
blokada utrzymana, wystarczą zwykłe odczyty/zapisy ops->hdev; nie
Dodano READ_ONCE/WRITE_ONCE, dzięki czemu łatka jest minimalna.
Bezpieczeństwo odblokowania odczytu: odblokowanie odczytu ops->hdev na górze
hid_bpf_unreg() nie może dotknąć uwolnionego urządzenia, ponieważ ścieżka została wyrejestrowana
sam w sobie nadal zawiera odniesienie do tej rejestracji (opublikowane tylko przez
własną funkcję hid_put_device() po opuszczeniu blokady) i zniszczenie
przejście, które już wyczyściło ops->hdev, powoduje, że blokada jest wewnętrzna
ponownie sprawdź zwrot wcześniej, bez żadnej opcji put. Co najwyżej jedno z dwóch
paths zwalnia każde odniesienie do rejestracji.
>_ 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