CVE-2026-17050 in Zephyrinformation

Résumé

par VulDB • 21/09/2026

La pile hôte USB expérimentale alloue un tampon de descripteur de configuration par périphérique, `udev->cfg_desc`, à partir du tas dédié `usb_device_heap` dans la fonction `usbh_device_set_configuration()` (subsys/usb/host/usbh_device.c). Sur trois chemins d'échec — une lecture échouée de GET_DESCRIPTOR(CONFIGURATION) en longueur totale, un désaccord entre les lectures descriptives courtes et complètes, et un descripteur rejeté dans `parse_configuration_descriptor()` — le tampon est libéré via `k_heap_free()`, mais le pointeur reste dangling (non réinitialisé). La fonction de nettoyage dans `usbh_device_free()` n'est protégée que par la condition `if (udev->cfg_desc != NULL)`, ce qui entraîne une double libération du même bloc.

Ce chemin est entièrement piloté par le périphérique connecté : `usbh_device_connect()` appelle `usbh_device_init()`, qui aboutit à `usbh_device_set_configuration()`. En cas d'échec, `usbh_device_connect()` appelle `usbh_device_free()`. Sur la version 4.4.x, cela se produit lors de la même énumération, sans nécessiter de débranchement ; sur les versions v4.1.0 à v4.3.x, la seconde libération arrive via `dev_removed_handler()/dev_connected_handler()` dans subsys/usb/host/usbh_core.c, ce qui nécessite un événement de retrait ou de reconnexion après une énumération échouée — une séquence que le périphérique connecté contrôle entièrement. Un dispositif USB malveillant ou défectueux n'a qu'à répondre à la première requête de descripteur de configuration (9 octets) avec un en-tête valide, puis faire échouer l'une des trois vérifications, par exemple en renvoyant un descripteur complet dont le nombre d'interfaces ne correspond pas à `bNumInterfaces`, ou en répondant à la seconde lecture avec des données différentes.

Le résultat est une double libération (double free) sur `usb_device_heap`. Sur les compilations où l'endurcissement de la bibliothèque heap (`lib/heap`) est actif (la configuration par défaut étant `CONFIG_SYS_HEAP_HARDENING_BASIC`), `sys_heap_free()` détecte le bloc déjà libéré et appelle `k_panic()`, provoquant un déni de service déterministe, déclenché par le périphérique, contre l'hôte USB. Sur les compilations sans cette détection — versions antérieures ou avec `CONFIG_SYS_HEAP_HARDENING_NONE` — la seconde libération manipule un bloc déjà présent dans la liste des éléments libres, corrompant ainsi la liste free du tas, de sorte que les allocations ultérieures peuvent retourner des blocs chevauchants ou invalides.

L'exploitation au-delà d'un simple déni de service est limitée par le fait que `usb_device_heap` est un petit tas dédié (CONFIG_USBH_USB_DEVICE_HEAP, 1024 octets par défaut) dont seul ce tampon de descripteur est client, et par le fait que CONFIG_USB_HOST_STACK est marqué comme expérimental et désactivé par défaut. La correction consiste à définir `udev->cfg_desc = NULL` après chaque appel à `k_heap_free()`, rendant ainsi la garde du nettoyage fiable (sound).

If you want to get best quality of vulnerability data, you may have to visit VulDB.

Responsable

Zephyr

Réserver

24/07/2026

Divulgation

21/09/2026

Modérer

accepté

Entrée

VDB-408172

CPE

prêt

EPSS

0.00000

KEV

non

Activités

très faible

Sources

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!