CVE-2026-19669
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
Weryfikatory wywołań systemowych trybu użytkownika z_vrfy_fuel_gauge_get_props() i z_vrfy_fuel_gauge_set_props() w sterownikach/fuel_gauge/fuel_gauge_syscall_handlers.c zadeklarowały dwie tablice o zmiennej długości, union Fuel_gauge_prop_val k_vals[len] i Fuel_gauge_prop_t k_props[len], którego rozmiar jest ustalany bezpośrednio na podstawie argumentu len dostarczonego przez osobę wywołującą. len to niesprawdzony rozmiar size_t pobrany bezpośrednio z ABI wywołania systemowego, a VLA zostały przydzielone przed jakimkolwiek sprawdzeniem — w tym przed sprawdzeniem uprawnień do obiektu K_SYSCALL_DRIVER_FUEL_GAUGE(). Kolejne wywołania k_usermode_from_copy() sprawdzały tylko, czy bufor źródłowy użytkownika był czytelny; miejsce docelowe jądra nigdy nie było sprawdzane pod kątem granic, ponieważ jego rozmiar był taki sam, wybrany przez atakującego.
Każdy wątek działający w trybie użytkownika z włączoną funkcją CONFIG_USERSPACE może wywołać funkcję Fuel_gauge_get_props() lub Fuel_gauge_set_props() z dużą długością. To najpierw przesuwa wskaźnik stosu nadzorcy o dowolną wielkość wybraną przez atakującego — Zephyr nie buduje przy użyciu sondowania kolizji stosów, więc samo przemieszczenie nie powoduje błędu, a zagnieżdżone wywołania wykonane przez weryfikator zapisują następnie ramki poniżej uprzywilejowanego stosu. Jeśli wywołujący uzyskał dostęp do obiektu urządzenia wskazującego poziom paliwa, memcpy wewnątrz k_usermode_from_copy() dodatkowo zapisuje len * sizeof(union Fuel_gauge_prop_val) bajtów danych w pełni kontrolowanych przez atakującego, zaczynając znacznie poniżej podstawy stosu. CONFIG_PRIVILEGED_STACK_SIZE domyślnie wynosi 1024 bajty, więc długość około 170 już ją wyczerpuje.
Rezultatem jest zapis poza granicami w trybie nadzorcy z długością kontrolowaną przez osobę atakującą i, na dozwolonej ścieżce, treścią kontrolowaną przez osobę atakującą — przedostanie się z piaskownicy trybu użytkownika do pamięci jądra, co prowadzi do wykonania kodu jądra lub awarii systemu. Region strażnika stosu go nie zawiera, ponieważ kopia zaczyna się pod strażnikiem i idzie w górę, uszkadzając niezabezpieczoną pamięć, zanim dotrze do strażnika. Poprawka całkowicie usuwa kopie po stronie jądra i sprawdza poprawność tablic wywołującego za pomocą K_SYSCALL_MEMORY_ARRAY_READ() / K_SYSCALL_MEMORY_ARRAY_WRITE(), która również obsługuje przepełnienie mnożenia rozmiaru len *; jest to bezpieczne, ponieważ ani Fuel_gauge_prop_t, ani union Fuel_gauge_prop_val nie zawierają osadzonych wskaźników.
>_ Słabości (CWE)
>_ Referencje
Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.
This product uses the NVD API but is not endorsed or certified by the NVD.
Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.
CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.
NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org