
Nextcloud 35.0.0 — administrador de Webhooks delegado pode gerar uma senha de aplicativo de administrador de 1h via atualização de webhook tokenNeeded
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create() anula tokenNeeded a menos que o chamador seja um administrador completo da instância. update() não o faz. Um administrador delegado das configurações de Webhooks (que não está em admin) pode armazenar tokenNeeded.user_ids: ["admin"] num webhook existente e, em seguida, receber uma palavra-passe de aplicação PERMANENT_TOKEN sem âmbito, válida por uma hora, para esse uid quando o evento é acionado.
Um ator malicioso a quem apenas foi confiada a gestão de webhooks pode iniciar sessão como admin (ou qualquer utilizador que nomeie) durante uma hora, contornar o 2FA e ler ou sobrescrever os ficheiros dessa pessoa.
| ID | ainda sem CVE |
| CWE | CWE-863, CWE-269 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produto | Nextcloud Server |
| Afetado | 35.0.0 (da02f41) oficial nextcloud:35.0.0-apache |
| Autenticação | administrador delegado das configurações de Webhooks (IDelegatedSettings) |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | apenas 127.0.0.1 |
Concedeu a alguém a tarefa de configuração de Webhooks. Essa pessoa não está no grupo admin. O Nextcloud ainda permite que edite um webhook existente de modo a que, no próximo evento correspondente, o servidor lhe envie por email um início de sessão de uma hora para qualquer uid que liste, incluindo admin.
Com esse início de sessão, pode:
Não precisa de uma shell PHP no host. Não precisa de ser administrador completo da instância. Um estranho na internet sem conta não consegue fazer isto. A falha é o funcionário em quem já confiou os webhooks, a fazer-se passar pelas pessoas em quem não confiou.
WebhooksController é #[AuthorizedAdminSetting(settings: Admin::class)]. Admin implementa IDelegatedSettings. É assim que o Nextcloud entrega um painel de configurações a um grupo que não é admin.
tokenNeeded pede ao servidor que anexe tokens de autenticação para uids nomeados quando o webhook é acionado. TokenService::createEphemeralToken emite IToken::PERMANENT_TOKEN com password = null. Palavra-passe de aplicação. 2FA já ultrapassado.
O PR #60543 restringiu a criação: a menos que seja administrador completo da instância, tokenNeeded é anulado. Criei um webhook como utilizador delegado hooker com tokenNeeded.user_ids: ["admin"]. O tokenNeeded armazenado era []. A criação está restringida. Durante um minuto, parece uma correção concluída.
Depois fiz POST do mesmo corpo para /webhooks/{id}. O user_ids armazenado era ['admin']. update() nunca copiou o if.
Fiz PUT de um ficheiro como hooker para que NodeCreatedEvent fosse acionado. O cron executa WebhookCall. O JSON do catcher tem authentication.user_ids.admin.token. Um GET com Bearer do ficheiro testemunha privado do admin devolveu 200, X-User-Id: admin.
Formas de isto falhar sem lhe ensinar nada: update 403 (o controlador já corresponde ao create); create já a emitir tokens (#60543 não está na build); authentication vazio no catcher (o cron não emitiu); caminho do cabeçalho ExApp (o utilizador do laboratório é o delegado hooker).
cd lab
./run.sh
Alvo apenas http://127.0.0.1:18320 (Nextcloud) e :18321 (catcher).
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
Copie a anulação isAdmin do create para update(). Até isso ser lançado, não delegue as configurações de Webhooks a grupos que não sejam admin.
da02f41)GNU Affero GPL v3.0. Ver LICENSE. Apenas laboratório em loopback. Sem garantia.