Resumen
Deck, la aplicación de tableros kanban de Nextcloud, expone una API OCS para guardar preferencias. Algunas de esas preferencias van ligadas a un tablero concreto y se nombran con la estructura board:<boardId>:<clave>, por ejemplo board:28:notify-due para las notificaciones de vencimiento.
El fallo está en que la API se fiaba de esa estructura sin más: aceptaba la clave para cualquier ID de tablero sin comprobar si el usuario autenticado era propietario del tablero o tenía permiso para gestionarlo. El investigador lo demostró con una cuenta sin privilegios (test100_1) que consiguió guardar la clave board:28:notify-due en la tabla oc_preferences, pese a que el tablero 28 pertenecía al usuario admin.
Endpoint afectado:
POST /ocs/v2.php/apps/deck/api/v1.0/config/board:<boardId>:<clave>
El problema tiene asignado el identificador CVE-2026-77170 y está documentado en el aviso de seguridad GHSA-4qq6-5jc4-336f de Nextcloud. El programa pagó recompensa, aunque el importe no es público. Se reportó el 12 de marzo de 2026 y se divulgó el 17 de septiembre de 2026.
Pasos de reproducción
- Iniciar sesión en Nextcloud con una cuenta de bajos privilegios (en la prueba,
test100_1). - Localizar el ID de un tablero de Deck que pertenezca a otro usuario. En la prueba se usó el tablero
28, propiedad deadmin. - Con la sesión de la cuenta sin privilegios, enviar la petición de configuración apuntando a ese tablero:
curl -i -X POST \
'http://172.16.88.94:8081/ocs/v2.php/apps/deck/api/v1.0/config/board:28:notify-due' \
-H 'OCS-APIRequest: true' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'oc_sessionPassphrase=[REDACTADO]; nc_sameSiteCookielax=true; nc_sameSiteCookiestrict=true; ocrzkzhsljc2=[REDACTADO]; nc_username=test100_1; nc_token=[REDACTADO]; nc_session_id=[REDACTADO]' \
-d '{"value": "all"}'
- Comprobar la respuesta del servidor: según el investigador, indica que el valor se ha guardado correctamente.
- Confirmarlo en la base de datos consultando
oc_preferences:
SELECT userid, appid, configkey, configvalue
FROM oc_preferences
WHERE configkey = 'board:28:notify-due';
La clave aparece escrita en la base de datos aunque el tablero es de otro usuario.
Impacto
Cualquier usuario autenticado podía guardar entradas de configuración asociadas a cualquier ID de tablero, incluidos los de otros usuarios. Según el investigador, esto abre la puerta a:
- Modificar sin autorización ajustes ligados a tableros ajenos.
- Manipular las preferencias de notificación asociadas a esos tableros.
- Problemas de integridad en el sistema de configuración de tableros.
- Comportamientos inesperados si en versiones futuras se añaden más claves de configuración por tablero, ya que la API aceptaría cualquier combinación
board:<boardId>:<clave>.
Remediación
Nextcloud corrigió el fallo y lo documentó en el aviso de seguridad GHSA-4qq6-5jc4-336f. El reporte no detalla el cambio concreto aplicado.