
Plausible Analytics master d44e104 - उच्च - रिमोट - विशेषाधिकार अवशेष - संपादक लोग HTML लीक स्थानांतरण nanoid
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · plausible-editor-invite
Plausible Analytics कम्युनिटी संस्करण, GitHub master d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16) - Plausible Insights OÜ
वर्ग: विशेषाधिकार अवशेष (आमंत्रण-टोकन लीक)। पहुँच: रिमोट (उस साइट का अतिथि संपादक या टीम संपादक)।
Sites.list_people/1 कच्चे guest_invitations.invitation_id और team_site_transfers.transfer_id का चयन करता है। settings_people.html.heex प्रत्येक लंबित पंक्ति के लिए उस 21-अक्षर वाले nanoid को id="invitation-#{invitation.invitation_id}" में डालता है। People सेटिंग्स SiteController के @special_cased_actions में नहीं है, इसलिए AuthorizeSiteAccess :editor की अनुमति देता है। अतिथि संपादक साइट भूमिका :editor पर मैप होता है। अतिथि दर्शक को 404 मिलता है।
Nanoid.generate/0 आमंत्रण-से-पंजीकरण बियरर है। अन-प्रमाणित GET /register/invitation/:invitation_id केवल id से लुकअप करता है। LiveView register पोस्ट किए गए ईमेल को invitation.email से अधिलेखित कर देता है। डिफ़ॉल्ट CE में DISABLE_REGISTRATION=invite_only और ENABLE_EMAIL_VERIFICATION=false होता है। स्वीकृति POST /sites/invitations/:id/accept के माध्यम से citext ईमेल मिलान द्वारा होती है।
एक अतिथि संपादक जो पहले से ही People HTML देख सकता है, एक लंबित स्वामित्व-हस्तांतरण nanoid पढ़ता है, आमंत्रित व्यक्ति के रूप में पंजीकरण करता है, और स्वीकार करता है। साइट हमलावर की व्यक्तिगत टीम पर चली जाती है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-200 / CWE-269 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L |
| उत्पाद | Plausible Analytics |
| प्रभावित | GitHub master d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16)। अंतिम CE टैग v3.2.1 (e4f5a87a5570bd61605217e7ceb376636db8eddb, 2026-05-15) पाँच महीने पीछे है। SECURITY.md ऑपरेटरों को :latest चलाने के लिए कहता है। पिन वर्तमान HEAD है। CE MIX_ENV=ce केवल lib/ को कंपाइल करता है। |
| प्रमाणीकरण | प्रमाणीकृत अतिथि संपादक (:guest_member, :editor) या उस साइट का टीम संपादक। अन-प्रमाणित नहीं। अतिथि दर्शक नहीं। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | 127.0.0.1:18180 (http) 18181 (postgres) 18182 (clickhouse http) केवल |
Plausible Analytics leftovers का अवशेष #1। वही पिन, अन्य पैक: plausible-traffic-notify (PUT traffic-change-notification site_id मास-असाइनमेंट)। यह पैक वही है जो एक लंबित स्वामित्व हस्तांतरण चुराता है।
किसी ऐसी साइट का प्रमाणीकृत अतिथि संपादक या टीम संपादक जिसमें लंबित अतिथि आमंत्रण और/या स्वामित्व हस्तांतरण है। सामान्य सत्र कुकी की आवश्यकता है। कोई स्वामी नहीं, कोई एडमिन नहीं, कोई सुपर-एडमिन LiveView नहीं। वे 21-अक्षर वाले nanoid पर ब्रूट-फोर्स नहीं करते। वे इसे उस HTML से पढ़ते हैं जिसे लोड करने की उन्हें अनुमति है, फिर आमंत्रित व्यक्ति के रूप में पंजीकरण करते हैं।
विशेषाधिकार तालिका (पूर्ण)। Signal-Server Dropwizard admin के समान मानक: विधि + पथ, वह कॉल क्या प्रदान करती है, रेकॉन बनाम अखंडता बनाम उपलब्धता, लैब-प्रमाणित बनाम अनुमानित, वह निकटवर्ती सतह जो बंद रहती है।
| अक्ष | विधि + पथ | अनुदान | उत्पत्ति |
|---|---|---|---|
| रेकॉन | अतिथि/टीम संपादक के रूप में GET /:domain/settings/people | लंबित पंक्तियाँ id="invitation-<nanoid>" प्रस्तुत करती हैं। Nanoid invitation_id या transfer_id है। केवल समान साइट। आमंत्रित व्यक्ति का ईमेल भी तालिका में है। | प्रयोगशाला-प्रमाणित। संपादक people 200 ने nanoid Hc8DiBC2q08mv5LFmBysu लीक किया |
| रेकॉन | अनधिकृत GET /register/invitation/:id | पंजीकरण फ़ॉर्म पर आमंत्रित व्यक्ति का ईमेल। लुकअप केवल id से होता है (find_by_id_unified)। | प्रयोगशाला-प्रमाणित। पंजीकरण HTML ने [email protected] दिखाया |
| अखंडता | /register/invitation/:id पर LiveView register | पोस्ट किया गया user[email] invitation.email से अधिलेखित हो जाता है। आमंत्रित व्यक्ति के पते पर नया CE खाता। डिफ़ॉल्ट CE ईमेल सत्यापन बंद। केवल-आमंत्रण अभी भी :invitation की अनुमति देता है। | प्रयोगशाला-प्रमाणित। पोस्ट किया गया [email protected]; संग्रहीत ईमेल [email protected] था |
| अखंडता | उस नए खाते के रूप में POST /sites/invitations/:id/accept | लंबित स्वामित्व हस्तांतरण sites.team_id को नए स्वामी की व्यक्तिगत टीम पर ले जाता है। हस्तांतरण पंक्ति चली जाती है। | प्रयोगशाला-प्रमाणित। sites.team_id 1 → 2 |
| अखंडता | उस ईमेल के लिए लंबित अतिथि आमंत्रण पर वही स्वीकृति | उस साइट पर नई सदस्यता (संपादक-के-लिए-संपादक कोई लाभ नहीं है)। उस ईमेल के लिए अन्य लंबित टीम/अतिथि/हस्तांतरण पंक्तियाँ भी स्वीकार्य हो जाती हैं। | स्रोत (InvitationController.accept_invitation) |
| उपलब्धता | हस्तांतरण स्वीकृति के बाद | मूल टीम साइट खो देती है। आँकड़े नई टीम पर परोसते रहते हैं। | प्रयोगशाला-प्रमाणित। team_id स्थानांतरित हुआ |
इस पिन पर बंद रहता है
| अक्ष | विधि + पथ | यह क्यों बंद है |
|---|---|---|
| रेकॉन | अतिथि दर्शक GET /:domain/settings/people | 404. दर्शक :editor नहीं है। प्रयोगशाला-प्रमाणित। |
| अखंडता | लीक हुए हस्तांतरण id के संपादक POST /sites/invitations/:id/accept | ईमेल मेल। संपादक [email protected] नहीं है। साइट टीम 1 पर रहती है। प्रयोगशाला-प्रमाणित। |
| अखंडता | वैध आमंत्रण id के बिना अनधिकृत पंजीकरण | check_registration_enabled(:default) बनाम :invitation। whoareme Bug 02, पैच किया गया। |
| रेकॉन | 21-वर्ण nanoid ब्रूट | URL-सुरक्षित वर्णमाला, 21 वर्ण। इस अवशेष से बाहर। |
| रेकॉन | ClickHouse इवेंट, SMTP, अन्य साइटों के people पृष्ठ | केवल समान-साइट। कोई ClickHouse एडमिन नहीं। कोई मेलबॉक्स पठन नहीं। |
| अखंडता | स्वामी/एडमिन आमंत्रण और हस्तांतरण | वे पहले से ही कर सकते हैं। यह अवशेष वह संपादक है जो नहीं कर सकता। |
| अखंडता | सुपर-एडमिन LiveView, OS शेल, extra/lib EE SSO | बंद। CE प्रयोगशाला। कोई शेल नहीं। |
मैं पहले से पंजीकृत उपयोगकर्ता के अप्रमाणित खाता अधिग्रहण, रिवर्स शेल, या ClickHouse डंप का दावा नहीं कर रहा हूँ। High उदाहरण डिफ़ॉल्ट CE पर एक लंबित स्वामी हस्तांतरण (या उस ईमेल के लिए अन्य साइटों/टीमों के आमंत्रण) है: केवल-आमंत्रण और ईमेल सत्यापन बंद। EE हमेशा email_verified: false सेट करता है और /activate के लिए आमंत्रित व्यक्ति के मेलबॉक्स की आवश्यकता होती है।
whoareme Bug 02 (2026-05-22 को प्रकट) ने वैध आमंत्रण के बिना केवल-आमंत्रण LiveView पंजीकरण बंद कर दिया, साथ ही Shield/Goal site_id मास-असाइनमेंट भी। मैंने फिर भी वर्तमान master पर काम किया। SECURITY.md केवल नवीनतम MAJOR.MINOR को पैच करता है और ऑपरेटरों को :latest चलाने के लिए कहता है। अंतिम CE टैग v3.2.1 HEAD से पाँच महीने पीछे है।
मैंने हर उस स्थान को पढ़ा जहाँ से nanoid invitation_id डेटाबेस से बाहर जाता है। Accept और register इसे bearer के रूप में मानते हैं। People सेटिंग्स इसे डिलीट बटन के लिए HTML id= में डालती है। डिलीट केवल स्वामी/एडमिन के लिए है। id= नहीं है। संपादक पृष्ठ लोड करते हैं।