CVE-2026-10681
ŚrednieCVSS 6.5Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 0 - wyżej niż 0% wszystkich znanych CVE
Streszczenie
W systemie Zephyr w podsystemie obiektów dynamicznych przestrzeni użytkownika funkcja thread_idx_alloc() alokuje indeks uprawnień wątku z globalnej bitmapy _thread_idx_map[] bez trzymania blokady lists_lock. Na systemach SMP dwa wątki użytkownika wywołujące jednocześnie k_object_alloc(K_OBJ_THREAD) mogą zobaczyć ten sam wolny bit, wykonać tę samą nieatomową operację RMW i otrzymać identyczny tidx.
Ocena ryzyka
Dwa nowo utworzone obiekty K_OBJ_THREAD otrzymują ten sam identyfikator wątku, co powoduje aliasowanie jednej pozycji bitowej w polu perms[] każdego obiektu jądra. Każde późniejsze nadanie dostępu do obiektu jądra jednemu wątkowi jest domyślnie nadawane drugiemu, co przełamuje izolację ACL przestrzeni użytkownika.
Rekomendacja
Należy natychmiast zaktualizować system Zephyr do wersji zawierającej poprawkę, która trzyma blokadę lists_lock podczas operacji RMW na bitmapie oraz czyszczenia uprawnień. Dla systemów z włączonymi CONFIG_USERSPACE, CONFIG_DYNAMIC_OBJECTS i CONFIG_SMP jest to krytyczne.
Inne podatności w Zephyr
Zobacz wszystkie- CVE-2026-10772Nieznane
To CVE zostało odrzucone jako duplikat. Opisana podatność dotyczyła błędnego sprawdzania uprawnień w ścieżkach GATT notify/indicate w stosie Bluetooth Zephyr, ale została już wcześniej zgłoszona jako CVE-2026-2411.
- CVE-2026-10676Nieznane
Identyfikator CVE-2026-10676 został wycofany, ponieważ analiza wykazała, że zgłoszona wada nie jest dostępna w żadnej wydanej wersji Zephyr. W każdej wspieranej wersji poprawna wartość jest korygowana przed jej użyciem.
- CVE-2026-5067Krytyczne
System operacyjny Zephyr zawiera lukę w ścieżce uaktualnienia WebSocket serwera HTTP. Nieuwierzytelniony atakujący zdalny może wywołać uszkodzenie pamięci, wysyłając spreparowany nagłówek Sec-WebSocket-Key. Kopiowanie nagłówka do bufora o stałym rozmiarze nie gwarantuje zakończenia NUL, co prowadzi do odczytu i zapisu poza zakresem na stosie.
- CVE-2026-13735Niskie
Implementacja WireGuard w Zephyrze błędnie obsługiwała pakiety keepalive. Wiadomość typu 4 z 16-bajtowym ładunkiem (pusty tekst jawny i tag Poly1305) była akceptowana bez weryfikacji tagu uwierzytelniającego, ponieważ funkcja wg_process_data_message() zwracała wynik przed wywołaniem wg_decrypt_packet(). Atakujący mógł wysłać fałszywy keepalive, nie znając klucza sesji.
- CVE-2026-13734Średnie
Podatność w Zephyr's WireGuard VPN: funkcja wg_process_data_message() sprawdzała licznik anty-replay zbyt późno, po zatwierdzeniu zmian stanu peer'a (aktualizacja adresu, timery, rotacja kluczy). Atakujący może wstrzyknąć przechwycony pakiet, co prowadzi do przejęcia endpointu i zakłócenia sesji.
- CVE-2026-13212Wysokie
Sterownik virtio w systemie Zephyr nie sprawdza poprawności identyfikatora łańcucha deskryptorów zapisywanego przez urządzenie virtio do pierścienia używanego. Atakujący backend virtio może podać identyfikator wykraczający poza zakres, co prowadzi do odczytu poza pamięcią i wywołania wskaźnika funkcji w kontekście przerwania gościa. Umożliwia to przejęcie kontroli nad przepływem wykonania lub spowodowanie awarii systemu.
- CVE-2026-12634Średnie
Podatność w backendzie NVS podsystemu ustawień Zephyr (settings_nvs.c) powoduje zapis poza granicami stosu. Funkcja nvs_read() zwraca pełną długość wpisu, która może przekraczać rozmiar bufora, a kod używa tej wartości jako indeksu do zapisu znaku NUL, co prowadzi do zapisu poza bufor (CWE-787).
- CVE-2026-12632Średnie
Podatność w Zephyr RTOS w module PTP (Precision Time Protocol) pozwala zdalnemu atakującemu na wywołanie odczytu poza zakresem pamięci przez wysłanie specjalnie spreparowanego pakietu PTP z nieprawidłowym typem wiadomości (0xE lub 0xF). Brak walidacji górnego zakresu indeksu tablicy msg_size[] prowadzi do odczytu poza tablicą, a następnie do dalszych operacji na pamięci, co może skutkować awarią systemu lub ograniczonym uszkodzeniem pamięci.
- CVE-2026-12630Średnie
W Zephyr OS w kodzie dekompresji 6LoWPAN IPHC (subsys/net/ip/6lo.c) występuje odczyt poza zakresem w funkcji get_ihpc_inlined_size(). Indeks do tablicy da_inline_size_table (13 wpisów) jest budowany z 4-bitowego pola M, DAC i DAM nagłówka IPHC, a zarezerwowane kombinacje 13, 14 i 15 nie są sprawdzane pod kątem granic, co prowadzi do odczytu poza tablicą.
- CVE-2026-12366Wysokie
W Zephyr OS wykryto podatność use-after-free w ścieżce usuwania dynamicznych obiektów jądra. Funkcja unref_check() zwalnia pamięć obiektu po wyzerowaniu licznika referencji, ale dla timerów (K_OBJ_TIMER) nie anuluje aktywnego timeoutu, pozostawiając wiszący węzeł w globalnej kolejce timeoutów. Po wygaśnięciu timera jądro wywołuje handler na zwolnionej pamięci, co prowadzi do zapisu do zwolnionego obszaru.
Oryginalny opis (angielski, źródło NVD)
In Zephyr's userspace dynamic-objects subsystem, thread_idx_alloc() in kernel/userspace/userspace.c allocated a new thread permission index from the global _thread_idx_map[] bitmap without holding lists_lock. On SMP systems, two user-mode threads invoking the k_object_alloc(K_OBJ_THREAD) syscall concurrently can both observe the same low free bit, perform the same non-atomic RMW to clear it, and return the identical tidx. The two newly created K_OBJ_THREAD objects are then assigned the same thread_id, so the two user threads alias a single bit position in every kernel object's perms[] bitfield: any subsequent grant of access on a kernel object to one thread is implicitly a grant to the other, defeating userspace ACL isolation. A secondary lost-update window between the unlocked &=~BIT() in alloc and the locked |= BIT() in thread_idx_free() can also leak entries from the thread-index pool. The defect is reachable from any user-mode thread via the unrestricted __syscall k_object_alloc and is gated on CONFIG_USERSPACE, CONFIG_DYNAMIC_OBJECTS, and CONFIG_SMP. The flaw was introduced when the per-thread permission index was added in 2018 and is present in every release up to and including v4.4.0. Fixed by holding lists_lock across the bitmap RMW and the permissions clear (and inlining the obj_list traversal that previously took the lock itself).

