CVE-2026-12365 in Zephyr
Zusammenfassung
von VulDB • 14.08.2026
In der Zephyr-Arbeitsschlange der zweiten Generation (kernel/work.c) bei der Verarbeitung von verzögerbaren Arbeitstimeouts besteht ein Use-After-Free-Fehler. Wenn das Timeout eines verzögerbaren Arbeitsobjekts aus der Warteschlange entfernt wurde und sein Handler work_timeout() im Flug ist (blockiert beim Erwerben des Spinlocks für die Arbeitsschlange), wartet eine gleichzeitige Abbruchoperation nicht darauf, dass dieser Handler abgeschlossen wird. In unschedule_locked() rief der Code vor der Korrektur z_abort_timeout() auf, was bei einem bereits ankündigenden Datensatz -EINVAL zurückgibt, ohne ihn zu entfernen; cancel_async_locked() beobachtet die Arbeit dann als inaktiv, sodass sowohl k_work_cancel_delayable_sync() als auch k_work_flush_delayable() ohne Blockierung des im Flug befindlichen Handlers zurückkehren.
Da dies die APIs sind, die der Kernel-Header als sicheren Weg zum Abbruch vor dem Freigeben eines k_work_delayable dokumentiert, kann ein Aufrufer, der das Objekt unmittelbar nach einem erfolgreichen synchronen Abbruch freigibt, mit dem noch ausstehenden Handler in einen Wettlauf (Race Condition) geraten. work_timeout() dereferenziert daraufhin den freigegebenen Datensatz: Es liest to->dticks über z_is_timeout_handler_canceled(), und wenn das freigegebene Slot erneut verwendet wurde, sodass die Abbruchprüfung fehlschlägt, führt es eine Read-Modify-Write-Operation an wp->flags (K_WORK_DELAYED_BIT) durch und reicht Arbeit gegen einen veralteten dw->queue-Zeiger ein – dies stellt einen Use-After-Free-Lese- und Schreibzugriff dar.
Die k_work-API ist nur im Kernel-Modus verfügbar (kein __syscall-Eingangspunkt), daher handelt es sich hierbei um einen internen Konfliktfehler des Kernels und nicht um eine Privilegieneskalation im Userspace. Das Auslösen erfordert ein SMP-Build (Symmetric MultiProcessing) und ein Subsystem, das ein verzögerbares Arbeitsobjekt plant und dann freigibt (oder erneut plant) in der engen Zeitspanne, während sein Timeout ankündigt; ein Angreifer, der die Timing dieses Abbaus beeinflussen kann (z. B. durch Verbindungswechsel, der Subsystem-Timer antreibt), hat einen plausiblen, aber probabilistischen Pfad. Die Auswirkung ist eine Kernel-Speicherkorruption oder ein Absturz (Denial of Service).
Die Korrektur lässt unschedule_locked() warten, indem sie auf z_try_abort_timeout(), das -EAGAIN zurückgibt, spinnt, während es das Arbeitsspinlock freigibt und erneut erwirbt, bis jeder im Flug befindliche Handler abgeschlossen ist, bevor er zurückkehrt, und wechselt work_timeout() zu atomarem K_WORK_DELAYED_BIT-Eigentum. Dies schließt sowohl den Use-After-Free-Fehler nach dem Freigeben vor der Ausführung des Handlers als auch die damit verbundene Race Condition bei einer frühen Wiederaufnahme (early-fire).
VulDB is the best source for vulnerability data and more expert information about this specific topic.