CVE-2026-87038
WysokieCVSS 7.0Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 0 - wyżej niż 0% wszystkich znanych CVE
Streszczenie
Podatność typu time-of-check-to-time-of-use (TOCTOU) w jądrze Zephyr w funkcji z_vrfy_i3c_transfer() obsługującej wywołanie systemowe i3c_transfer(). Deskryptor urządzenia I3C dostarczony przez użytkownika jest walidowany w miejscu, a następnie ponownie odczytywany z pamięci użytkownika podczas użycia, co pozwala innemu wątkowi w tej samej domenie pamięci podmienić pole bus między sprawdzeniem a użyciem. W rezultacie jądro może wywołać w trybie supervisora wskaźnik funkcji z tablicy api kontrolowanej przez atakującego.
Ocena ryzyka
W systemach z CONFIG_USERSPACE i sterownikiem kontrolera I3C nieuprzywilejowany wątek użytkownika może uzyskać wykonanie kodu w trybie jądra, co stanowi pełne obejście piaskownicy ochrony pamięci przestrzeni użytkownika. Możliwe są również odczyty pamięci jądra lub błędy jądra.
Rekomendacja
Zaktualizować jądro Zephyr do wersji zawierającej poprawkę, która kopiuje deskryptor do lokalnej kopii na stosie jądra za pomocą k_usermode_from_copy(), waliduje bus w tej kopii i używa kopii do dyspozycji. Do czasu aktualizacji ograniczyć przyznawanie obiektów urządzeń I3C wątkom użytkownika lub wyłączyć CONFIG_USERSPACE, jeśli to możliwe.
Inne podatności w Zephyr kernel
Zobacz wszystkie- CVE-2026-78118Wysokie
Podatność typu race condition w jądrze Zephyr dotyczy funkcji z_waitq_head(), która w systemach SMP odczytuje początek kolejki oczekujących wątków bez trzymania spinlocka _sched_spinlock. W wyniku wyścigu między obsługą wygaśnięcia timera a przerywaniem wątku może dojść do zapisów poza zakresem i use-after-free w kontekście supervisora oraz uszkodzenia stanu schedulera.
- CVE-2026-12631Średnie
Podatność w jądrze Zephyr dotyczy systemowych wywołań k_thread_join() i k_thread_abort(). Błąd w sprawdzaniu dostępu (thread_obj_validate()) powoduje, że nieautoryzowany wątek użytkownika może wywołać te funkcje na obiekcie wątku, do którego nie ma uprawnień. Zamiast przerwania wątku, wykonanie przechodzi do niezdefiniowanego zachowania, co może prowadzić do awarii jądra (na Clang) lub obejścia kontroli dostępu (na GCC).
- CVE-2026-11742Niskie
Podatność w jądrze Zephyr dotyczy funkcji z_queue_node_peek() w kernel/queue.c, która odczytuje węzeł z listy data_q bez trzymania spinlocka kolejki. Współbieżne wywołanie k_queue_get() może zwolnić ten węzeł w trakcie operacji, prowadząc do use-after-free i zwrócenia wiszącego wskaźnika. Dotyczy to kolejek k_fifo i k_lifo używanych w subsystemach net_buf, Bluetooth, USB i sieci.
Oryginalny opis (angielski, źródło NVD)
The user-mode verification handler for the i3c_transfer() system call, z_vrfy_i3c_transfer() in drivers/i3c/i3c_handlers.c, validated the caller-supplied struct i3c_device_desc in place instead of snapshotting it. It confirmed only that the descriptor was readable by the calling thread (K_SYSCALL_MEMORY_READ()), read target->bus once to check it with K_SYSCALL_OBJ(), and then passed the caller's live pointer down. The implementation z_impl_i3c_transfer() re-reads target->bus from that user memory and dispatches through it as DEVICE_API_GET(i3c, target->bus)->i3c_xfers(...), so the bus that was validated is not necessarily the bus that is used. DEVICE_API_GET() performs no runtime type check outside CONFIG_DEVICE_API_ASSERT builds. On a build with CONFIG_USERSPACE and an I3C controller driver, a user thread that has been granted an I3C device object can exploit this with a second thread in the same memory domain: one thread calls i3c_transfer() while the other rewrites the bus field of the descriptor. The window between the check and the use spans the num_msgs validation, the message-array access check, a stack VLA allocation and a memcpy() of up to 32 struct i3c_msg, so the race is repeatable and can simply be retried until it lands. When the substitution succeeds, the kernel dereferences an attacker-chosen pointer as a struct device, loads a function pointer from the attacker-controlled api table and calls it in supervisor mode with attacker-influenced arguments. This yields kernel-mode code execution from an unprivileged user thread — a complete escape of the userspace memory-protection sandbox; lesser outcomes are an arbitrary two-level kernel read or a kernel fault. Builds without CONFIG_USERSPACE, or without an I3C driver, are unaffected. The fix copies the descriptor into a kernel-stack local with k_usermode_from_copy(), validates the bus in that copy, and dispatches on the copy, so the validated value is provably the value used.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

