
Exploit de preuve de concept pour CVE-2026-10672, une lecture hors limites dans le client de tirage de mise à jour de firmware LwM2M de Zephyr RTOS. Comprend une reproduction C autonome et un serveur CoAP/LwM2M malveillant pour les tests.
Preuve de concept pour CVE-2026-10672, une lecture hors limites dans le client de mise à jour du firmware LwM2M de Zephyr RTOS (subsys/net/lib/lwm2m/lwm2m_pull_context.c).
lwm2m_pull_context_start_transfer() dans lwm2m_pull_context.cmemcpy(context.uri, uri, LWM2M_PACKAGE_URI_LEN) copie exactement 128 octets dans char uri[128] sans terminateur NUL lorsque le Package URI fourni par le serveur (/5/0/1) est ≥ 128 octets. Les appels ultérieurs à strlen(context.uri), http_parser_parse_url() et l'option CoAP PROXY_URI ajoutent puis lisent au-delà du tampon dans la mémoire de la structure adjacente (is_firmware_uri, les pointeurs de fonction result_cb / write_cb, et le contexte de connexion DTLS). Les octets lus en excès sont exfiltrés dans la requête CoAP sortante.context.uri[128] (CONFIG_LWM2M_SWMGMT_PACKAGE_URI_LEN, défaut 128 ; LWM2M_PACKAGE_URI_LEN est #define à cette valeur)99a164df5cea5af76e32b57c6d51854f018969a2 — ajoute strlen(uri) >= sizeof(context.uri) → -ENOMEM et passe à strcpy().| Fichier | Objectif |
|---|---|
poc.c |
gcc -O0 -g -o poc poc.c
./poc
Attendu : un Package URI de 200 octets produit une option CoAP PROXY_URI de 141 octets — l'URI de 128 octets plus 13 octets divulgués depuis context.is_firmware_uri, le padding de la structure et les pointeurs de fonction result_cb/write_cb. Le chemin de code corrigé rejette l'URI avec -ENOMEM et ne copie rien.
gcc -O0 -g -fsanitize=address -o poc-asan poc.c
./poc-asan
La sonde alloue exactement 128 octets, les remplit d'octets non NUL (reflétant un context.uri complet sans terminateur) et appelle strlen() :
ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 129 at 0x...
0x... is located 0 bytes after 128-byte region [...,0x...)
# Build and inspect the CoAP packets without sending:
python3 lwm2m_evil_server.py --dry-run --uri-len 200
# Send to a vulnerable client (NoSec CoAP, UDP/5683):
python3 lwm2m_evil_server.py --target 10.0.0.42 --port 5683 --uri-len 200 --listen 2
Le script envoie une requête CoAP PUT /5/0/1 (écriture LwM2M de la ressource Package URI) suivie d'une requête CoAP POST /5/0/2 (exécution LwM2M Update, qui démarre le tirage du firmware et déclenche le bogue). En production, LwM2M, la session s'exécute sur DTLS (UDP/5684) ; l'attaquant dans le périmètre est un serveur de gestion malveillant/compromis, ou un adversaire sur le chemin lorsque l'authentification du serveur DTLS n'est pas appliquée.
À des fins de recherche en sécurité autorisée et d'éducation uniquement. N'utilisez pas ces outils contre des appareils que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de tester.
Reproduction autonome en C des chemins de code vulnérable/corrigé. Redéclare fidèlement struct firmware_pull_context (le tampon uri[128] plus les champs adjacents qui sont lus en excès) et le consommateur fuiteur CoAP PROXY_URI. |
lwm2m_evil_server.py | Serveur CoAP/LwM2M minimal qui délivre le Package URI surdimensionné à /5/0/1 d'un client vulnérable sur UDP (mode NoSec) — la moitié de livraison réseau de l'attaque. Aucune dépendance externe. |