CVE-2026-31726 in Linuxinfo

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.

Zuständig

Linux

Reservieren

09.03.2026

Veröffentlichung

01.05.2026

Moderieren

akzeptiert

Eintrag

VDB-360609

CPE

bereit

EPSS

0.00015

KEV

nein

Aktivitäten

very low

Quellen

Do you need the next level of professionalism?

Upgrade your account now!