
Nextcloud 35.0.0 — प्रतिनिधिक Webhooks एडमिन webhook update tokenNeeded के माध्यम से 1h एडमिन ऐप पासवर्ड बना सकता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
राइट-अप: https://abraxaslabs.tech/research/nextcloud-webhook-tokenneeded
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create() tokenNeeded को null कर देता है, जब तक कि कॉलर पूर्ण इंस्टेंस एडमिन न हो। update() ऐसा नहीं करता। एक प्रत्यायोजित Webhooks सेटिंग्स एडमिन (admin में नहीं) किसी मौजूदा webhook पर tokenNeeded.user_ids: ["admin"] संग्रहीत कर सकता है, और फिर जब इवेंट ट्रिगर होता है, तो उस uid के लिए एक घंटे का बिना-स्कोप वाला PERMANENT_TOKEN ऐप पासवर्ड प्राप्त कर सकता है।
एक दुर्भावनापूर्ण व्यक्ति, जिसे केवल webhooks प्रबंधित करने का भरोसा दिया गया था, एक घंटे के लिए admin (या उनके द्वारा नामित किसी भी उपयोगकर्ता) के रूप में लॉग इन कर सकता है, 2FA को छोड़ सकता है, और उस व्यक्ति की फ़ाइलें पढ़ या अधिलेखित कर सकता है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-863, CWE-269 |
| CVSS | उच्च: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| उत्पाद | Nextcloud Server |
| प्रभावित | 35.0.0 (da02f41) आधिकारिक nextcloud:35.0.0-apache |
| प्रमाणीकरण | प्रत्यायोजित Webhooks सेटिंग्स एडमिन (IDelegatedSettings) |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
आपने किसी को Webhooks सेटिंग्स का काम दिया। वे admin समूह में नहीं हैं। Nextcloud फिर भी उन्हें एक मौजूदा webhook को इस तरह संपादित करने देता है कि अगले मिलते-जुलते इवेंट पर, सर्वर उन्हें उनके द्वारा सूचीबद्ध किसी भी uid के लिए एक घंटे का लॉगिन मेल कर देता है, जिसमें admin भी शामिल है।
उस लॉगिन के साथ वे यह कर सकते हैं:
उन्हें होस्ट पर PHP शेल की आवश्यकता नहीं है। उन्हें पूर्ण इंस्टेंस एडमिन होने की आवश्यकता नहीं है। बिना किसी खाते वाला इंटरनेट पर कोई अजनबी ऐसा नहीं कर सकता। यह छिद्र वह स्टाफर है जिसे आपने पहले से webhooks के साथ भरोसा दिया था, जो उन लोगों का रूप धारण कर रहा है जिन पर आपने भरोसा नहीं किया।
WebhooksController #[AuthorizedAdminSetting(settings: Admin::class)] है। Admin IDelegatedSettings को लागू करता है। इसी तरह Nextcloud एक सेटिंग्स पैनल को उस समूह को सौंपता है जो admin नहीं है।
tokenNeeded सर्वर से अनुरोध करता है कि webhook फायर होने पर नामित uids के लिए प्रमाणीकरण टोकन संलग्न करे। TokenService::createEphemeralToken password = null के साथ IToken::PERMANENT_TOKEN बनाता है। ऐप पासवर्ड। 2FA पहले से पीछे है।
PR #60543 ने create को गेट किया: जब तक आप पूर्ण इंस्टेंस एडमिन नहीं हैं, tokenNeeded null कर दिया जाता है। मैंने प्रत्यायोजित उपयोगकर्ता hooker के रूप में tokenNeeded.user_ids: ["admin"] के साथ एक webhook बनाया। संग्रहीत tokenNeeded [] था। Create गेटेड है। एक मिनट के लिए यह एक पूर्ण पैच जैसा लगता है।
फिर मैंने वही बॉडी /webhooks/{id} पर POST किया। संग्रहीत user_ids ['admin'] था। update() ने कभी if की प्रतिलिपि नहीं बनाई।
hooker के रूप में एक फ़ाइल PUT करें ताकि NodeCreatedEvent फायर हो। Cron WebhookCall चलाता है। Catcher JSON में authentication.user_ids.admin.token है। एडमिन निजी साक्षी फ़ाइल का Bearer GET 200, X-User-Id: admin लौटाता है।
जिन तरीकों से यह बिना कुछ सिखाए विफल होता है: update 403 (कंट्रोलर पहले से create से मेल खाता है); create पहले से टोकन बना रहा है (#60543 बिल्ड पर नहीं); catcher में खाली authentication (cron ने टोकन नहीं बनाया); ExApp हेडर पथ (लैब उपयोगकर्ता प्रत्यायोजित hooker है)।
cd lab
./run.sh
केवल http://127.0.0.1:18320 (Nextcloud) और :18321 (catcher) को लक्षित करें।
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
create के isAdmin null-out को update() में कॉपी करें। जब तक यह शिप न हो, Webhooks सेटिंग्स को गैर-एडमिन समूहों को न सौंपें।
da02f41)GNU Affero GPL v3.0. देखें LICENSE. केवल लूपबैक लैब। कोई वारंटी नहीं।