Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-33146 — A public share looked clean in the page tree, but the search endpoint told a different story. In Docmost, restricted child pages hidden from public share viewers could still leak through public share search results. | Kitploit
Tools/GitHubGitHub/0xmrma/cve-2026-33146
Vulnerability AnalysisInformation GatheringWeb SecurityPenetration TestingPapers & ResearchLearning & Education
GitHub0xmrma/cve-2026-33146

CVE-2026-33146

A public share looked clean in the page tree, but the search endpoint told a different story. In Docmost, restricted child pages hidden from public share viewers could still leak through public share search results.

View Repository
53 months agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-33146

A public share looked clean in the page tree, but the search endpoint told a different story. In Docmost, restricted child pages hidden from public share viewers could still leak through public share search results.

Intro

I found this issue while reviewing Docmost, an open-source collaborative wiki and documentation platform, with a very simple question in mind:

If a page is intentionally hidden from a public share viewer, does every public feature respect that same restriction boundary?

In this case, the answer was no.

A restricted child page could stay hidden in the public share tree while still leaking through the public share search endpoint.

The issue was accepted and assigned CVE-2026-33146.

Docmost: Docmost on GitHub
CVE: CVE-2026-33146

Docmost’s official site presents it as an enterprise-ready on-premises wiki with 3M+ downloads, and says it is trusted by teams at organizations including Vilnius City, Bechtle, the Australian Government, the Red Cross, and ETS Quebec.

photo0

Attack Chain

public parent share with subpages enabled → restricted descendant omitted from public tree → attacker queries public share search → restricted child title and snippet leak


What Docmost Does

Docmost is a collaborative wiki and documentation platform.

It provides:

  • shared pages
  • public share links
  • nested page trees
  • workspace and space-level content organization
  • search across shared content

That means its public-sharing model is a real security boundary.

The important question here was not whether Docmost can share pages publicly.

The real question was:

When Docmost decides a descendant page is restricted and should not appear to a public share visitor, does that restriction hold everywhere in the public share flow?

In this case, it did not.


Why This Bug Was Worth Looking At

A lot of security reviews stop too early once they see a page hidden in the UI.

That is not enough.

The stronger question is this:

Does every backend path enforce the same visibility decision?

That matters because security boundaries are not defined by what the interface looks like.
They are defined by what the server actually returns.

Here, the public tree endpoint behaved safely:

  • restricted descendants were hidden

But the public share search path behaved differently:

  • restricted descendants still influenced results
  • their titles leaked
  • their highlighted content snippets leaked

That made this a real authorization and information disclosure issue, not just a presentation inconsistency.


The Boundary I Focused On

I did not approach Docmost by randomly fuzzing routes and hoping something interesting appeared.

The stronger path was to choose a trust boundary first.

For applications that support:

  • public sharing
  • nested objects
  • per-page restrictions
  • content search

one of the best questions to ask is:

Does the search layer enforce the exact same authorization boundary as the browse layer?

That question becomes especially valuable when:

  • a parent object is public
  • descendants have different visibility rules
  • search is implemented through a separate service path

That is exactly where this issue showed up.


Root Cause

The bug was not that Docmost failed to hide the restricted page in the normal public tree.

The bug was that public search did not honor that same restriction logic.

From source review, the public tree flow used restricted-aware descendant traversal.

Relevant area:

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

That path intentionally excluded restricted descendants by using:

  • getPageAndDescendantsExcludingRestricted(...)

But the public share search flow followed a different path.

Relevant areas:

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

There, the code collected descendants using:

  • getPageAndDescendants(...)

That meant restricted descendants remained in scope for search.

In the public-share context, that matters a lot because the search branch runs without a normal authenticated user permission context. So once restricted descendants were included in the searchable page set, their metadata could leak through the response.

Why this is exploitable

Because the attacker does not need an authenticated account.

They only need:

  • a valid public share key
  • subpages included in the share
  • knowledge of, or guesses about, search terms likely to appear in hidden descendants

Once that condition exists, a public visitor can query the share-search endpoint and recover:

  • hidden page titles
  • highlighted body snippets
  • proof that a restricted child page exists under the shared parent

That is enough to create a confidentiality leak, even if the full page body is not returned.


What Makes This a Security Issue, Not Just Different Endpoint Behavior

The important distinction is that the application already signals the intended security model clearly.

The public tree endpoint hides restricted descendants.

So the real question is not:

“Does search happen to return a broader result set?”

The real question is:

“Is search violating an authorization decision already enforced elsewhere for the same public share boundary?”

In Docmost, it was.

That turns this from:

  • inconsistent functionality

into:

  • inconsistent access control enforcement

That is why this is a real vulnerability.


PoC

I validated the issue by comparing the two relevant public endpoints side by side.

Case 1: Public tree correctly hides the restricted child

First, I tested the normal public tree endpoint using the public share key.

Example request:

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

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

The response returned only the public child page in the page tree.

Representative result:

{
  "pageTree": [
    {
      "id": "public-child",
      "title": "Public roadmap"
    }
  ]
}

That established the expected product behavior:

  • the restricted child was intentionally hidden from the public visitor

Case 2: Public share search still leaks the restricted child

I then queried the public share search endpoint using a term that appeared inside the restricted descendant.

Example request:

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

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

The response included the restricted child anyway:

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

That proved the core claim:

  • the restricted child was hidden in the public tree
  • but still leaked through public share search

Why the Two Reproductions Matter

The strongest part of this issue is not the second request by itself.

It is the contrast between the two endpoints.

First

It shows the product already has an intended restriction model for public shares.

The restricted descendant is not supposed to be visible to the public visitor.

Second

It proves the search path breaks that exact same boundary.

That makes the issue harder to dismiss as expected search behavior or a documentation gap.

The application itself establishes the rule through the tree response, then violates it through the search response.

That is powerful evidence.


What the Leak Actually Gives an Attacker

Download Tool