
Plausible Analytics master d44e104 - उच्च - रिमोट - IDOR - PUT traffic-change-notification site_id मास असाइनमेंट
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · plausible-traffic-notify
Plausible Analytics कम्युनिटी संस्करण, GitHub master d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16) - Plausible Insights OÜ
वर्ग: IDOR (mass-assignment)। पहुँच: रिमोट (उस साइट का owner / admin / editor जिसे हमलावर पहले से नियंत्रित करता है)।
Plausible.Site.TrafficChangeNotification.changeset/2 अभी भी :site_id को cast करता है। SiteController.update_traffic_change_notification/2 पंक्ति को अधिकृत पथ डोमेन द्वारा लोड करता है, फिर क्लाइंट मैप का Repo.update! करता है। रूट PUT /sites/:domain/traffic-change-notification/:type :browser + CSRF + AuthorizeSiteAccess [:owner, :admin, :editor, :super_admin] के अंतर्गत आता है। HTML फ़ॉर्म केवल threshold पोस्ट करता है। Phoenix फिर भी अतिरिक्त कुंजियाँ स्वीकार करता है।
whoareme Bug 02 ने Shield / Goal site_id को उसी तरह पैच किया था: socket.assigns.site.id को बाइंड करें, :site_id को cast करना बंद करें। यह कंट्रोलर उस पास में नहीं था। Enable (POST .../enable) assigns से site_id: site.id स्टांप करता है। हमलावर अपनी साइट पर enable करता है, फिर traffic_change_notification[site_id]=<victim_pk> PUT करता है। यूनिक इंडेक्स (site_id, type)। डिफ़ॉल्ट इंस्टॉल में कोई spike/drop पंक्ति नहीं होती, इसलिए अपडेट सफल होता है और पंक्ति अब पीड़ित की हो जाती है। तालिका का नाम लीगेसी spike_notifications है।
अपनी साइट का एक editor spike/drop notify पंक्ति को किसी पीड़ित साइट पर re-parent कर देता है। प्राप्तकर्ता हमलावर का मेलबॉक्स ही रहते हैं। Oban हमलावर को पीड़ित के ट्रैफ़िक के बारे में मेल भेजता है।
| ID | अभी कोई CVE नहीं |
| CWE | CWE-915 / CWE-639 |
| CVSS | High: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L |
| Product | Plausible Analytics |
| Affected | GitHub master d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16)। अंतिम CE टैग v3.2.1 (e4f5a87a5570bd61605217e7ceb376636db8eddb, 2026-05-15) पाँच महीने पीछे है। CE + EE (lib/, extra/lib नहीं)। |
| Auth | उस साइट का owner / admin / editor जिसे वे नियंत्रित करते हैं। Viewer नहीं कर सकता। CSRF आवश्यक (same-session IDOR)। |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:18183 (http) 18184 (postgres) 18185 (clickhouse http) |
Plausible Analytics leftovers का Leftover #2। वही pin, दूसरा पैक: plausible-editor-invite (People HTML editors को transfer nanoid लीक करता है)। यह पैक वह Shield/Goal सहोदर है जो अभी भी :site_id को cast करता है।
किसी भी ऐसी साइट का owner, admin, या editor जिसे वे पहले से नियंत्रित करते हैं। उन्हें उस सत्र से एक session cookie और CSRF टोकन चाहिए। उन्हें पीड़ित पर सदस्यता की आवश्यकता नहीं है। वे पीड़ित का पथ डोमेन PUT नहीं करते (वह 404 देता है)। वे अपना ही डोमेन एक विदेशी site_id integer PK के साथ PUT करते हैं।
विशेषाधिकार तालिका (विस्तृत)। Signal-Server Dropwizard admin के समान मानक: method + path, वह कॉल क्या प्रदान करती है, recon बनाम integrity बनाम availability, lab-proven बनाम inferred, वह निकटवर्ती सतह जो बंद रहती है।
| अक्ष | विधि + पथ | अनुदान | उद्गम |
|---|---|---|---|
| अखंडता | POST /sites/:attacker_domain/traffic-change-notification/:type/enable फिर PUT /sites/:attacker_domain/traffic-change-notification/:type के साथ traffic_change_notification[site_id]=<victim_pk> | आक्रमणकर्ता की spike_notifications पंक्ति को victim.sites.id पर पुनः-मूल निर्धारित करता है। प्राप्तकर्ता आक्रमणकर्ता का पता ही रहते हैं। अद्वितीय (site_id, type) स्लॉट का स्वामित्व रखता है। थ्रेशोल्ड आक्रमणकर्ता द्वारा चुना गया (लैब ने 1 का उपयोग किया)। | लैब-प्रमाणित। पंक्ति 1 ने site_id 2 → 1 स्थानांतरित किया, प्राप्तकर्ता {[email protected]} |
| टोह | Oban TrafficChangeNotifier ईमेल notification.recipients को | विषय Traffic spike on <victim.domain>। मुख्य भाग: वर्तमान आगंतुक संख्या, शीर्ष 3 स्रोत, शीर्ष 3 पृष्ठ। पहला प्रेषण तत्काल होता है (last_sent nil)। अधिकतम हर 12 घंटे में दोहराव। थ्रेशोल्ड 1 तब मेल उत्पन्न करता है जब भी पीड़ित के पास कोई वर्तमान आगंतुक हो। मेल में डैशबोर्ड HTML / इंस्टॉलेशन लिंक तब तक छोड़े जाते हैं जब तक प्राप्तकर्ता टीम/अतिथि सदस्य न हो (आक्रमणकर्ता नहीं है)। | नोटिफ़ायर स्रोत से अनुमानित। लैब में मेल कैप्चर नहीं हुआ (MAILER_ADAPTER=Bamboo.LocalAdapter) |
| उपलब्धता | पीड़ित का उसी प्रकार के लिए POST .../enable | अद्वितीय (site_id, type) अस्वीकार करता है। पीड़ित रोपित पंक्ति हटने तक सुविधा चालू नहीं कर सकता। | स्रोत (unique_constraint) |
| उपलब्धता | पीड़ित का disable (site_id द्वारा delete_all) | यदि पीड़ित अतिरिक्त प्राप्तकर्ता को नोटिस करे तो रोपित पंक्ति साफ़ कर सकता है। | स्रोत (disable_traffic_change_notification) |
इस पिन पर बंद रहता है
| अक्ष | विधि + पथ | यह क्यों बंद है |
|---|---|---|
| अखंडता | PUT /sites/:victim_domain/traffic-change-notification/:type | पथ डोमेन AuthorizeSiteAccess है। आक्रमणकर्ता सदस्य नहीं है। लैब-प्रमाणित 404। attacker-not-member-of-victim=1 |
| अखंडता | Shield / Goal / funnel / segment / shared-link लेखन | whoareme Bug 02 ने उन cast :site_id हैंडलरों को पैच किया। वे assigns को बाइंड करते हैं। |
| टोह | ClickHouse डंप, Stats API, डैशबोर्ड HTML | कोई सदस्यता नहीं, कोई साझा लिंक नहीं। नोटिफ़ायर मेल गैर-सदस्य के लिए डैशबोर्ड लिंक छोड़ देता है। |
| अखंडता | tracker ingest | पहले से ही unauth POST /api/event क्लाइंट-चयनित डोमेन के साथ। यह वह अवशेष नहीं है। |
| अखंडता | Repo.update! जब पीड़ित के पास पहले से वह प्रकार हो | अद्वितीय (site_id, type) पर 500। डिफ़ॉल्ट इंस्टॉल में कोई पंक्ति नहीं, इसलिए पहला रोपण काम करता है। |
| अखंडता | आक्रमणकर्ता साइट का viewer | AuthorizeSiteAccess owner/admin/editor है। Viewer नहीं कर सकता। |
| अखंडता | OS शेल, सुपर-एडमिन LiveView | बंद। कोई शेल नहीं। |
मैं ClickHouse डंप, रिवर्स शेल, या पीड़ित के रूप में डैशबोर्ड लॉगिन का दावा नहीं कर रहा हूँ। डंप उस मेल में ट्रैफ़िक टोह है जो आक्रमणकर्ता को पहले से प्राप्त होता है: डोमेन, लाइव आगंतुक, शीर्ष स्रोत, शीर्ष पृष्ठ। site_id पूर्णांक PK है (गणनीय; whoareme ने site_id=1 का उपयोग किया)। डैशबोर्ड data-* इसे उत्सर्जित नहीं करता।
whoareme Bug 02 ने Shield और Goal को :site_id cast करना बंद करना सिखाया। मैंने lib/ के अंतर्गत शेष cast(.*:site_id को grep किया। Traffic-change notification में अभी भी यह था। Enable assigns को स्टाम्प करता है। Update क्लाइंट मैप लेता है। यही अवशेष है।
run.sh पिन को क्लोन करता है यदि plausible-lab:d44e104ae3943a अनुपस्थित है, DISABLE_REGISTRATION=false के साथ compose को उठाता है ताकि दो स्वतंत्र टीमें पंजीकरण कर सकें, victim.lab (id 1 team 1) और attacker.lab (id 2 team 2) को सीड करता है, आक्रमणकर्ता पर spike notify सक्षम करता है, फिर site_id=1 को PUT करता है।