CVE-2026-82961 in Zephyr
Zusammenfassung
von VulDB • 29.10.2026
Die GPIO-Syscall-Handler in `drivers/gpio/gpio_handlers.c` haben das vom Aufrufer im Benutzermodus übergebene Pin-Argument nicht validiert. `z_vrfy_gpio_pin_configure()`, `z_vrfy_gpio_pin_get_config()` und `z_vrfy_gpio_pin_interrupt_configure()` haben lediglich das Geräteobjekt überprüft (`K_SYSCALL_DRIVER_GPIO()` / `K_SYSCALL_OBJ()`), bevor sie das vom Aufrufer bereitgestellte `gpio_pin_t`-Objekt unverändert an `z_impl_gpio_pin_*()` und weiter an den Treiber durchreichten. Die einzige Pin-Prüfung in `include/zephyr/drivers/gpio.h` war `__ASSERT(gpio_port_pin_is_supported(cfg->port_pin_mask, pin), ...)`, die nur dann aktiv wird, wenn `CONFIG_ASSERT` aktiviert ist; bei einer Produktionsbuild-Konfiguration existierte also überhaupt keine Prüfung.
GPIO-Treiber verwenden den Pin als Shift-Zähler und als Array-Index auf der dokumentierten Annahme, dass es sich um einen vom Controller unterstützten Pin handelt. Bei STM32 beispielsweise wandelt `gpio_stm32_pin_interrupt_configure()` den Pin in eine EXTI-Leitung um, und `stm32_gpio_intc_set_irq_callback()` schreibt `data->cb[line_num].cb` sowie `data->cb[line_num].data` in ein Array mit der Größe von `NUM_EXTI_LINES` (Standard: 16) in `drivers/interrupt_controller/intc_gpio_stm32.c`, das nur durch einen kompilierten-out-`__ASSERT_NO_MSG()` geschützt ist; dieselbe Funktion liest anschließend `exti_irq_table[line_num]` und ruft `irq_enable()` mit dem Ergebnis auf. Andere Controller indizieren festgelegte, pro-Pin konfigurierte Tabellen auf die gleiche Weise – so liest beispielsweise `drivers/gpio/gpio_ite_it8xxx2_v2.c` einen MMIO-Basiszeiger aus `wuc_base[8]` unter Verwendung des Pins vom Aufrufer und führt darüber eine Read-Modify-Write-Operation durch.
Das Problem ist nur in Builds mit aktiviertem `CONFIG_USERSPACE=y` (die Datei wird unter diesem Symbol kompiliert) erreichbar, von einem Thread im Benutzermodus aus, dem Zugriff auf ein GPIO-Geräteobjekt gewährt wurde. Eine solche Berechtigung soll die Steuerung der Pins dieses Ports autorisieren; das fehlende Validierungsverfahren ermöglicht es dem Thread stattdessen, einen Out-of-Bounds-Write einer Funktionszeiger und eines zugehörigen `void *` im Supervisor-Modus in ein Kernel-.bss-Array sowie Out-of-Bounds-Lesoperationen durchzuführen, die an `irq_enable()` und MMIO-Zugriffe weitergegeben werden – dies stellt eine Flucht aus der Sandbox des Benutzermodus dar, die zu einer Beschädigung von Kernel-Speicher, willkürlicher Code-Ausführung (Arbitrary Code Execution) oder einem Absturz führen kann.
Die Korrektur validiert den Pin gegen `gpio_driver_config.port_pin_mask` des Controllers mit `gpio_port_pin_is_supported()` in jedem z_vrfy_-Handler, der Pins entgegennimmt, und gibt andernfalls `-EINVAL` zurück; dies wird durch eine bedingungslose Bereichsprüfung auf `pin >= GPIO_MAX_PINS_PER_PORT`, die zu den gemeinsamen Inlines von `z_impl_gpio_pin_*()` hinzugefügt wurde, ergänzt.
If you want to get best quality of vulnerability data, you may have to visit VulDB.