
CVE-2026-38422 — Exécution de code à distance via des débordements de tampon combinés dans Tasmota fetch_jpg() (Tasmota <= 15.3.0.3)
CVE : CVE-2026-38422
Sévérité : Critique (CVSS 9,8)
Produit : Arendst Tasmota
Version affectée : <= 15.3.0.3
Fichier : tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
Fonction : fetch_jpg()
Auteur : Saidakbarxon Maxsudxonov
Divulgation : Responsable — signalé à Tasmota avant publication
La fonction fetch_jpg() du pilote de scripteur de Tasmota (xdrv_10_scripter.ino) contient deux vulnérabilités de corruption mémoire qui, combinées, permettent l'exécution de code à distance sur les appareils basés sur ESP32 exécutant Tasmota <= 15.3.0.3 :
strcpy() dans un tampon boundary[] fixe de 40 octets — corrompt la mémoire heap adjacente, y compris les pointeurs de vtable WiFiClient/HTTPClient (voir aussi CVE-2026-38426)uint16_t sur Content-Length — alloue un tampon trop petit provoquant la corruption de l'état du flux (voir aussi CVE-2026-38427)Utilisées ensemble lors d'une seule attaque, ces deux primitives maximisent la corruption du heap et augmentent significativement la probabilité d'obtenir une exécution de code arbitraire.
Serveur MJPEG de l'attaquant
│
│ Phase 1 : Réponse HTTP 200 avec une chaîne de séparation longue
│ Content-Type: multipart/x-mixed-replace; boundary=AAAA...AAAA (50+ caractères)
│ → strcpy(boundary[40], 50_caractères) → DÉBORDEMENT
│ → Pointeur vtable WiFiClient partiellement écrasé
▼
Heap ESP32 corrompu
│
│ Phase 2 : Image MJPEG avec Content-Length > 65535
│ Content-Length : 65537
│ → uint16_t size = 1 (dépassement)
│ → malloc(1), readBytes(buff, 1)
│ → 65536 octets restent dans le flux → corruption heap/flux
▼
Double corruption → Exécution de code / Déni de service garanti
# Attaque combinée — phase 1 + phase 2
python3 CVE-2026-38422_poc.py --port 8887 --mode dos
Le serveur PoC :
fetchjp())Content-Length : 65537 (dépassement)Voir CVE-2026-38422_poc.py pour l'implémentation complète.
>D
>B
fetchjp(ADRESSE_ATTAQUANT:8887/stream,0,0,1)
>1
=fetchjp(2,0,0,1)
L'appareil doit exécuter un script Tasmota utilisant fetchjp(). L'attaquant contrôle le serveur auquel l'appareil se connecte (ou effectue une attaque MITM sur une connexion existante).
Tout appareil Tasmota basé sur ESP32 exécutant une version <= 15.3.0.3 avec le support du scripteur activé et un script utilisant fetchjp() pour se connecter à un serveur MJPEG externe.