CVE-2026-87039
WysokieCVSS 7.8Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 1 - wyżej niż 1% wszystkich znanych CVE
Streszczenie
Podatność w mechanizmie weryfikacji wywołań systemowych Zephyr RTOS (funkcja z_vrfy_i2s_configure) polega na pominięciu sprawdzenia własności i typu obiektu mem_slab oraz weryfikacji block_size, gdy frame_clk_freq wynosi 0. W efekcie nieuprzywilejowany wątek działający w CONFIG_USERSPACE może przekazać dowolny wskaźnik, który trafia do kodu sterownika (np. i2s_litex) i jest używany w kontekście jądra przez k_mem_slab_alloc()/k_mem_slab_free().
Ocena ryzyka
Umożliwia to wątkowi użytkownika uzyskanie pierwotniaka odczytu/zapisu pod dowolnym adresem w kontekście jądra, co całkowicie narusza granicę izolacji CONFIG_USERSPACE i może prowadzić do eskalacji uprawnień lub destabilizacji systemu.
Rekomendacja
Zaktualizuj Zephyr RTOS do wersji zawierającej poprawkę zerującą config.mem_slab i config.block_size na ścieżce odkonfigurowania strumienia. Jeśli aktualizacja nie jest możliwa, ogranicz dostęp nieuprzywilejowanych wątków do obiektów urządzeń I2S lub wyłącz CONFIG_USERSPACE dla aplikacji korzystających z I2S.
Inne podatności w Zephyr RTOS
Zobacz wszystkie- CVE-2026-90585Średnie
Sterownik UART SCI Renesas RA w Zephyr nie potwierdza warunku błędu odbioru w procedurze obsługi przerwania uart_ra_sci_eri_isr(), gdy nie zarejestrowano callbacku (data->user_cb jest NULL). Flagi błędów SCI pozostają ustawione, a flaga przerwania ICU nie jest czyszczona, co powoduje natychmiastowe ponowne wejście w ISR w nieskończonej pętli. Problem występuje przy CONFIG_UART_INTERRUPT_DRIVEN=y i CONFIG_UART_ASYNC_API=n, gdy przerwanie błędu zostanie odmaskowane przez uart_configure() lub uart_irq_err_enable().
- CVE-2026-87043Średnie
W generatorze liczb losowych opartym na urządzeniu entropii (subsys/random/random_entropy_device.c) funkcja rand_get() zwracała wcześnie błąd -ENODEV, gdy urządzenie nie było gotowe, pomijając awaryjny mechanizm oparty na timerze systemowym. Ponieważ funkcje sys_rand_get() i sys_rand32_get() zwracają void i nie raportują błędu, bufor wyjściowy pozostawał niezmieniony, a jego wcześniejsza zawartość (niezainicjalizowana pamięć) była zwracana jako dane losowe. Stan "niegotowości" jest normalnym warunkiem działania (np. wczesna inicjalizacja) lub trwałym skutkiem błędu inicjalizacji sterownika entropii.
- CVE-2026-87041Wysokie
Podatność w mechanizmie weryfikacji kolejki zgłoszeń RTIO (rtio_vrfy_sqe()) w Zephyr RTOS polega na błędnym użyciu operatora &= z makrem K_SYSCALL_MEMORY(), które zwraca wartość niezerową przy błędzie. W efekcie sprawdzenia uprawnień do buforów działały odwrotnie: niedostępne bufory były akceptowane, a prawidłowe bufory powodowały oops jądra. Umożliwia to wątkom użytkownika z przydzielonym kontekstem RTIO zapis do dowolnej pamięci jądra, jej ujawnienie lub wywołanie błędu, co stanowi obejście izolacji CONFIG_USERSPACE.
- CVE-2026-16511Wysokie
Dwie funkcje weryfikujące wywołania systemowe RTIO w Zephyr RTOS nie sprawdzały poprawnie wskaźników dostarczonych przez użytkownika przed zapisem do pamięci jądra. z_vrfy_rtio_sqe_cancel() w ogóle nie walidowała wskaźnika, pozwalając wątkowi użytkownika na ustawienie wybranych bitów w pamięci jądra, a z_vrfy_rtio_sqe_copy_in_get_handles() zapisywała wskaźnik jądra pod dowolny adres bez sprawdzenia prawa zapisu. Luki dotyczą wyłącznie systemów zbudowanych z CONFIG_USERSPACE i CONFIG_RTIO.
- CVE-2026-82962Średnie
Podatność w funkcji ethernet_fill_header() w stosie sieciowym Zephyr RTOS polega na tym, że nagłówek Ethernet jest wstawiany w miejscu (poprzez net_buf_push) bez sprawdzenia, czy pakiet ma wystarczający zapas miejsca (headroom). Pakiety przydzielone przez inny stos L2 (np. 802.15.4/OpenThread, PPP) i przekazane do Ethernetu w wyniku routingu lub tunelowania mają zbyt mały headroom, co prowadzi do zapisu poza granicami bufora. W buildach bez CONFIG_ASSERT i CONFIG_NET_BUF_HARDENING powoduje to korupcję pamięci.
- CVE-2026-19595Średnie
Podatność w mechanizmie weryfikacji wywołań systemowych Zephyr RTOS: funkcja z_vrfy_rtio_cqe_get_mempool_buffer() sprawdzała parametry wyjściowe buff i buff_len za pomocą K_SYSCALL_MEMORY_READ() zamiast K_SYSCALL_MEMORY_WRITE(). Umożliwia to nieuprzywilejowanemu wątkowi w trybie użytkownika wywołanie wywołania systemowego ze wskaźnikami do pamięci tylko do odczytu, co prowadzi do zapisu w trybie nadzorcy poza dozwolonym obszarem lub do błędu jądra i zatrzymania/restartu urządzenia.
- CVE-2026-19940Średnie
Podatność w implementacji Bluetooth Classic Hands-Free Profile Audio Gateway (HFP AG) w Zephyr RTOS powoduje uszkodzenie listy timeoutów jądra. Poprzez wysłanie AT+CIND? i szybkie ponowne połączenie, zdalny atakujący może wywołać zawieszenie lub awarię całego systemu.
- CVE-2026-19736Wysokie
Sterownik entropii NXP MCUX TRNG w Zephyrze (drivers/entropy/entropy_mcux_trng.c) przekazuje liczbę bajtów żądania bezpośrednio do funkcji SDK TRNG_GetRandomData(), która w przypadku układów i.MX RT5xx/RT6xx zawsze kopiuje całe 32-bitowe słowa i zaokrągla pobieranie entropii do wielokrotności 128 bajtów. Przy długości niebędącej wielokrotnością czterech dochodzi do przepełnienia bufora o maksymalnie 127 bajtów, co może prowadzić do uszkodzenia pamięci jądra lub stosu.
- CVE-2026-19575Wysokie
Podatność w Zephyr RTOS dotyczy handlera trybu użytkownika z_vrfy_device_deinit() w kernel/device.c, który walidował argument dev za pomocą K_SYSCALL_OBJ_INIT(dev, K_OBJ_ANY). Ponieważ k_object_validate() pomija porównanie typu dla K_OBJ_ANY, sprawdzenie ograniczało się do tego, czy wskaźnik należy do dowolnego obiektu jądra, do którego wątek ma uprawnienia — bez weryfikacji rzeczywistego typu obiektu. Umożliwia to lokalnemu wątkowi w trybie użytkownika przekazanie obiektu stosu wątku (np. z k_thread_stack_alloc()) i wykonanie kodu jądra w trybie supervisora.
- CVE-2026-19574Wysokie
W podsystemie MMU dla architektury ARM64 w Zephyr RTOS identyfikatory ASID przydzielane są przez prosty licznik round-robin, który po przekroczeniu 255 możliwych wartości zaczyna przydzielać te same ASID aktywnym domenom pamięci. Ponieważ mapowania domen są instalowane jako nieglobalne (MT_NG), ASID jest jedynym znacznikiem odróżniającym tłumaczenia w TLB, a ścieżka przełączenia kontekstu nie opróżnia TLB w przypadku kolizji osiągniętej przez trzecią domenę. W efekcie wątki w trybie użytkownika mogą czytać i zapisywać pamięć należącą do innej domeny, naruszając izolację domen pamięci.
Oryginalny opis (angielski, źródło NVD)
The user-mode syscall verifier z_vrfy_i2s_configure() in drivers/i2s/i2s_handlers.c copies the caller's struct i2s_config in from user memory and then, when cfg->frame_clk_freq is 0 (the API's "unconfigure the stream" request), jumps straight to z_impl_i2s_configure() without performing the K_SYSCALL_OBJ(config.mem_slab, K_OBJ_MEM_SLAB) ownership/type check or the block_size sanity check. The mem_slab field is a struct k_mem_slab *, so on that path a completely unvalidated, user-chosen pointer reaches driver code that is entitled to trust it as a real kernel object. Any thread running under CONFIG_USERSPACE that has access to an I2S device object can trigger this with a single i2s_configure() call. Most in-tree drivers special-case frame_clk_freq == 0 and never store the caller's structure, but drivers/i2s/i2s_litex.c does not: i2s_litex_configure() only logs a warning for a mismatched frame clock, then memcpy()s the caller's config into stream->cfg and marks the stream I2S_STATE_READY. A subsequent i2s_trigger() with I2S_TRIGGER_START enables the FIFO interrupt, and the interrupt handlers i2s_litex_isr_rx() / i2s_litex_isr_tx() then call k_mem_slab_alloc() and k_mem_slab_free() on the attacker-supplied pointer in supervisor context. The result is an arbitrary-pointer read/write primitive executed by the kernel on behalf of an unprivileged thread — k_mem_slab_alloc() takes a spinlock at slab->lock and reads and writes slab->free_list and the link word inside the returned "block" — which defeats the CONFIG_USERSPACE isolation boundary entirely. The same missing validation is a hazard for out-of-tree I2S drivers that retain the configuration on the unconfigure path. Builds without CONFIG_USERSPACE are unaffected, since the verifier is not used. The fix zeroes config.mem_slab and config.block_size on the unconfigure path so the driver can never receive an unvalidated pointer, while still allowing a stream to be unconfigured by a caller that does not own a memory slab, as the API documents.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

