
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 |
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.
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. |