
Plausible Analytics master d44e104 — высокий уровень — удалённо — остаточные привилегии — редактор people HTML утечки передача 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Ü
Класс: остаточные привилегии (утечка токена приглашения). Доступ: удалённый (гостевой редактор или командный редактор этого сайта).
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 не входят в @special_cased_actions SiteController, поэтому AuthorizeSiteAccess разрешает :editor. Гостевой редактор соответствует роли сайта :editor. Гостевой просмотрщик получает 404.
Nanoid.generate/0 — это bearer-токен регистрации по приглашению. Неаутентифицированный GET /register/invitation/:invitation_id ищет только по id. LiveView register перезаписывает отправленный email на invitation.email. По умолчанию в CE DISABLE_REGISTRATION=invite_only и ENABLE_EMAIL_VERIFICATION=false. Принятие — это POST /sites/invitations/:id/accept через сопоставление email citext.
Гостевой редактор, который уже может видеть HTML страницы People, читает 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) только |
Остаток №1 из Plausible Analytics leftovers. Тот же пин, другой пакет: plausible-traffic-notify (массовое присваивание site_id в PUT traffic-change-notification). Этот пакет — тот, что похищает ожидающую передачу владения.
Аутентифицированный гостевой редактор или командный редактор сайта, у которого есть ожидающее гостевого приглашения и/или передача владения. Нужен обычный сессионный cookie. Без владельца, без администратора, без LiveView супер-администратора. Они не подбирают 21-символьный nanoid. Они читают его из HTML, который им разрешено загружать, затем регистрируются как приглашённый.
Таблица привилегий (исчерпывающая). Тот же уровень, что и Signal-Server Dropwizard admin: метод + путь, что даёт этот вызов, разведка против целостности против доступности, доказано в лаборатории против выведено, смежная поверхность, которая остаётся закрытой.
| Ось | Метод + путь | Что даёт | Происхождение |
|---|---|---|---|
| Разведка | GET /:domain/settings/people от имени гостя/редактора команды | Ожидающие строки рендерят id="invitation-<nanoid>". Nanoid — это invitation_id или transfer_id. Только тот же сайт. Email приглашённого также есть в таблице. | Подтверждено в лаборатории. Editor people 200 раскрыл nanoid Hc8DiBC2q08mv5LFmBysu |
| Разведка | неаутентифицированный GET /register/invitation/:id | Email приглашённого в форме регистрации. Поиск только по id (find_by_id_unified). | Подтверждено в лаборатории. HTML регистрации показал [email protected] |
| Целостность | LiveView register на /register/invitation/:id | Отправленный user[email] перезаписывается на invitation.email. Новый CE-аккаунт на адрес приглашённого. Проверка email в CE по умолчанию отключена. Режим только по приглашениям всё равно допускает :invitation. | Подтверждено в лаборатории. Отправлен [email protected]; сохранённый email — [email protected] |
| Целостность | POST /sites/invitations/:id/accept от имени этого нового аккаунта | Ожидающая передача владения переносит sites.team_id на личную команду newowner. Строка передачи исчезает. | Подтверждено в лаборатории. sites.team_id 1 → 2 |
| Целостность | тот же accept для ожидающего приглашения гостя на этот email | Новое членство на этом сайте (редактор-за-редактора — не выигрыш). Другие ожидающие строки team/guest/transfer для этого email также становятся доступными для принятия. | Исходный код (InvitationController.accept_invitation) |
| Доступность | после принятия передачи | Исходная команда теряет сайт. Статистика продолжает работать на новой команде. | Подтверждено в лаборатории. team_id перемещён |
Остаётся закрытым на этом пине
| Ось | Метод + путь | Почему закрыто |
|---|---|---|
| Разведка | GET /:domain/settings/people от имени гостя-наблюдателя | 404. Наблюдатель — не :editor. Подтверждено в лаборатории. |
| Целостность | POST /sites/invitations/:id/accept редактором для утёкшего transfer id | Совпадение email. Редактор — не [email protected]. Сайт остаётся в команде 1. Подтверждено в лаборатории. |
| Целостность | неаутентифицированная регистрация без валидного id приглашения | check_registration_enabled(:default) против :invitation. whoareme Bug 02, исправлено. |
| Разведка | перебор 21-символьного nanoid | URL-безопасный алфавит, 21 символ. Вне рамок этой недоделки. |
| Разведка | события ClickHouse, SMTP, страницы people других сайтов | Только тот же сайт. Нет админ-доступа к ClickHouse. Нет чтения почты. |
| Целостность | приглашение и передача от owner/admin | Они и так могут. Эта недоделка — про редактора, который не может. |
| Целостность | LiveView супер-админа, OS shell, EE SSO в extra/lib | Закрыто. CE-лаборатория. Нет shell. |
Я не заявляю о неаутентифицированном захвате аккаунта уже зарегистрированного пользователя, reverse shell или дампе ClickHouse. Экземпляр High — это ожидающая передача владения (или приглашения на другие сайты/команды для этого email) на дефолтном CE: режим только по приглашениям плюс отключённая проверка email. EE всегда устанавливает email_verified: false, а /activate требует почтовый ящик приглашённого.