CVE-2026-68586: Cross-Boundary Content Disclosure via “getBacklinkDoc” and “getBackmentionDoc” in SiYuan

Note-taking tools that offer a “publish” mode carry a specific promise, whatever an administrator marks as private stays private, no matter which API a reader calls to get there. CVE-2026-68586, a SiYuan vulnerability disclosed in the “getBacklinkDoc” and “getBackmentionDoc” endpoints, shows what happens when that promise holds on one code path and quietly fails on a neighbouring one.

This SiYuan missing authorization vulnerability carries a CWE-862 classification and a CVSS 4.0 score of 9.2 (Critical). SiYuan is an open-source, self-hosted note-taking and personal knowledge management application built around block-level referencing, used by individuals and teams to store notes, documentation, and internal knowledge on their own infrastructure rather than a vendor’s cloud. Its publish feature lets a user expose part of their workspace as a public or password-gated site, which is the mode CVE-2026-68586 affects.

CVE-2026-68586 was discovered by Shirshak Roy, Security Engineer at SECNORA. It is one of eight CVEs identified in SiYuan. Below is a breakdown of the root cause behind this content disclosure vulnerability, its full CVSS scoring, the exploitation path, and the fix shipped in v3.7.3. 

Vulnerability Details

  • CVE ID: CVE-2026-68586
  • GHSA ID: GHSA-36v8-mpjm-8j5r
  • Affected product: SiYuan (Privacy-first, local Note Taking Management System)
  • Affected versions: All versions up to and including v3.7.2
  • Patched version: v3.7.3
  • Weakness: CWE-862, Missing Authorization
  • CVSS 4.0: 9.2 (Critical)
  • Vector: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N

The Architectural Context: SiYuan’s Backlink API

SiYuan’s publish mode exposes backlink endpoints in two categories, and that split is where CVE-2026-68586 originates.

  • List endpoints – getBacklink and getBacklink2 identify which documents reference a given block.
  • Content endpoints – getBacklinkDoc and getBackmentionDoc return the rendered DOM of those referencing blocks.

A consistent implementation would apply the same publish-access boundary to both categories. If a document is marked publish-forbidden, neither its existence in a reference list nor its rendered content should reach an outside reader. That consistency is exactly what CVE-2026-68586 breaks.

The Core Vulnerability: Asymmetry in Authorization

This is where the CVE-2026-68586 authorization bypass takes shape. SiYuan applied the publish-access boundary to one side only:

  • The list endpoints route requests through FilterPathsByPublishAccess, a function that checks whether the requester has rights to view the referenced document.
  • The content endpoints skip this authorization check entirely, which is what turns a routine backlink lookup into a content disclosure vulnerability.

getBacklinkDoc and getBackmentionDoc are gated by CheckAuth alone. That check passes for any published RoleReader token, and for anonymous requests when Publish.Auth.Enable is set to false. Neither endpoint evaluates whether the specific document being requested is actually permitted for public viewing.

The Code-Level Oversight Behind CVE-2026-68586

The file “model/backlink.go” contains no reference to the publish-access filter anywhere in it, which is the root cause CVE-2026-68586 traces back to. When a client calls getBacklinkDoc with the parameters defID and refTreeID, the function returns the rendered content of blocks inside refTreeID, the referencing document, with no check against that document’s publish status. A publish-forbidden, publish-disabled, or password-protected document’s content comes back the same way a public one would.

Exploiting CVE-2026-68586: Proof of Concept

Exploiting CVE-2026-68586 needs no elevated role, no CSRF token, and no administrator access. It requires network reach to the API plus two identifiers: refTreeID, the ID of the forbidden document, and defID, the ID of a block that document references. In practice defID is often already known, since a forbidden document commonly references public content elsewhere in the workspace.

The CVE-2026-68586 Attack Chain

  1. An administrator marks a document publish-forbidden. That document contains sensitive text and references a block inside a separate, public document.
  2. An anonymous reader queries the list endpoint “/api/ref/getBacklink2”. The publish-access filter works as intended here, so the forbidden document does not appear in the results.
  3. The reader sends a POST request directly to “/api/ref/getBacklinkDoc”, supplying the known defID and the refTreeID of the forbidden document.
  4. The server responds with HTTP 200. The response body contains the rendered DOM of the forbidden document, sensitive content included, delivered to an anonymous reader.

To make this concrete: a request to “/api/ref/getBacklinkDoc” carrying only “defID” and “refTreeID”, with no authentication header and no session cookie, returns a JSON payload whose “backlinks” array holds a “dom” field. That field is the forbidden document’s rendered HTML, exactly as an authorized viewer would see it, unmarked and unfiltered, sitting in the response body of an anonymous, unauthenticated call.

The same endpoint also works as a reference-existence oracle. By calling it with a guessed or known refTreeID, an attacker can determine whether a private, forbidden document references a specific block, independent of reading its content.

Scope and Impact of CVE-2026-68586

  • Confidentiality: High. Under CVE-2026-68586, an attacker can read the rendered content of a publish-forbidden document, one an administrator explicitly excluded from publishing.
  • Integrity: None. The endpoints only return data; nothing is written or modified.
  • Availability: None. Calling the endpoints does not degrade performance or uptime.

Preconditions: Exploiting CVE-2026-68586 requires both refTreeID and defID. defID can often be sourced from other endpoints that share the same missing-filter pattern, including the SQL execution path covered in CVE-2026-69084, which lowers the practical bar for obtaining both values.

Exceptions: Fully encrypted notebooks fall outside the scope of CVE-2026-68586 and remain protected.

CVE-2026-68586 was one of eight related SiYuan advisories from the same disclosure batch, all rooted in the same publish-access gap on different endpoints, including a metadata disclosure issue in getBlockInfo and a matching rendered-DOM disclosure on the getHeading*Transaction endpoints. The lesson across the batch is consistent: a security boundary enforced on one endpoint family and skipped on a related one is not really enforced at all.

Why This Matters for Enterprise Teams

SiYuan’s publish mode is commonly used to expose part of a workspace as a lightweight internal wiki or a client-facing knowledge base, without standing up a separate CMS. Teams doing this rely on the publish-forbidden and publish-disabled flags to keep specific documents, drafts, HR notes, incident write-ups, credentials scratch pads, client-specific pricing, out of that public surface while the rest of the workspace stays visible.

CVE-2026-68586 breaks exactly that assumption. An administrator can mark a document forbidden, verify it disappears from every listing and search result, and still have its full content readable by anyone who reaches the two affected endpoints with the right IDs. No login, no invite, no warning in the UI. For an organisation running publish mode against the open internet, that turns a single misjudged assumption, “if it’s not listed, it’s not reachable”, into a live confidentiality gap. The fix requires no configuration change on the operator’s side, only the version upgrade, which makes patching straightforward once the risk is understood.

Remediation: Patching CVE-2026-68586 in SiYuan v3.7.3

All SiYuan versions up to and including v3.7.2 are affected by CVE-2026-68586. v3.7.3 resolves the issue. The same release also closed CVE-2026-68584, the related publish-password bypass on the same family of content endpoints.

The patch applies the same publish-access logic already used by the list endpoints to their content-endpoint counterparts. getBacklinkDoc and getBackmentionDoc now filter each backlink by its source document’s path, using CheckPathAccessableByPublishIgnore alongside a publish-password cookie check, matching the boundary already enforced by FilterPathsByPublishAccess on the list side. Any endpoint that returns rendered block DOM now enforces the same publish boundary as its corresponding list endpoint.

Recommended Actions

  • Upgrade to SiYuan v3.7.3 or later.
  • Review publish-mode access logs for “/api/ref/getBacklinkDoc” and “/api/ref/getBackmentionDoc” calls that do not correspond to normal reader activity.
  • Treat this as a high-severity, network-exploitable authorization flaw and prioritise patching on any instance running publish mode with anonymous access enabled.

Conclusion

CVE-2026-68586 is a reminder that split API architectures, where one endpoint handles discovery and a related endpoint handles delivery, need matching authorization checks on both sides. A filter applied to the list view and skipped on the content view leaves the actual data exposed even when the index looks clean. Anyone running a public-facing SiYuan instance with publish mode enabled should confirm their version and upgrade to v3.7.3 or later.

SECNORA supports organisations with vulnerability assessments and managed detection and response, helping organisations identify and address vulnerabilities before they can be exploited. Talk to our team.

Reference