CVE-2026-90585
ŚrednieCVSS 4.6Streszczenie
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().
Ocena ryzyka
Zwykły błąd linii odbioru (overrun, framing, parity lub break) wywołany przez urządzenie po drugiej stronie łącza zawiesza cały system, ponieważ CPU pozostaje uwięziony w wielokrotnie wchodzącym ISR i nie wraca do kontekstu wątku. Wpływa to wyłącznie na dostępność — wymagany jest zewnętrzny reset lub watchdog sprzętowy; brak korupcji pamięci i wycieku informacji.
Rekomendacja
Zaktualizować Zephyr do wersji zawierającej poprawkę sterownika uart_renesas_ra_sci, która potwierdza warunek błędu i czyści flagi przerwania niezależnie od zarejestrowania callbacku. Do czasu aktualizacji unikać wywołań uart_configure() i uart_irq_err_enable() na instancjach używanych w trybie odpytywania lub bez ustawionego callbacku.
Inne podatności w Zephyr RTOS
Zobacz wszystkie- 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-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 Renesas RA SCI UART driver's receive-error ISR, uart_ra_sci_eri_isr() in drivers/serial/uart_renesas_ra_sci.c, acknowledged the error condition only when a Zephyr interrupt-driven callback had already been registered. With CONFIG_UART_INTERRUPT_DRIVEN=y and CONFIG_UART_ASYNC_API=n, if data->user_cb is NULL the ISR body is empty: the SCI error flags (SSR.ORER, SSR.FER, SSR.PER) are left set and the ICU event flag R_ICU->IELSR_b[eri_irq].IR is never cleared, so the interrupt re-pends immediately and the ISR is re-entered without end. The error interrupt is masked at boot by uart_ra_sci_init(), but FSP's R_SCI_UART_Open() unconditionally re-enables it, and uart_ra_sci_configure() - the back end of the public uart_configure() API, enabled by default via CONFIG_UART_USE_RUNTIME_CONFIGURE - performs a Close()/Open() pair without re-masking it. Any runtime uart_configure() therefore leaves the error interrupt live regardless of whether a callback has been set, as does calling uart_irq_err_enable() on its own. An instance used with the polling API, or the window between uart_configure() and uart_irq_callback_user_data_set(), thus runs with the error interrupt unmasked and no callback registered. The trigger is an ordinary receive line error - overrun, framing, parity, or a break condition - which is fully determined by the device attached to the serial link. A peer able to assert a break or transmit at a mismatched baud rate produces such an error at will, so a single frame is enough to enter the state. The impact is availability only: the CPU is captured in the re-entering ISR and never returns to thread context, hanging the entire system until an external reset or hardware watchdog fires. There is no memory corruption or information disclosure. Builds using the asynchronous UART API are unaffected, because the fall-through to FSP's sci_uart_eri_isr() clears both the error flags and the pending IRQ.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

