CVE-2026-87041
WysokieCVSS 7.8Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 2 - wyżej niż 2% wszystkich znanych CVE
Streszczenie
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.
Ocena ryzyka
Lokalny użytkownik lub złośliwy wątek w przestrzeni użytkownika może uzyskać zapis do dowolnej pamięci jądra, ujawnić jej zawartość lub doprowadzić do awarii systemu, całkowicie omijając izolację CONFIG_USERSPACE. Dotyczy to każdego obrazu zbudowanego z tą konfiguracją i włączonym wsparciem RTIO dla przestrzeni użytkownika.
Rekomendacja
Zaktualizuj Zephyr RTOS do wersji zawierającej poprawkę (v4.3.0 lub nowszej), która neguje wyniki K_SYSCALL_MEMORY() i dodatkowo waliduje bufor nadawczy TXRX w trybie tylko do odczytu. Do czasu aktualizacji ogranicz przydzielanie kontekstów RTIO niezaufanym wątkom w przestrzeni użytkownika.
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-87039Wysokie
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().
- 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 RTIO submission-queue verifier rtio_vrfy_sqe() in subsys/rtio/rtio_syscalls.c (subsys/rtio/rtio_handlers.c before v4.3.0) accumulated the results of K_SYSCALL_MEMORY() into its valid_sqe flag with &=. That macro returns nonzero on failure (it is built on K_SYSCALL_VERIFY_MSG(), which yields !(expr)), so every buffer permission check contributed the opposite of its result. A submission whose tx.buf, rx.buf or txrx.tx_buf/txrx.rx_buf pointer was not accessible to the calling thread was accepted, while a legitimate, thread-owned buffer caused the calling thread to be killed with a kernel oops. The verifier runs on behalf of the rtio_sqe_copy_in_get_handles() system call (also reached through the inline rtio_sqe_copy_in() wrapper), so it is driven directly by untrusted user-mode input on any image built with CONFIG_USERSPACE. A user thread that has been granted an RTIO context and an rtio_iodev object — the intended usage of RTIO userspace support, established via rtio_access_grant() — can submit an SQE whose buffer pointer and length name arbitrary kernel memory; the object check on sqe->iodev is unaffected and still passes, and the crafted SQE is forwarded to the bus driver unchanged. Downstream consumers dereference the pointer with supervisor privilege. The generic I2C and I3C RTIO fallback handlers (drivers/i2c/i2c_rtio_default.c, drivers/i3c/i3c_rtio_default.c) copy sqe.rx.buf/sqe.tx.buf into struct i2c_msg and call i2c_transfer(), and the vendor SPI/I2C RTIO drivers behave equivalently. An RTIO_OP_RX submission therefore has peripheral data written into kernel memory of the attacker's choosing (arbitrary kernel write), an RTIO_OP_TX submission clocks kernel memory out over the bus (kernel memory disclosure), and a pointer to unmapped memory faults the kernel. This is a full escape from the user-mode isolation boundary that CONFIG_USERSPACE exists to enforce. The defect was masked for years because the in-tree user-mode RTIO tests only exercise RTIO_OP_NOP and mempool-backed reads, neither of which reaches the affected checks. The fix negates each K_SYSCALL_MEMORY() result and additionally validates the TXRX transmit buffer read-only, matching the SPI, I2C and I3C handlers.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

