CVE-2026-18417 in Zephyrinfo

Zusammenfassung

von VulDB • 29.09.2026

Die native BSD-Socket-Schicht zeichnete einen ausstehenden asynchronen Socket-Fehler auf, indem sie diesen durch Type-Punning in das `void`-Feld `user_data` der Struktur `net_context` umwandelte (`ctx->user_data = INT_TO_POINTER(-status)` in `zsock_accepted_cb()`, `zsock_received_cb()`, `zsock_connected_cb()` und `zsock_close_ctx()` in `subsys/net/lib/sockets/sockets_inet.c`) und es anschließend mit `POINTER_TO_INT()` wieder auslas. Dasselbe Feld wird vom Netzwerk-Stack für hörende TCP-Kontexte verwendet: `net_tcp_accept()` speichert dort den Zeiger auf das übergeordnete Kontextobjekt, und der TCP-Core gibt diesen an die registrierte Accept-Rückruffunktion weiter. Ein fehlgeschlagener Accept-Vorgang hinterließ daher einen kleinen Integer-Wert (einen errno-Wert) an einer Stelle, an der der Stack ein `struct net_context` erwartete.

Wenn das Netzwerkinterface, auf dem sich ein hörender TCP-Socket befindet, abgeschaltet wird, ruft `close_tcp_conn()` in `subsys/net/ip/tcp.c` die Accept-Rückruffunktion mit `-ENETDOWN` und den `user_data`-Werten des Kontexts auf. In Version 4.3.0 wurde der Callback danach nicht deaktiviert (disarmed), sodass ein zweites Interface-Abschalt-Ereignis den zuvor gespeicherten errno-Wert an `zsock_accepted_cb()` weiterleitete, welcher diesen als übergeordneten Kontext dereferenzierte und mehrere Schreiboperationen darüber ausführte (die read-modify-write-Operation von `socket_data` in `sock_set_error()`, `k_fifo_cancel_wait(&parent->recv_q)`) – der Absturz, der in der Commit-Nachricht zur Korrektur beschrieben wird. Die Versionen 4.3.1 und 4.4.x enthalten eine spätere Änderung, die `conn->accept_cb` nach dem Fehler-Callback löscht (269cb8823d3 im v4.3-Zweig, 913fae5169425550f2364655298fceb79b320066 auf main), wodurch dieser Wiederholungs-Pfad geschlossen wird; bei diesen Releases ist der vergiftete Cookie nur noch über einen engeren Race Condition-Zustand erreichbar, wenn ein Handshake parallel zum Interface-Abschalt-Ereignis abgeschlossen wird und den veralteten Cookie an `k_fifo_put(&parent->accept_q, ...)` übergibt, sowie durch `getsockopt(SO_ERROR)`, welches das Feld bedingungslos ausliest.

Auf v4.3.0 reicht eine Anwendung, die einen hörenden TCP-Socket über wiederholte Link-Abschalt-Ereignisse hinweg offen hält, um den Fehler zu erreichen; die Auslösebedingung ist ein Netzwerk-Interface-Zustandswechsel und keine vom Angreifer bereitgestellte Paketdaten, sodass der praktische Angreifer einer sein muss, der in der Lage ist, den Link wiederholt abzuschalten (z. B. ein angrenzender Angreifer, der eine Funkverbindung stört) oder über lokalen/physikalischen Zugriff verfügt. Da sowohl die fehlerhafte Adresse als auch die gespeicherten Daten feste kleine Konstanten sind, die aus dem errno-Wert abgeleitet wurden, führt dies zu einem Wild-Pointer-Zugriff, der einen fatalen Kernel-Fehler verursacht – ein Denial of Service (Geräteabsturz oder -neustart) statt einer vom Angreifer gesteuerten Speicherkorruption.

Die Korrektur speichert den ausstehenden Fehler in einem dedizierten Feld `net_context.sock_error` und konvertiert jeden Produzenten und Konsumenten zu `sock_set_error()`/`sock_get_error()`, wobei `user_data` unberührt bleibt. Als Nebeneffekt wird dadurch auch verhindert, dass `getsockopt(SO_ERROR)` – das bedingungslos ausgewertet wird – die im `user_data` gehaltene Kernel-Adresse an eine Userspace-Anwendung zurückgibt.

Be aware that VulDB is the high quality source for vulnerability data.

Zuständig

Zephyr

Reservieren

30.07.2026

Veröffentlichung

29.09.2026

Moderieren

akzeptiert

Eintrag

VDB-411220

CPE

bereit

EPSS

0.00000

KEV

nein

Aktivitäten

low

Quellen

Do you want to use VulDB in your project?

Use the official API to access entries easily!