Katalog CVE

CVE-2026-87038

WysokieCVSS 7.0
Opublikowano: Zaktualizowano: Przetłumaczono: NVD NIST

Prawdopodobieństwo exploitacji (EPSS)

Niskie ryzyko
0.09%

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