
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
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 luego 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 nombre) 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 la 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 liste, incluido admin.
Con ese inicio de sesión pueden:
No necesitan un shell de PHP en el host. No necesitan ser un administrador completo de la instancia. Un desconocido en internet sin cuenta no puede hacer esto. El agujero es el empleado en quien ya confiaste con los webhooks, suplantando a las personas en quienes no confiaste.
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 le pide al servidor que adjunte tokens de autenticación para los uids nombrados cuando se dispare el webhook. TokenService::createEphemeralToken acuña IToken::PERMANENT_TOKEN con password = null. Contraseña de aplicación. El 2FA ya quedó atrás.
El PR #60543 restringió 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 fue []. Create está restringido. Por un minuto eso parece un parche terminado.
Luego envié por POST el mismo cuerpo a /webhooks/{id}. El user_ids almacenado fue ['admin']. update() nunca copió el if.
Subí un archivo por PUT como hooker para que se dispare NodeCreatedEvent. Cron ejecuta WebhookCall. El JSON del catcher 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 muere sin enseñarte nada: update 403 (el controlador ya coincide con create); create ya acuñando tokens (#60543 no está en la compilación); authentication vacío en el catcher (cron no acuñó); ruta de encabezado ExApp (el usuario del laboratorio es el delegado hooker).
cd lab
./run.sh
Objetivo solo http://127.0.0.1:18320 (Nextcloud) y :18321 (catcher).
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
Copia la anulación de isAdmin de create dentro de update(). Hasta que eso se publique, no delegues la configuración de Webhooks a grupos que no sean admin.
da02f41)GNU Affero GPL v3.0. Ver LICENSE. Solo laboratorio en loopback. Sin garantía.