
Proof-of-concept-Exploit für CVE-2026-10672, ein Out-of-Bounds-Lesen im LwM2M-Firmware-Update-Pull-Client von Zephyr RTOS. Enthält eine eigenständige C-Reproduktion und einen bösartigen CoAP/LwM2M-Server zum Testen.
Proof of Concept für CVE-2026-10672, einen Out-of-Bounds-Read im LwM2M-Firmware-Update-Pull-Client von Zephyr RTOS (subsys/net/lib/lwm2m/lwm2m_pull_context.c).
lwm2m_pull_context_start_transfer() in lwm2m_pull_context.cmemcpy(context.uri, uri, LWM2M_PACKAGE_URI_LEN) kopiert genau 128 Byte in char uri[128] ohne NUL-Terminator, wenn die vom Server bereitgestellte Package-URI (/5/0/1) ≥ 128 Byte ist. Nachfolgende strlen(context.uri), http_parser_parse_url() und der CoAP-PROXY_URI-Option-Anhang lesen dann über den Puffer hinaus in angrenzenden Strukturspeicher (is_firmware_uri, die Funktionszeiger result_cb / write_cb und den DTLS-Verbindungskontext). Die überlesenen Bytes werden in der ausgehenden CoAP-Anfrage exfiltriert.context.uri[128] (CONFIG_LWM2M_SWMGMT_PACKAGE_URI_LEN, Standard 128; LWM2M_PACKAGE_URI_LEN ist als #define darauf definiert)99a164df5cea5af76e32b57c6d51854f018969a2 – fügt strlen(uri) >= sizeof(context.uri) → -ENOMEM hinzu und wechselt zu strcpy().| Datei | Zweck |
|---|---|
poc.c | Eigenständige C-Reproduktion der anfälligen/behobenen Codepfade. Deklariert originalgetreu struct firmware_pull_context (den uri[128]-Puffer plus die angrenzenden Felder, die überlesen werden) und den leckenden CoAP-PROXY_URI-Konsumenten. |
lwm2m_evil_server.py | Minimaler CoAP/LwM2M-Server, der die überdimensionierte Package-URI an /5/0/1 eines anfälligen Clients über UDP (NoSec-Modus) liefert – die Netzwerk-Übermittlungshälfte des Angriffs. Keine externen Abhängigkeiten. |
gcc -O0 -g -o poc poc.c
./poc
Erwartet: Eine 200-Byte-Package-URI erzeugt eine CoAP-PROXY_URI-Option von 141 Byte – die 128-Byte-URI plus 13 Byte, die aus context.is_firmware_uri, Struktur-Padding und den Funktionszeigern result_cb/write_cb ausgelesen werden. Der behobene Codepfad weist die URI mit -ENOMEM zurück und kopiert nichts.
gcc -O0 -g -fsanitize=address -o poc-asan poc.c
./poc-asan
Der Testallokator reserviert exakt 128 Byte, füllt sie mit Nicht-NUL-Bytes (Spiegelung eines vollen context.uri ohne Terminator) und ruft strlen() auf:
ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 129 at 0x...
0x... is located 0 bytes after 128-byte region [...,0x...)
# CoAP-Pakete bauen und inspizieren, ohne zu senden:
python3 lwm2m_evil_server.py --dry-run --uri-len 200
# An einen anfälligen Client senden (NoSec CoAP, UDP/5683):
python3 lwm2m_evil_server.py --target 10.0.0.42 --port 5683 --uri-len 200 --listen 2
Das Skript sendet ein CoAP PUT /5/0/1 (LwM2M-Schreiben der Package-URI-Ressource) gefolgt von einem CoAP POST /5/0/2 (LwM2M-Ausführen Update, das den Firmware-Pull startet und den Fehler auslöst). Im Produktivbetrieb von LwM2M läuft die Sitzung über DTLS (UDP/5684); der Angreifer im Rahmen ist ein bösartiger/kompromittierter Verwaltungsserver oder ein Pfadgegner, wenn die DTLS-Serverauthentifizierung nicht erzwungen wird.
Nur für autorisierte Sicherheitsforschung und Bildungszwecke. Verwenden Sie diese Werkzeuge nicht gegen Geräte, die Ihnen nicht gehören oder für deren Test Sie keine ausdrückliche Erlaubnis haben.