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-33146 — Un partage public semblait propre dans l'arborescence de pages, mais le point de terminaison de recherche racontait une histoire différente. Dans Docmost, les pages enfants restreintes, cachées des spectateurs du partage public, pouvaient encore fuir à travers les résultats de recherche du partage public. | Kitploit
Outils/GitHubGitHub/0xmrma/cve-2026-33146
Analyse des VulnérabilitésCollecte d'InformationsSécurité WebTests d'IntrusionArticles et RechercheApprentissage et Éducation
GitHub0xmrma/cve-2026-33146

CVE-2026-33146

Voir le dépôt
2il y a 2 moisPas 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 →

À propos

Un partage public semblait propre dans l'arborescence de pages, mais le point de terminaison de recherche racontait une histoire différente. Dans Docmost, les pages enfants restreintes, cachées des spectateurs du partage public, pouvaient encore fuir à travers les résultats de recherche du partage public.

Partager

CVE-2026-33146

Un partage public semblait propre dans l'arborescence des pages, mais le point de terminaison de recherche racontait une histoire différente. Dans Docmost, les pages enfants restreintes, masquées aux visiteurs du partage public, pouvaient tout de même fuiter via les résultats de recherche du partage public.

Introduction

J'ai découvert ce problème en examinant Docmost, une plateforme wiki et de documentation collaborative open-source, avec une question très simple en tête :

Si une page est intentionnellement masquée à un visiteur de partage public, est-ce que toutes les fonctionnalités publiques respectent cette même restriction ?

Dans ce cas, la réponse était non.

Une page enfant restreinte pouvait rester cachée dans l'arborescence du partage public tout en fuitant via le point de terminaison de recherche du partage public.

Le problème a été accepté et a reçu l'identifiant CVE-2026-33146.

Docmost : Docmost sur GitHub
CVE : CVE-2026-33146

Le site officiel de Docmost le présente comme un wiki sur site prêt pour l'entreprise avec plus de 3 millions de téléchargements, et indique qu'il est utilisé par des équipes d'organisations comme Vilnius City, Bechtle, le gouvernement australien, la Croix-Rouge et ETS Québec.

photo0

Chaîne d'attaque

partage parent public avec sous-pages activées → descendant restreint omis de l'arborescence publique → attaquant interroge la recherche du partage public → titre et extrait de l'enfant restreint fuient


Ce que fait Docmost

Docmost est une plateforme wiki et de documentation collaborative.

Elle propose :

  • des pages partagées
  • des liens de partage public
  • des arborescences de pages imbriquées
  • une organisation du contenu par espace de travail et espace
  • une recherche dans le contenu partagé

Cela signifie que son modèle de partage public constitue une véritable frontière de sécurité.

La question importante ici n'était pas de savoir si Docmost peut partager des pages publiquement.

La vraie question était :

Lorsque Docmost décide qu'une page descendante est restreinte et ne doit pas apparaître à un visiteur du partage public, cette restriction est-elle appliquée partout dans le flux de partage public ?

Dans ce cas, elle ne l'était pas.


Pourquoi ce bug méritait d'être examiné

De nombreuses analyses de sécurité s'arrêtent trop tôt dès qu'elles constatent qu'une page est masquée dans l'interface utilisateur.

Ce n'est pas suffisant.

La question plus forte est celle-ci :

Est-ce que chaque chemin côté serveur applique la même décision de visibilité ?

C'est important car les frontières de sécurité ne sont pas définies par l'apparence de l'interface.
Elles sont définies par ce que le serveur renvoie réellement.

Ici, le point de terminaison de l'arborescence publique se comportait correctement :

  • les descendants restreints étaient masqués

Mais le chemin de recherche du partage public se comportait différemment :

  • les descendants restreints influençaient toujours les résultats
  • leurs titres fuyaient
  • leurs extraits de contenu surlignés fuyaient

Cela en faisait un véritable problème d'autorisation et de divulgation d'informations, et pas seulement une incohérence d'affichage.


La frontière sur laquelle je me suis concentré

Je n'ai pas abordé Docmost en effectuant des tests aléatoires sur les routes en espérant que quelque chose d'intéressant apparaisse.

La meilleure approche était de choisir d'abord une frontière de confiance.

Pour les applications qui prennent en charge :

  • le partage public
  • les objets imbriqués
  • les restrictions par page
  • la recherche de contenu

l'une des meilleures questions à se poser est :

La couche de recherche applique-t-elle exactement la même frontière d'autorisation que la couche de navigation ?

Cette question devient particulièrement pertinente lorsque :

  • un objet parent est public
  • les descendants ont des règles de visibilité différentes
  • la recherche est implémentée via un chemin de service distinct

C'est exactement là où ce problème est apparu.


Cause racine

Le bug n'était pas que Docmost n'ait pas masqué la page restreinte dans l'arborescence publique normale.

Le bug était que la recherche publique n'honorait pas cette même logique de restriction.

D'après la revue du code source, le flux de l'arborescence publique utilisait une traversée des descendants tenant compte des restrictions.

Zone concernée :

  • apps/server/src/core/share/share.service.ts

Ce chemin excluait intentionnellement les descendants restreints en utilisant :

  • getPageAndDescendantsExcludingRestricted(...)

Mais le flux de recherche du partage public suivait un chemin différent.

Zones concernées :

  • apps/server/src/core/search/search.controller.ts
  • apps/server/src/core/search/search.service.ts

Là, le code collectait les descendants en utilisant :

  • getPageAndDescendants(...)

Cela signifiait que les descendants restreints restaient dans le périmètre de la recherche.

Dans le contexte du partage public, cela a une grande importance car la branche de recherche s'exécute sans le contexte de permissions d'un utilisateur authentifié normal. Ainsi, une fois que les descendants restreints étaient inclus dans l'ensemble des pages consultables, leurs métadonnées pouvaient fuiter via la réponse.

Pourquoi c'est exploitable

Parce que l'attaquant n'a pas besoin d'un compte authentifié.

Il a seulement besoin :

  • d'une clé de partage public valide
  • que les sous-pages soient incluses dans le partage
  • de connaître ou de deviner des termes de recherche susceptibles d'apparaître dans les descendants masqués

Une fois cette condition réunie, un visiteur public peut interroger le point de terminaison de recherche du partage et récupérer :

  • les titres des pages masquées
  • des extraits de corps surlignés
  • la preuve qu'une page enfant restreinte existe sous le parent partagé

C'est suffisant pour créer une fuite de confidentialité, même si le corps complet de la page n'est pas renvoyé.


Ce qui en fait un problème de sécurité, et non pas un simple comportement différent entre points de terminaison

La distinction importante est que l'application signale déjà clairement le modèle de sécurité prévu.

Le point de terminaison de l'arborescence publique masque les descendants restreints.

Donc la vraie question n'est pas :

« Est-ce que la recherche renvoie par hasard un ensemble de résultats plus large ? »

La vraie question est :

« Est-ce que la recherche viole une décision d'autorisation déjà appliquée ailleurs pour la même frontière de partage public ? »

Dans Docmost, c'était le cas.

Cela transforme ce problème :

  • d'une fonctionnalité incohérente

en :

  • un contrôle d'accès incohérent

C'est pourquoi il s'agit d'une véritable vulnérabilité.


Preuve de concept (PoC)

J'ai validé le problème en comparant les deux points de terminaison publics concernés côte à côte.

Cas 1 : L'arborescence publique masque correctement l'enfant restreint

D'abord, j'ai testé le point de terminaison normal de l'arborescence publique en utilisant la clé de partage public.

Exemple de requête :

root@kitploit:~
POST /api/shares/tree HTTP/1.1
Host: 127.0.0.1:6752
Content-Type: application/json

{
  "shareId": "public-share-key"
}

La réponse renvoyait uniquement la page enfant publique dans l'arborescence.

Résultat représentatif :

root@kitploit:~
{
  "pageTree": [
    {
      "id": "public-child",
      "title": "Public roadmap"
    }
  ]
}

Cela établissait le comportement attendu du produit :

  • l'enfant restreint était intentionnellement masqué au visiteur public

Cas 2 : La recherche du partage public fuit toujours l'enfant restreint

J'ai ensuite interrogé le point de terminaison de recherche du partage public avec un terme apparaissant dans le descendant restreint.

Exemple de requête :

root@kitploit:~
POST /api/search/share-search HTTP/1.1
Host: 127.0.0.1:6752
Content-Type: application/json

{
  "shareId": "public-share-key",
  "query": "salary"
}

La réponse incluait tout de même l'enfant restreint :

root@kitploit:~
{
  "items": [
    {
      "id": "public-child",
      "title": "Public roadmap",
      "highlight": "release plan and milestones"
    },
    {
      "id": "restricted-child",
      "title": "Payroll Q4",
      "highlight": "salary bands and bonus targets"
    }
  ]
}

Cela prouvait l'affirmation centrale :

  • l'enfant restreint était masqué dans l'arborescence publique
  • mais fuitait toujours via la recherche du partage public

Pourquoi les deux reproductions sont importantes

La partie la plus forte de ce problème n'est pas la deuxième requête en elle-même.

C'est le contraste entre les deux points de terminaison.

Premièrement

Cela montre que le produit a déjà un modèle de restriction intentionnel pour les partages publics.

Le descendant restreint n'est pas censé être visible pour le visiteur public.

Deuxièmement

Cela prouve que le chemin de recherche brise exactement cette même frontière.

Cela rend le problème plus difficile à écarter comme un comportement de recherche attendu ou une lacune documentaire.

L'application elle-même établit la règle via la réponse de l'arborescence, puis la viole via la réponse de la recherche.

C'est une preuve solide.


Ce que la fuite donne réellement à un attaquant

Ce problème n'expose pas un contenu arbitraire dans tout l'espace de travail.

Son périmètre est plus restreint.

Mais dans la sous-arborescence du partage public concernée, il donne quand même à un attaquant des connaissances non autorisées utiles :

  • des titres de documents masqués
  • des extraits surlignés de contenu masqué
  • la confirmation que des descendants restreints existent
  • des indices sur la paie, le juridique, la planification, les identifiants ou les opérations internes selon le contenu du document

Même de courts extraits peuvent être importants.

Un titre comme :

  • paie
  • plan de recrutement
  • projet juridique
  • incident client
  • rotation d'identifiants

crée déjà une valeur de sécurité pour un attaquant.

Donc, bien que cela ait finalement été classé comme Modérée, il s'agit toujours d'un problème de confidentialité valide avec une rupture de frontière claire et défendable.


Sévérité et classification

Ce problème a reçu :

  • CVE-2026-33146

La sévérité de l'avis était :

  • Modérée
  • CVSS : CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:N/A:N

Ce score reflète une fuite de confidentialité plus restreinte plutôt qu'un accès complet non autorisé aux documents.

Le point important est que le problème reste valide.

L'affirmation ici n'est pas :

  • lecture complète de page
  • divulgation arbitraire de l'espace de travail
  • impact sur l'intégrité
  • impact sur la disponibilité

L'affirmation est :

  • un visiteur du partage public peut récupérer des métadonnées d'une page enfant restreinte que le produit masque intentionnellement ailleurs dans le même flux de partage public

C'est une véritable divulgation d'informations liée à l'autorisation.


Pourquoi cela valait quand même la peine d'être signalé

Certaines personnes rejettent trop rapidement les fuites de métadonnées.

C'est une erreur.

La vraie question est de savoir si les données divulguées franchissent une frontière prévue.

Ici, c'était le cas.

Si l'application dit :

  • cet enfant restreint ne doit pas être visible pour les visiteurs du partage public

mais qu'un point de terminaison public révèle quand même :

  • son titre
  • une partie de son contenu

alors le modèle de confidentialité a échoué, même si l'impact est limité.

Cela mérite donc d'être signalé.

Des bugs propres, précis et reproductibles comme celui-ci sont exactement le genre de problèmes qui aident à démontrer un bon jugement en matière de revue de sécurité.


Analyse de la correction

La direction de correction la plus sûre est de faire en sorte que la recherche publique utilise la même logique de descendants tenant compte des restrictions que le flux de l'arborescence publique.

En pratique, cela signifie que la branche de recherche du partage ne devrait pas énumérer les descendants avec :

root@kitploit:~
getPageAndDescendants(...)

Elle devrait plutôt s'aligner sur la traversée plus sûre du partage public et utiliser :

root@kitploit:~
getPageAndDescendantsExcludingRestricted(...)

Une correction alternative consisterait à conserver l'énumération plus large, puis à filtrer explicitement les descendants restreints avant que la requête de recherche ne renvoie les résultats.

Mais la conception la plus propre est simple :

la frontière de recherche doit correspondre à la frontière de navigation

C'est la propriété de sécurité qui a échoué.


Divulgation

Ce problème a été signalé de manière privée via le flux de signalement de sécurité de GitHub.

Le rapport montrait :

  • le comportement sûr prévu via /api/shares/tree
  • le comportement vulnérable incohérent via /api/search/share-search
  • la cause sous-jacente au niveau du code source
  • un chemin de reproduction concret

Le problème a été accepté et a reçu :

CVE-2026-33146

La sévérité finale de l'avis était Modérée, ce qui correspond mieux au périmètre de fuite plus restreint qu'une revendication de criticité plus large ne l'aurait fait.

Cela n'affaiblit pas la validité de la découverte.

Cela définit simplement son impact de manière plus précise.


Ce que ce bug enseigne réellement

La leçon clé ici est simple :

masquer quelque chose dans un point de terminaison public ne suffit pas si un autre point de terminaison public le révèle encore.

Beaucoup de développeurs ne pensent à l'autorisation que dans le chemin de rendu évident :

  • arborescence des pages
  • vue de la page
  • interface principale

Mais la véritable frontière est plus large.

Vous devez aussi vous demander :

  • la recherche respecte-t-elle les mêmes règles ?
  • les canaux secondaires respectent-ils les mêmes règles ?
  • les réponses de métadonnées respectent-elles les mêmes règles ?

Dans Docmost, la réponse était non.

C'est le véritable enseignement.


Points clés

  • les fonctionnalités de partage public doivent appliquer le même modèle de visibilité dans les chemins de navigation et de recherche
  • les fuites de métadonnées comptent toujours lorsqu'elles franchissent une frontière d'autorisation prévue
  • la comparaison côte à côte des points de terminaison rend cette classe de problème beaucoup plus solide
  • les descendants restreints ne doivent jamais rester consultables s'ils sont masqués au même visiteur public
  • un périmètre restreint ne rend pas un bug valide indigne d'être signalé
  • une bonne revue de sécurité consiste souvent à tester la cohérence, pas seulement à trouver des plantages ou des contournements complets

Derniers mots

Cette vulnérabilité ne concernait pas des payloads flashy ou des chaînes d'exploitation complexes.

Il s'agissait de poser une question très pratique sur les frontières de confiance.

Docmost masquait la page restreinte à un endroit.
Puis la fuyait à un autre.

C'est pourquoi cela est devenu CVE-2026-33146.

Télécharger l’outil