Reports
MEDIA[IDOR / BOLA]#3599383

Nextcloud Deck: la API de configuración acepta preferencias de tableros ajenos sin comprobar permisos

El endpoint de configuración de Deck guardaba claves del tipo board:<id>:<clave> para cualquier ID de tablero, sin verificar que el usuario tuviera acceso a ese tablero.

Resumen
Resumen en castellano de un reporte público, no una traducción literal. El código y los comandos se mantienen como en el original.

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

  1. Iniciar sesión en Nextcloud con una cuenta de bajos privilegios (en la prueba, test100_1).
  2. Localizar el ID de un tablero de Deck que pertenezca a otro usuario. En la prueba se usó el tablero 28, propiedad de admin.
  3. 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"}'
  1. Comprobar la respuesta del servidor: según el investigador, indica que el valor se ha guardado correctamente.
  2. 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.