
Nextcloud 35.0.0 — un administrador de Webhooks delegado puede generar una contraseña de aplicación de administrador de 1h mediante webhook update tokenNeeded
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
Análisis: https://abraxaslabs.tech/research/nextcloud-webhook-tokenneeded
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create() anula tokenNeeded a menos que quien llama sea un administrador completo de la instancia. update() no lo hace. Un administrador delegado de la configuración de Webhooks (que no está en admin) puede almacenar tokenNeeded.user_ids: ["admin"] en un webhook existente y, a continuación, recibir una contraseña de aplicación PERMANENT_TOKEN sin alcance y con una hora de validez para ese uid cuando se dispare el evento.
Un actor malicioso en quien solo se confiaba para gestionar webhooks puede iniciar sesión como admin (o como cualquier usuario que designe) durante una hora, omitir el 2FA y leer o sobrescribir los archivos de esa persona.
| ID | aún sin 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 |
| Producto | Nextcloud Server |
| Afectado | 35.0.0 (da02f41) oficial nextcloud:35.0.0-apache |
| Autenticación | administrador delegado de la configuración de Webhooks (IDelegatedSettings) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Le diste a alguien la tarea de configuración de Webhooks. No está en el grupo admin. Nextcloud aun así le permite editar un webhook existente para que, en el siguiente evento coincidente, el servidor le envíe por correo un inicio de sesión de una hora para cualquier uid que indique, incluido admin.
Con ese inicio de sesión puede:
No necesita un shell de PHP en el host. No necesita ser un administrador completo de la instancia. Un desconocido en internet sin cuenta no puede hacer esto. El fallo es el empleado en quien ya confiabas para los webhooks, suplantando a las personas en quienes no confiabas.
WebhooksController es #[AuthorizedAdminSetting(settings: Admin::class)]. Admin implementa IDelegatedSettings. Así es como Nextcloud entrega un panel de configuración a un grupo que no es admin.
tokenNeeded solicita al servidor que adjunte tokens de autenticación para los uids indicados cuando se dispare el webhook. TokenService::createEphemeralToken genera IToken::PERMANENT_TOKEN con password = null. Contraseña de aplicación. El 2FA ya queda atrás.
El PR #60543 protegió create: a menos que seas un administrador completo de la instancia, tokenNeeded se anula. Creé un webhook como usuario delegado hooker con tokenNeeded.user_ids: ["admin"]. El tokenNeeded almacenado era []. Create está protegido. Durante un minuto parece un parche terminado.
Luego envié por POST el mismo cuerpo a /webhooks/{id}. El user_ids almacenado era ['admin']. update() nunca copió el if.
Subí un archivo por PUT como hooker para que se dispare NodeCreatedEvent. Cron ejecuta WebhookCall. El JSON del receptor tiene authentication.user_ids.admin.token. Un GET con Bearer del archivo testigo privado del admin devolvió 200, X-User-Id: admin.
Formas en que esto falla sin enseñarte nada: update 403 (el controlador ya coincide con create); create ya generando tokens (#60543 no está en la compilación); authentication vacío en el receptor (cron no generó el token); ruta de cabecera ExApp (el usuario del laboratorio es el delegado hooker).
cd lab
./run.sh
Dirígete solo a http://127.0.0.1:18320 (Nextcloud) y :18321 (catcher).
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
Copie el isAdmin anulado de create en update(). Hasta que eso se publique, no delegue la configuración de Webhooks a grupos que no sean administradores.
da02f41)GNU Affero GPL v3.0. Consulte LICENSE. Solo laboratorio de loopback. Sin garantía.