
Plausible Analytics master d44e104 - Alta - Remoto - Privilégio remanescente - editor pessoas HTML vazamentos transferência nanoid
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · plausible-editor-invite
Plausible Analytics edição comunitária, master do GitHub d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16) - Plausible Insights OÜ
Classe: privilégio residual (vazamento de token de convite). Alcance: remoto (editor convidado ou editor de equipe daquele site).
Sites.list_people/1 seleciona guest_invitations.invitation_id e team_site_transfers.transfer_id brutos. settings_people.html.heex coloca esse nanoid de 21 caracteres em id="invitation-#{invitation.invitation_id}" para cada linha pendente. As configurações de Pessoas não estão em @special_cased_actions do SiteController, então AuthorizeSiteAccess permite :editor. O editor convidado mapeia para a função de site :editor. O visualizador convidado recebe 404.
Nanoid.generate/0 é o portador do registro a partir do convite. GET /register/invitation/:invitation_id sem autenticação busca apenas pelo id. O LiveView register sobrescreve o e-mail enviado com invitation.email. O CE padrão é DISABLE_REGISTRATION=invite_only e ENABLE_EMAIL_VERIFICATION=false. A aceitação é POST /sites/invitations/:id/accept via correspondência de e-mail citext.
Um editor convidado que já consegue ver o HTML de Pessoas lê um nanoid de transferência de propriedade pendente, registra-se como o convidado e aceita. O site passa para a equipe pessoal do atacante.
| ID | ainda sem CVE |
| CWE | CWE-200 / CWE-269 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L |
| Produto | Plausible Analytics |
| Afetado | master do GitHub d44e104ae3943a9240d5cb6b62e67dff0f069d3a (2026-10-16). A última tag CE v3.2.1 (e4f5a87a5570bd61605217e7ceb376636db8eddb, 2026-05-15) está cinco meses atrasada. O SECURITY.md orienta os operadores a executar :latest. O pin é o HEAD atual. O CE MIX_ENV=ce compila apenas lib/. |
| Autenticação | editor convidado autenticado (:guest_member, :editor) ou editor de equipe daquele site. Não é sem autenticação. Não é visualizador convidado. |
| Licença | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18180 (http) 18181 (postgres) 18182 (clickhouse http) apenas |
Residual nº 1 de Plausible Analytics leftovers. Mesmo pin, outro pacote: plausible-traffic-notify (atribuição em massa de site_id em PUT traffic-change-notification). Este pacote é o que rouba uma transferência de propriedade pendente.
Editor convidado ou editor de equipe autenticado de um site que tenha um convite de convidado e/ou transferência de propriedade pendente. Precisa de um cookie de sessão normal. Sem proprietário, sem admin, sem LiveView de super-admin. Eles não fazem força bruta no nanoid de 21 caracteres. Eles o leem do HTML que têm permissão para carregar e então se registram como o convidado.
Tabela de privilégios (exaustiva). Mesmo critério do Signal-Server Dropwizard admin: método + caminho, o que aquela chamada concede, reconhecimento vs integridade vs disponibilidade, comprovado em lab vs inferido, superfície adjacente que permanece fechada.
| Eixo | Método + caminho | Concede | Proveniência |
|---|---|---|---|
| Recon | GET /:domain/settings/people como convidado/editor de equipa | As linhas pendentes renderizam id="invitation-<nanoid>". O nanoid é invitation_id ou transfer_id. Apenas no mesmo site. O email do convidado também está na tabela. | Comprovado em laboratório. Editor people 200 vazou nanoid Hc8DiBC2q08mv5LFmBysu |
| Recon | GET /register/invitation/:id sem autenticação | Email do convidado no formulário de registo. A pesquisa é apenas por id (find_by_id_unified). | Comprovado em laboratório. O HTML de registo mostrou [email protected] |
| Integridade | LiveView register em /register/invitation/:id | O user[email] submetido é substituído por invitation.email. Nova conta CE no endereço do convidado. Verificação de email CE desativada por predefinição. Apenas por convite ainda permite :invitation. | Comprovado em laboratório. Submetido [email protected]; email armazenado foi [email protected] |
| Integridade | POST /sites/invitations/:id/accept como essa nova conta | A transferência de propriedade pendente move sites.team_id para a equipa pessoal do novo proprietário. A linha de transferência desaparece. | Comprovado em laboratório. sites.team_id 1 → 2 |
| Integridade | o mesmo accept num convite convidado pendente para esse email | Nova adesão nesse site (editor-por-editor não é ganho). Outras linhas pendentes de equipa/convidado/transferência para esse email também se tornam aceitáveis. | Código-fonte (InvitationController.accept_invitation) |
| Disponibilidade | após aceitar a transferência | A equipa original perde o site. As estatísticas continuam a servir na nova equipa. | Comprovado em laboratório. team_id movido |
Permanece fechado neste pin
| Eixo | Método + caminho | Porque está fechado |
|---|---|---|
| Recon | visualizador convidado GET /:domain/settings/people | 404. O visualizador não é :editor. Comprovado em laboratório. |
| Integridade | editor POST /sites/invitations/:id/accept do id de transferência vazado | Correspondência de email. O editor não é [email protected]. O site permanece na equipa 1. Comprovado em laboratório. |
| Integridade | registo sem autenticação sem um id de convite válido | check_registration_enabled(:default) vs :invitation. whoareme Bug 02, corrigido. |
| Recon | força bruta de nanoid de 21 caracteres | Alfabeto URL-safe, 21 caracteres. Fora deste resto. |
| Recon | eventos ClickHouse, SMTP, páginas people de outros sites | Apenas no mesmo site. Sem admin ClickHouse. Sem leitura de caixa de correio. |
| Integridade | convite e transferência de owner/admin | Já o podem fazer. Este resto é o editor que não pode. |
| Integridade | LiveView de super-admin, shell do SO, extra/lib EE SSO | Fechado. Laboratório CE. Sem shell. |
Não estou a reivindicar tomada de conta não autenticada de um utilizador já registado, uma reverse shell, ou um dump de ClickHouse. A instância High é uma transferência de proprietário pendente (ou convites para outros sites/equipas para esse email) na CE por predefinição: apenas por convite mais verificação de email desativada. A EE define sempre email_verified: false e /activate precisa da caixa de correio do convidado.