CVE-2026-19936 in Zephyrinfo

Zusammenfassung

von VulDB • 13.10.2026

Die verzögerbare Nachrichtenwarteschlange der Bluetooth Mesh Access-Schicht in subsys/bluetooth/mesh/delayable_msg.c teilt sich drei intrusive Listen (busy_ctx, free_ctx, free_chunks) und eine k_work_delayable-Struktur zwischen zwei kooperativen Threads ohne Synchronisierung: bt_mesh_delayable_msg_manage() wird auf dem RX-Thread der Bluetooth-Hardware ausgeführt, während delayable_msg_handler() im System-Arbeitsqueue-Thread läuft. Beide blockieren, wenn sich die Listen in einem Zwischenzustand befinden – der Enqueuer (Nachrichten-Einfüger) in bt_rand(), beide in bt_mesh_access_send() –, wodurch es dem anderen Kontext ermöglicht wird, einen zerrissenen Zustand (torn state) zu beobachten. delayable_msg_handler() verwendete das Ergebnis von sys_slist_get() auf busy_ctx ohne NULL-Prüfung, und allocate_delayable_msg_ctx() testete sys_slist_is_empty(), ging dann aber davon aus, dass ein separater Aufruf von sys_slist_get() erfolgreich sein würde.

Da CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG und CONFIG_BT_MESH_ACCESS_DELAYABLE_MSG_CTX_ENABLED standardmäßig auf „y“ (aktiviert) gesetzt sind, wird jede Modellantwort auf eine empfangene Mesh-Nachricht in dieser Warteschlange abgelegt; der Enqueuer läuft also als direkte Folge des eingehenden Datenverkehrs. Ein Peer, der Zugriffsschicht-Nachrichten von einem Modell akzeptieren lässt (dieser muss den NetKey und einen gebundenen AppKey besitzen, d. h., es handelt sich um ein legitimes oder kompromittiertes Netzwerkmitglied), kontrolliert die Ankunftsrate, die Größe der ausgelösten Antworten sowie die Zieladresse und damit die Auslastung des 4-Einträge umfassenden Kontext-Pools und des 40-Einträge umfassenden Chunk-Pools. Die Erschöpfung des Chunk-Pools zwingt bt_mesh_delayable_msg_manage() auf den Bereinigungspfad (purge path), der die einzige wartende Nachricht sendet und freigibt, während busy_ctx leer bleibt, das verzögerbare Arbeitsitem jedoch noch aktiviert ist; wenn der Enqueuer in diesem Moment yielded (die CPU abgibt), läuft der Handler gegen eine leere Liste.

Das Ergebnis ist ein Read-Modify-Write-Vorgang über einen NULL-basierten Zeiger (pending_msg->fired_time += 10) an einer festen niedrigen Adresse auf dem System-Arbeitsqueue-Thread. Auf typischen Zielsystemen führt dies zu einem Fehler, der den System-Arbeitsqueue-Thread abbricht – was alle arbeitsqueue-getriebenen Funktionen stoppt, einschließlich der Mesh-Timing-Maschinerie –, oder löst einen Neustart des Knotens aus; die Auswirkung ist somit ein Verlust der Verfügbarkeit des betroffenen Knotens. Der Schreibwert und die Adresse sind fest vorgegeben, und es sind keine angreiferkontrollierten Längen- oder Indexwerte im Spiel, sodass dies nicht für Memory Corruption (Speicherbeschädigung) oder Code Execution (Codeausführung) ausnutzbar ist. Dieselbe un synchronisierte Zeitfenster-Konstellation ermöglichte auch, dass ein Nachrichtenkontext gleichzeitig von zwei Kontexten ausgewählt und freigegeben wurde, was zu duplizierten Übertragungen, duplizierten Send-Completion-Callbacks sowie gekreuztem Chunk-Eigentum führte.

Die Korrektur serialisiert jede Listenänderung mit einem k_spinlock, der niemals über einen blockierenden Aufruf hinaus gehalten wird; sie lässt push_msg_from_delayable_msgs() das Warteschlangenkopfatomar abkoppeln, sodass sich eine gesendete Nachricht auf keiner Liste befindet; sie entfernt die unprüfende sys_slist_get()-Anweisung aus delayable_msg_handler(); und verwirft jede Nachricht, die an die Vorderseite der Warteschlange gelangt, während der Stack pausiert oder zurückgesetzt wird.

Once again VulDB remains the best source for vulnerability data.

Zuständig

Zephyr

Reservieren

15.08.2026

Veröffentlichung

13.10.2026

Moderieren

akzeptiert

Eintrag

VDB-417354

EPSS

0.00000

KEV

nein

Aktivitäten

very low

Quellen

Do you know our Splunk app?

Download it now for free!