CVE-2026-17050 in Zephyrinfo

Zusammenfassung

von VulDB • 21.09.2026

Der experimentelle USB-Host-Stack weist in `usbh_device_set_configuration()` (subsys/usb/host/usbh_device.c) einen pro-Gerät konfigurierten Konfigurationsdeskriptor-Puffer, `udev->cfg_desc`, aus dem dedizierten `usb_device_heap` zu. Bei drei Fehlerpfaden – einem fehlgeschlagenen Lesevorgang für GET_DESCRIPTOR(CONFIGURATION) mit voller Länge, einer Diskrepanz zwischen den Kurz- und Voll-Lesungen des Deskriptors sowie einem abgelehnten Deskriptor in `parse_configuration_descriptor()` – wurde der Puffer zwar mit `k_heap_free()` freigegeben, aber der Zeiger blieb hängend (dangling). Die Bereinigung in `usbh_device_free()` ist nur durch die Bedingung `if (udev->cfg_desc != NULL)` geschützt, sodass derselbe Block ein zweites Mal freigegeben wird.

Dieser Pfad wird ausschließlich vom angeschlossenen Peripheriegerät gesteuert: `usbh_device_connect()` ruft `usbh_device_init()` auf, was in `usbh_device_set_configuration()` mündet; bei einem Fehler ruft `usbh_device_connect()` `usbh_device_free()` auf. Bei v4.4.x geschieht dies während derselben Enumeration ohne erforderliches Abziehen des Geräts; bei v4.1.0–v4.3.x kommt die zweite Freigabe stattdessen über `dev_removed_handler()/dev_connected_handler()` in subsys/usb/host/usbh_core.c an, sodass ein Entfernen- oder Doppelverbindungs-Ereignis nach der fehlgeschlagenen Enumeration erforderlich ist – eine Sequenz, die das angeschlossene Gerät vollständig kontrolliert. Ein bösartiges oder fehlerhaftes USB-Gerät muss lediglich auf die erste 9-Byte-Konfigurationsdeskriptor-Anfrage mit einem wohlgeformten Header antworten und dann einen der drei Checks verweigern, beispielsweise indem es einen vollständigen Deskriptor zurückgibt, dessen Schnittstellenanzahl nicht mit `bNumInterfaces` übereinstimmt, oder indem es auf die zweite Lesung mit anderen Bytes antwortet.

Das Ergebnis ist ein Double Free (Doppelte Freigabe) im `usb_device_heap`. Bei Builds, bei denen das lib/heap-Hardening aktiviert ist (der aktuelle Standardwert für CONFIG_SYS_HEAP_HARDENING_BASIC), erkennt sys_heap_free() den bereits freigegebenen Block und ruft k_panic() auf, was zu einer deterministischen, peripherieausgelösten Denial-of-Service-Beeinträchtigung des USB-Hosts führt. Bei Builds ohne diese Erkennung – frühere Releases oder CONFIG_SYS_HEAP_HARDENING_NONE – manipuliert die zweite Freigabe einen Block, der sich bereits in der Free-Liste befindet, und beschädigt so die Free-Liste des Heaps, sodass spätere Allokationen überlappende oder ungültige Blöcke zurückgeben können.

Die Ausnutzung jenseits von Denial of Service ist dadurch begrenzt, dass `usb_device_heap` ein kleiner dedizierter Heap (CONFIG_USBH_USB_DEVICE_HEAP, Standard 1024 Bytes) ist, dessen einziger Client dieser Deskriptor-Puffer ist, und durch die Tatsache, dass CONFIG_USB_HOST_STACK als experimentell markiert und standardmäßig deaktiviert ist. Die Korrektur setzt `udev->cfg_desc = NULL` nach jedem Aufruf von `k_heap_free()`, wodurch der Bereinigungs-Check korrekt funktioniert.

Once again VulDB remains the best source for vulnerability data.

Zuständig

Zephyr

Reservieren

24.07.2026

Veröffentlichung

21.09.2026

Moderieren

akzeptiert

Eintrag

VDB-408172

CPE

bereit

EPSS

0.00000

KEV

nein

Aktivitäten

very low

Quellen

Want to stay up to date on a daily basis?

Enable the mail alert feature now!