Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
plausible-editor-invite — Plausible Analytics master d44e104 - High - Remote - Privilege leftover - editor people HTML leaks transfer nanoid | Kitploit
Tools/GitHubGitHub/abraxas/plausible-editor-invite
Privilege EscalationVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingLabs & Practice
GitHubabraxas/plausible-editor-invite

plausible-editor-invite

Plausible Analytics master d44e104 - High - Remote - Privilege leftover - editor people HTML leaks transfer nanoid

View Repository
11 day agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

Abraxas Labs - plausible-editor-invite

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  plausible-editor-invite

plausible-editor-invite

Plausible Analytics community edition, GitHub master d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16) - Plausible Insights OÜ

Class: Privilege leftover (invitation-token leak). Reach: Remote (guest editor or team editor of that site).

Sites.list_people/1 selects raw guest_invitations.invitation_id and team_site_transfers.transfer_id. settings_people.html.heex puts that 21-char nanoid in id="invitation-#{invitation.invitation_id}" for every pending row. People settings is not in SiteController @special_cased_actions, so AuthorizeSiteAccess allows :editor. Guest editor maps to site role :editor. Guest viewer 404s.

Nanoid.generate/0 is the register-from-invite bearer. Unauth GET /register/invitation/:invitation_id looks up by id only. LiveView register overwrites posted email with invitation.email. Default CE is DISABLE_REGISTRATION=invite_only and ENABLE_EMAIL_VERIFICATION=false. Accept is POST /sites/invitations/:id/accept via citext email match.

A guest editor who can already see People HTML reads a pending ownership-transfer nanoid, registers as the invitee, and accepts. The site moves onto the attacker personal team.

IDno CVE yet
CWECWE-200 / CWE-269
CVSSHigh: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L
ProductPlausible Analytics
AffectedGitHub master d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16). Last CE tag v3.2.1 (e4f5a87a5570bd61605217e7ceb376636db8eddb, 2026-05-15) is five months behind. SECURITY.md tells operators to run :latest. Pin is current HEAD. CE MIX_ENV=ce compiles lib/ only.
Authauthenticated guest editor (:guest_member, :editor) or team editor of that site. Not unauth. Not guest viewer.
LicenseGNU Affero GPL v3.0
Lab127.0.0.1:18180 (http) 18181 (postgres) 18182 (clickhouse http) only

Leftover #1 of Plausible Analytics leftovers. Same pin, other pack: plausible-traffic-notify (PUT traffic-change-notification site_id mass-assignment). This pack is the one that steals a pending ownership transfer.

What an attacker can do

Authenticated guest editor or team editor of a site that has a pending guest invite and/or ownership transfer. Needs a normal session cookie. No owner, no admin, no super-admin LiveView. They do not brute the 21-char nanoid. They read it from HTML they are allowed to load, then register as the invitee.

Privilege table (exhaustive). Same bar as Signal-Server Dropwizard admin: method + path, what that call grants, recon vs integrity vs availability, lab-proven vs inferred, adjacent surface that stays closed.

AxisMethod + pathGrantsProvenance
ReconGET /:domain/settings/people as guest/team editorPending rows render id="invitation-<nanoid>". Nanoid is invitation_id or transfer_id. Same site only. Invitee email is also in the table.Lab-proven. Editor people 200 leaked nanoid Hc8DiBC2q08mv5LFmBysu
Reconunauth GET /register/invitation/:idInvitee email on the register form. Lookup is by id only (find_by_id_unified).Lab-proven. Register HTML showed [email protected]
IntegrityLiveView register on /register/invitation/:idPosted user[email] is overwritten with invitation.email. New CE account at the invitee address. Default CE email verification off. Invite-only still allows :invitation.Lab-proven. Posted [email protected]; stored email was [email protected]
IntegrityPOST /sites/invitations/:id/accept as that new accountPending ownership transfer moves sites.team_id onto the newowner personal team. Transfer row is gone.Lab-proven. sites.team_id 1 → 2
Integritysame accept on a pending guest invite for that emailNew membership on that site (editor-for-editor is not a gain). Other pending team/guest/transfer rows for that email also become accept-able.Source (InvitationController.accept_invitation)
Availabilityafter transfer acceptOriginal team loses the site. Stats keep serving on the new team.Lab-proven. team_id moved

Stays closed on this pin

AxisMethod + pathWhy it is closed
Reconguest viewer GET /:domain/settings/people404. Viewer is not :editor. Lab-proven.
Integrityeditor POST /sites/invitations/:id/accept of the leaked transfer idEmail match. Editor is not [email protected]. Site stays on team 1. Lab-proven.
Integrityunauth register without a valid invitation idcheck_registration_enabled(:default) vs :invitation. whoareme Bug 02, patched.
Recon21-char nanoid bruteURL-safe alphabet, 21 chars. Out of this leftover.
ReconClickHouse events, SMTP, other sites' people pagesSame-site only. No ClickHouse admin. No mailbox read.
Integrityowner/admin invite and transferThey already can. This leftover is the editor who cannot.
Integritysuper-admin LiveView, OS shell, extra/lib EE SSOClosed. CE lab. No shell.

I am not claiming unauthenticated account takeover of an already-registered user, a reverse shell, or ClickHouse dump. The High instance is a pending owner transfer (or invites to other sites/teams for that email) on default CE: invite-only plus email verification off. EE always sets email_verified: false and /activate needs the invitee mailbox.

How I found it

whoareme Bug 02 (disclosed 2026-05-22) closed invite-only LiveView register without a valid invite, plus Shield/Goal site_id mass-assignment. I sat on current master anyway. SECURITY.md patches only latest MAJOR.MINOR and tells operators to run :latest. Last CE tag v3.2.1 is five months behind HEAD.

I read every place a nanoid invitation_id leaves the database. Accept and register treat it as a bearer. People settings puts it in an HTML id= for the delete button. Delete is owner/admin only. The id= is not. Editors load the page.

run.sh clones the pin if plausible-lab:d44e104ae3943a is missing, brings compose up with DISABLE_REGISTRATION=invite_only, seeds owner / editor / viewer / pending transfer, then compares people HTML.

Download Tool