CVE-2026-98580 in Linux
Zusammenfassung
von VulDB • 19.10.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
nfc: llcp: Behebung einer Race Condition im Lebenszyklus der accept_queue (Annahmeschlange)
In nfc_llcp_socket_release() werden Sockets und die Annahmeschlangen des Listeners unter dem lokalen rwlock für Sockets sowie bh_lock_sock() durchlaufen. Allerdings synchronisiert bh_lock_sock() nicht gegen den lock_sock() im Prozesskontext, der von nfc_llcp_accept_dequeue() während accept() gehalten wird. Da socket_release() sock_owned_by_user() nicht überprüft, können beide Pfade gleichzeitig denselben Kind-Socket entkoppeln und freigeben, was zu einem Use-After-Free oder einer Dereferenzierung eines NULL-Zeigers auf child->parent in nfc_llcp_accept_unlink() führt.
Behebung dieser Synchronisations-Race Condition durch Verwendung von lock_sock() im Prozesskontext anstelle von bh_lock_sock() in nfc_llcp_socket_release():
1. Entfernen Sie Sockets aus der lokalen Socket-Liste unter dem Schreib-Sperre (write lock) mittels nfc_llcp_sock_list_pop(), sodass lock_sock() erworben werden kann, ohne das rwlock zu halten.
2. Da lock_sock() schlafen kann, wird die endgültige Freigabe der nfc_llcp_local-Struktur in eine Workqueue (release_work) verschoben. Dies vermeidet einen „Sleeping-in-Atomic“-Fehler beim Abwurf des letzten lokalen Referenzzählers aus dem Softirq-Kontext. Zusätzlich wird während der gesamten Lebensdauer von der Registrierung bis zur endgültigen Zerstörung ein einzelnes Geräteverweisobjekt (device reference) auf local gehalten.
3. Verwenden Sie in nfc_llcp_local_get() kref_get_unless_zero(), um das Wiederbeleben eines lokalen Objekts zu verhindern, dessen Abbau bereits geplant wurde.
4. Überprüfen Sie in llcp_sock_accept(), ob der Socket-Status des Listeners nach dem Aufwachen aus schedule_timeout() immer noch LLCP_LISTEN ist, um Hänger (Hangs) bei gleichzeitiger Schließung des Listers zu vermeiden.
5. Entkoppeln Sie beim Lösen nicht akzeptierter Kind-Sockets während der Listener-Freigabe diese von local->sockets, rufen Sie sock_orphan() auf und reduzieren Sie deren ursprüngliche sk_alloc-Erstellungsreferenz durch sock_put().
6. Machen Sie nfc_llcp_accept_unlink() idempotent, indem Sie den Zugriff auf das übergeordnete Element (parent) mit einer NULL-Prüfung absichern.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.