
Plausible Analytics master d44e104 – Hoch – Remote – Verbleibende Berechtigungen – Editor-Leute HTML-Leck-Übertragung nanoid
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · plausible-editor-invite
Plausible Analytics Community Edition, GitHub-Master d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16) – Plausible Insights OÜ
Klasse: Privilegien-Rest (Leak von Einladungs-Tokens). Reichweite: Remote (Gast-Editor oder Team-Editor der jeweiligen Site).
Sites.list_people/1 selektiert rohe guest_invitations.invitation_id und team_site_transfers.transfer_id. settings_people.html.heex setzt diese 21-stellige Nanoid in id="invitation-#{invitation.invitation_id}" für jede ausstehende Zeile. Die Personen-Einstellungen sind nicht in SiteController @special_cased_actions enthalten, daher erlaubt AuthorizeSiteAccess :editor. Gast-Editor wird auf die Site-Rolle :editor abgebildet. Gast-Viewer erhalten 404.
Nanoid.generate/0 ist der Bearer zum Registrieren aus einer Einladung. Unauth GET /register/invitation/:invitation_id sucht ausschließlich per ID. LiveView register überschreibt die übermittelte E-Mail mit invitation.email. Die Standard-CE verwendet DISABLE_REGISTRATION=invite_only und ENABLE_EMAIL_VERIFICATION=false. Die Annahme erfolgt über POST /sites/invitations/:id/accept per citext-E-Mail-Abgleich.
Ein Gast-Editor, der bereits das People-HTML sehen kann, liest eine ausstehende Nanoid für eine Eigentumsübertragung, registriert sich als Eingeladener und nimmt an. Die Site wandert auf das persönliche Team des Angreifers.
| ID | noch keine CVE |
| CWE | CWE-200 / CWE-269 |
| CVSS | Hoch: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L |
| Produkt | Plausible Analytics |
| Betroffen | GitHub-Master d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16). Der letzte CE-Tag v3.2.1 (e4f5a87a5570bd61605217e7ceb376636db8eddb, 2026-05-15) liegt fünf Monate zurück. SECURITY.md weist Betreiber an, :latest zu verwenden. Der Pin entspricht dem aktuellen HEAD. CE MIX_ENV=ce kompiliert nur lib/. |
| Auth | authentifizierter Gast-Editor (:guest_member, :editor) oder Team-Editor der jeweiligen Site. Nicht unauth. Nicht Gast-Viewer. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18180 (http) 18181 (postgres) 18182 (clickhouse http) only |
Rest #1 von Plausible Analytics leftovers. Gleicher Pin, anderes Paket: plausible-traffic-notify (PUT traffic-change-notification site_id Mass-Assignment). Dieses Paket ist dasjenige, das eine ausstehende Eigentumsübertragung stiehlt.
Authentifizierter Gast-Editor oder Team-Editor einer Site, die eine ausstehende Gast-Einladung und/oder Eigentumsübertragung hat. Benötigt ein normales Session-Cookie. Kein Owner, kein Admin, kein Super-Admin-LiveView. Sie brute-forcen die 21-stellige Nanoid nicht. Sie lesen sie aus dem HTML, das sie laden dürfen, und registrieren sich dann als Eingeladener.
Privilegientabelle (vollständig). Gleicher Maßstab wie Signal-Server Dropwizard admin: Methode + Pfad, was dieser Aufruf gewährt, Recon vs. Integrität vs. Verfügbarkeit, im Lab nachgewiesen vs. abgeleitet, angrenzende Oberfläche, die geschlossen bleibt.
| Achse | Methode + Pfad | Gewährt | Provenienz |
|---|---|---|---|
| Recon | GET /:domain/settings/people als Gast/Team-Editor | Ausstehende Zeilen rendern id="invitation-<nanoid>". Nanoid ist invitation_id oder transfer_id. Nur dieselbe Site. Die E-Mail des Eingeladenen steht ebenfalls in der Tabelle. | Lab-proven. Editor people 200 leaked nanoid Hc8DiBC2q08mv5LFmBysu |
| Recon | unauth GET /register/invitation/:id | E-Mail des Eingeladenen im Registrierungsformular. Lookup erfolgt nur per id (find_by_id_unified). | Lab-proven. Register HTML showed [email protected] |
| Integrity | LiveView register auf /register/invitation/:id | Gepostetes user[email] wird mit invitation.email überschrieben. Neues CE-Konto an der Adresse des Eingeladenen. Standardmäßige CE-E-Mail-Verifizierung aus. Invite-only erlaubt weiterhin :invitation. | Lab-proven. Posted [email protected]; stored email was [email protected] |
| Integrity | POST /sites/invitations/:id/accept als dieses neue Konto | Ausstehende Eigentumsübertragung verschiebt sites.team_id auf das persönliche Team des newowner. Transfer-Zeile ist weg. | Lab-proven. sites.team_id 1 → 2 |
| Integrity | gleiches accept bei einer ausstehenden Gast-Einladung für diese E-Mail | Neue Mitgliedschaft auf dieser Site (editor-for-editor ist kein Gewinn). Andere ausstehende Team-/Gast-/Transfer-Zeilen für diese E-Mail werden ebenfalls accept-able. | Quelle (InvitationController.accept_invitation) |
| Availability | nach Transfer-accept | Ursprüngliches Team verliert die Site. Stats liefern weiterhin auf dem neuen Team. | Lab-proven. team_id moved |
Bleibt geschlossen bei diesem Pin
| Achse | Methode + Pfad | Warum geschlossen |
|---|---|---|
| Recon | Gast-Viewer GET /:domain/settings/people | 404. Viewer ist nicht :editor. Lab-proven. |
| Integrity | Editor POST /sites/invitations/:id/accept der geleakten Transfer-id | E-Mail-Übereinstimmung. Editor ist nicht [email protected]. Site bleibt bei Team 1. Lab-proven. |
| Integrity | unauth register ohne gültige Einladungs-id | check_registration_enabled(:default) vs :invitation. whoareme Bug 02, gepatcht. |
| Recon | 21-Zeichen-Nanoid-Brute | URL-sicheres Alphabet, 21 Zeichen. Außerhalb dieses Leftovers. |
| Recon | ClickHouse-Events, SMTP, people-Seiten anderer Sites | Nur dieselbe Site. Kein ClickHouse-Admin. Kein Mailbox-Lesen. |
| Integrity | Owner/Admin-Invite und -Transfer | Sie können es bereits. Dieser Leftover betrifft den Editor, der es nicht kann. |
| Integrity | Super-Admin-LiveView, OS-Shell, extra/lib EE SSO | Geschlossen. CE-Lab. Keine Shell. |
Ich behaupte nicht unauthentifizierte Account-Übernahme eines bereits registrierten Nutzers, eine Reverse Shell oder einen ClickHouse-Dump. Die High-Instanz ist ein ausstehender Owner-Transfer (oder Einladungen zu anderen Sites/Teams für diese E-Mail) auf Standard-CE: invite-only plus E-Mail-Verifizierung aus. EE setzt immer email_verified: false und /activate benötigt das Postfach des Eingeladenen.
whoareme Bug 02 (offengelegt am 2026-05-22) schloss invite-only LiveView register ohne gültige Einladung sowie Shield/Goal site_id-Mass-Assignment. Ich habe mich trotzdem auf den aktuellen Master gesetzt. SECURITY.md patcht nur die neueste MAJOR.MINOR und weist Betreiber an, :latest auszuführen. Der letzte CE-Tag v3.2.1 ist fünf Monate hinter HEAD.