
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
Write-up: https://abraxaslabs.tech/research/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"] em um webhook existente e, em seguida, receber uma senha de aplicativo PERMANENT_TOKEN sem escopo, válida por uma hora, para esse uid quando o evento for disparado.
Um agente malicioso que só tinha permissão para gerenciar webhooks pode fazer login como admin (ou qualquer usuário que ele indicar) por uma hora, contornar o 2FA e ler ou sobrescrever os arquivos 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 | somente 127.0.0.1 |
Você deu a alguém a função de configurações de Webhooks. Essa pessoa não está no grupo admin. O Nextcloud ainda permite que ela edite um webhook existente para que, no próximo evento correspondente, o servidor envie por e-mail um login de uma hora para qualquer uid que ela listar, incluindo admin.
Com esse login, ela pode:
Ela não precisa de um shell PHP no host. Não precisa ser um administrador completo da instância. Um estranho na internet sem conta não consegue fazer isso. A falha é o funcionário em quem você já confiou para gerenciar webhooks, personificando as pessoas em quem você 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 solicita ao servidor que anexe tokens de autenticação para uids nomeados quando o webhook for disparado. TokenService::createEphemeralToken gera IToken::PERMANENT_TOKEN com password = null. Senha de aplicativo. O 2FA já ficou para trás.
O PR #60543 restringiu create: a menos que você seja um administrador completo da instância, tokenNeeded é anulado. Criei um webhook como o usuário delegado hooker com tokenNeeded.user_ids: ["admin"]. O tokenNeeded armazenado era []. Create está restrito. Por um minuto, isso parece um patch concluído.
Então enviei o mesmo corpo via POST para /webhooks/{id}. O user_ids armazenado era ['admin']. update() nunca copiou o if.
Enviei um arquivo via PUT como hooker para que NodeCreatedEvent fosse disparado. O cron executa WebhookCall. O JSON do catcher tem authentication.user_ids.admin.token. Um GET com Bearer do arquivo testemunha privado do admin retornou 200, X-User-Id: admin.
Formas de isso falhar sem ensinar nada: update 403 (o controller já corresponde ao create); create já gerando tokens (#60543 não está no build); authentication vazio no catcher (o cron não gerou); caminho de cabeçalho ExApp (o usuário do laboratório é o delegado hooker).
cd lab
./run.sh
Aponte apenas para 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 o null-out de isAdmin da criação para update(). Até que isso seja lançado, não delegue as configurações de Webhooks a grupos que não sejam de administradores.
da02f41)GNU Affero GPL v3.0. Consulte LICENSE. Apenas laboratório em loopback. Sem garantias.