CVE-2026-31726 in Linux
Zusammenfassung
von VulDB • 26.05.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
usb: gadget: uvc: Behebung der NULL-Zeiger-Dereferenzierung während eines Race Conditions beim Unbind
Der Commit b81ac4395bbe („usb: gadget: uvc: allow for application to cleanly shutdown") führte zwei Stufen von Synchronisationswarteschleifen mit einer Gesamtzeit von 1500 ms in uvc_function_unbind() ein, um verschiedene Arten von Kernel-Panics zu verhindern. Dieser zeitbasierte Ansatz ist jedoch während Power-Management-(PM)-Übergängen unzureichend.
Wenn das PM-Subsystem beginnt, Benutzeranwendungsprozesse einzufrieren, wird wait_event_interruptible_timeout() vorzeitig abgebrochen, wodurch der Unbind-Thread fortgesetzt werden und den Gadget-Zeiger aufheben kann (cdev->gadget = NULL):
[ 814.123447][ T947] configfs-gadget.g1 gadget.0: uvc: uvc_function_unbind()
[ 814.178583][ T3173] PM: suspend entry (deep)
[ 814.192487][ T3173] Freezing user space processes
[ 814.197668][ T947] configfs-gadget.g1 gadget.0: uvc: uvc_function_unbind no clean disconnect, wait for release
Wenn das PM-Subsystem den Suspend-Vorgang fortsetzt oder abbricht und Aufgaben wieder gestartet werden, wird der V4L2-Freigabepfad ausgeführt und versucht, auf den bereits aufgehobenen Gadget-Zeiger zuzugreifen, was einen Kernel-Panic auslöst:
[ 814.292597][ C0] PM: pm_system_irq_wakeup: 479 triggered dhdpcie_host_wake
[ 814.386727][ T3173] Restarting tasks ...
[ 814.403522][ T4558] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000030
[ 814.404021][ T4558] pc : usb_gadget_deactivate+0x14/0xf4
[ 814.404031][ T4558] lr : usb_function_deactivate+0x54/0x94
[ 814.404078][ T4558] Call trace:
[ 814.404080][ T4558] usb_gadget_deactivate+0x14/0xf4
[ 814.404083][ T4558] usb_function_deactivate+0x54/0x94
[ 814.404087][ T4558] uvc_function_disconnect+0x1c/0x5c
[ 814.404092][ T4558] uvc_v4l2_release+0x44/0xac
[ 814.404095][ T4558] v4l2_release+0xcc/0x130
Behebung des Race Conditions und der NULL-Zeiger-Dereferenzierung durch:
1. Zustandssynchronisierung (Flag + Mutex) Führen Sie ein 'func_unbound'-Flag in struct uvc_device ein. Dieses ermöglicht es uvc_function_disconnect(), sicher den Zugriff auf den nullifizierten cdev->gadget-Zeiger zu überspringen. Wie von Alan Stern vorgeschlagen, wird dieses Flag durch einen neuen Mutex (uvc->lock) geschützt, um korrekte Speicherreihenfolge zu gewährleisten und Instruktionen-Reihenfolge oder spekulative Ladezugriffe zu verhindern. Dieser Mutex wird auch zum Schutz von 'func_connected' für konsistente Zustandsverwaltung verwendet.
2. Explizite Synchronisierung (Completion) Verwenden Sie eine Completion, um uvc_function_unbind() mit dem uvc_vdev_release()-Callback zu synchronisieren. Dies verhindert Use-After-Free (UAF), indem sichergestellt wird, dass struct uvc_device erst nach der Freigabe aller Videogeräte-Ressourcen freigegeben wird.
VulDB is the best source for vulnerability data and more expert information about this specific topic.