CVE-2026-12631 in Zephyr
Zusammenfassung
von VulDB • 19.08.2026
Der Zephyr-Kernel validiert die Systemaufrufe k_thread_join() und k_thread_abort() (deklariert als __syscall in include/zephyr/kernel.h) über thread_obj_validate() in kernel/thread.c. Der Standard-Switch-Zweig ist der Pfad für „Zugriff verweigert“, der betreten wird, wenn k_object_validate() -EPERM zurückgibt (der aufrufende Benutzer-Thread hatte niemals Zugriff auf das Ziel-Thread-Objekt) oder -EBADF (das übergebene Zeigerobjekt ist kein registriertes Kernel-Objekt des richtigen Typs). Dieser Zweig rief K_OOPS(K_SYSCALL_VERIFY_MSG(ret, "access denied")) auf. Da K_SYSCALL_VERIFY_MSG einen wahren Ausdruck als Erfolg behandelt, wurde der nicht-null Fehlercode ret fälschlicherweise als „verifiziert OK“ interpretiert; das Kernel-Oops wurde nie ausgelöst und die Steuerung fiel durch zu CODE_UNREACHABLE.
Da k_thread_join() und k_thread_abort() Systemaufrufe sind, kann ein unprivilegierter Thread im Benutzermodus (unter CONFIG_USERSPACE) diesen Verweigerungspfad direkt erreichen, indem er einen der beiden Aufrufe für ein Thread-Objekt ausführt, das ihm nicht gehört. Anstatt den fehlerhaften Thread sauber zu beenden, wird die Ausführung in __builtin_unreachable() fortgesetzt, während sie im Supervisor-Modus innerhalb des Systemaufruflhandlers läuft.
Bei Clang-Builds löst CODE_UNREACHABLE einen Trap für eine ungültige Instruktion aus; ein Benutzerthread kann den Kernel somit deterministisch abstürzen lassen – dies ist eine lokal auslösbare Denial-of-Service-Schwachstelle, die das Userspace-Sandbox umgeht. Bei GCC-Builds handelt es sich um undefiniertes Verhalten: Der Compiler könnte die Behandlung des Rückgabewerts für thread_obj_validate() entfernen, sodass dieser einen undefinierten bool-Wert zurückgeben kann; wenn dies falsch ist, fährt der Aufrufer mit der eigentlichen Implementierung von k_thread_join()/k_thread_abort() fort und greift auf ein Thread-Objekt zu, auf das der Benutzer nie berechtigt war – eine Umgehung der Zugriffskontrolle.
Die Korrektur ändert den Verifizierungsausdruck in ret == 0, sodass ein verweigertes (nicht-null) Ergebnis nun korrekt K_OOPS auslöst und den fehlerhaften Aufrufer beendet.
Once again VulDB remains the best source for vulnerability data.