Nextcloud 35.0.0 — el secreto de recurso compartido federado es una contraseña de aplicación sin alcance para todo el árbol de Archivos del usuario que comparte
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-federated-ocm-token
Nextcloud Server 35.0.0 - Nextcloud GmbH
Un secreto de recurso compartido federado se acuña como una contraseña de aplicación PERMANENT_TOKEN sin alcance para quien comparte. La API del destinatario lo devuelve como refresh_token. Reutilizarlo como Bearer en el WebDAV del emisor inicia sesión como quien comparte y lee archivos que nunca fueron compartidos.
Un actor malicioso con el que compartes federadamente un solo archivo puede iniciar sesión como tú en tu Nextcloud, omitir el 2FA y leer o sobrescribir todos tus archivos, no solo el que compartiste.
| ID | aún sin CVE |
| CWE | CWE-269, CWE-287 |
| CVSS | Crítico: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N (destinatario federado). La conversión de enlace público es peor (sin cuenta de destinatario en un par). |
| Producto | Nextcloud Server |
| Afectado | 35.0.0 (da02f41) oficial nextcloud:35.0.0-apache |
| Autenticación | destinatario federado (o conversor de enlace público) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Compartes un archivo o carpeta con bob en otro Nextcloud. Nextcloud acuña un secreto de 32 caracteres, lo almacena como tu contraseña de aplicación y entrega ese secreto a Bob como refresh_token.
Bob (o cualquiera que convierta tu enlace público en un recurso compartido federado) entonces:
No obtienen una shell PHP en el host. No necesitan tu contraseña. No aceptes el recurso compartido ni llames primero a OCM access-token: ese intercambio bloquea el alcance del sistema de archivos. El laboratorio demuestra el secreto previo al intercambio.
Un recurso compartido se supone que es un recurso compartido. Un archivo. Una carpeta. Leí FederatedShareProvider::createFederatedShare en la etiqueta v35.0.0. Acuña un secreto de 32 caracteres como IToken::PERMANENT_TOKEN para quien comparte sin alcance. PublicKeyToken::getScopeAsArray establece por defecto SCOPE_FILESYSTEM => true. Eso es una contraseña de aplicación. Session::tryTokenLogin acepta un Bearer permanente.
El trabajo de intercambio OCM (PR #57234 / #57166) ya bloquea el alcance del sistema de archivos después del primer intercambio. Un informe no oficial usó ese salto posterior al intercambio. Lo probé primero. En este árbol el token intercambiado es TEMPORARY, llamado OCM Access Token, y /remote.php/dav lo rechaza (allowOcmAccessToken false). DAV dijo no.
Así que no intercambié. ocm_discovery_enabled permaneció en false para que el destinatario no lo intercambiara por mí. Dos máquinas oficiales nextcloud:35.0.0-apache, overwrite.cli.url como DNS de docker (http://sender / http://recipient). Déjalo en 127.0.0.1 y S2S habla consigo mismo.
Alice comparte un archivo con bob@http://recipient. Bob lee los recursos compartidos pendientes. refresh_token longitud 32. access_token longitud 0. Un GET Bearer no autenticado del archivo testigo privado de Alice, nunca incluido en el recurso compartido, devolvió 200, X-User-Id: alice.
cd lab
./run.sh
Objetivo solo http://127.0.0.1:18340 (emisor) y :18341 (destinatario).
SUCCESS NEXTCLOUD-OCM-PERMANENT-TOKEN who=federated-recipient uid=alice NEXTCLOUD-OCM-PERMANENT-TOKEN-WITNESS
Acuñar el secreto federado con alcance del sistema de archivos en false desde la primera inserción. No aceptar ese secreto como Bearer/Basic en /remote.php/dav. El primer intercambio ya bloquea el alcance del FS; la creación nunca debió haber entregado una contraseña de aplicación.
GNU Affero GPL v3.0. Ver LICENSE. Solo laboratorio en loopback. Sin garantía.