CVE-2026-68586: SiYuan: missing authz leaks forbidden doc content via backlink API
GHSA-36v8-mpjm-8j5rHIGHPoC AVAILABLESiYuan's backlink API has an authorization gap: the endpoints that list which documents reference a given block correctly filter out publish-forbidden documents, but the two endpoints that return the actual rendered content (getBacklinkDoc, getBackmentionDoc) skip that check entirely, letting an anonymous reader or low-privilege publish user pull the rendered text of documents an admin explicitly marked private, disabled, or password-protected. With CVSS 8.6 and no authentication, CSRF token, or write access required, this is a straightforward confidentiality breach against any self-hosted or publish-mode SiYuan instance exposed to untrusted readers, though EPSS sits at 0.00241 (low real-world exploitation probability) and there is no CISA KEV listing, public exploit, or Nuclei template yet. The bigger operational signal is the 2,997 downstream dependents, an OpenSSF Scorecard of 5.7/10, and 44 other CVEs in this package, pointing to broad exposure and a codebase with a recurring pattern of access-control gaps. Patch to the fixed commit (f45749a7ef6e, released 2026-07-21) on any instance running publish mode immediately; until patched, disable publish mode or restrict network access to trusted readers, and audit access logs for getBacklinkDoc/getBackmentionDoc calls referencing document IDs a reader should not know about.
What is the risk?
Confidentiality-only, no-authentication content-disclosure flaw (CWE-862, CVSS 3.1 8.6, AV:N/AC:L/PR:N/UI:N). Exploitability is trivial once an attacker knows a forbidden document's ID and a block it references (the second requirement is often trivially met if the forbidden doc references any publicly known block, or obtainable via other unfiltered CheckAuth-only endpoints per the advisory). No public exploit code or scanner template exists yet and EPSS is low (0.00241), so this looks like an opportunistic/targeted risk rather than a mass-exploited one — but the low barrier to exploitation (a single unauthenticated POST request) means any exposed publish-mode instance should be treated as at risk. The asymmetry between filtered list endpoints and unfiltered content endpoints suggests the underlying pattern (forgetting to apply the publish-access filter) may recur elsewhere in the same codebase, consistent with the package's 44 other CVEs and mediocre 5.7/10 OpenSSF Scorecard.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Jupyter Notebook | go | < 0.0.0-20260721014413-f45749a7ef6e | 0.0.0-20260721014413-f45749a7ef6e |
Do you use Jupyter Notebook? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step1) Patch immediately to the version at or after commit f45749a7ef6e (2026-07-21) which applies the same FilterPathsByPublishAccess / CheckPathAccessableByPublishIgnore checks used by getBacklink/getBacklink2 to the content endpoints. 2) Until patched, disable Publish mode entirely, or enable Publish.Auth.Enable and enforce publish-password protection on any document containing sensitive content, since the flaw is reachable by any RoleReader token and by anonymous users when publish auth is off. 3) Restrict network exposure of the publish port (6808 in the advisory's PoC) to trusted networks/VPN as defense in depth. 4) Detection: monitor kernel logs/reverse-proxy access logs for repeated getBacklinkDoc/getBackmentionDoc calls with varying refTreeID values from a single anonymous or reader session — this pattern indicates ID enumeration or targeted probing for forbidden documents. 5) Review whether any publish-forbidden document was accessed via these endpoints prior to patching, since the advisory notes this also functions as a reference-existence oracle even without full content leakage.
What does CISA's SSVC say?
Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-68586?
SiYuan's backlink API has an authorization gap: the endpoints that list which documents reference a given block correctly filter out publish-forbidden documents, but the two endpoints that return the actual rendered content (getBacklinkDoc, getBackmentionDoc) skip that check entirely, letting an anonymous reader or low-privilege publish user pull the rendered text of documents an admin explicitly marked private, disabled, or password-protected. With CVSS 8.6 and no authentication, CSRF token, or write access required, this is a straightforward confidentiality breach against any self-hosted or publish-mode SiYuan instance exposed to untrusted readers, though EPSS sits at 0.00241 (low real-world exploitation probability) and there is no CISA KEV listing, public exploit, or Nuclei template yet. The bigger operational signal is the 2,997 downstream dependents, an OpenSSF Scorecard of 5.7/10, and 44 other CVEs in this package, pointing to broad exposure and a codebase with a recurring pattern of access-control gaps. Patch to the fixed commit (f45749a7ef6e, released 2026-07-21) on any instance running publish mode immediately; until patched, disable publish mode or restrict network access to trusted readers, and audit access logs for getBacklinkDoc/getBackmentionDoc calls referencing document IDs a reader should not know about.
Is CVE-2026-68586 actively exploited?
Proof-of-concept exploit code is publicly available for CVE-2026-68586, increasing the risk of exploitation.
How to fix CVE-2026-68586?
1) Patch immediately to the version at or after commit f45749a7ef6e (2026-07-21) which applies the same FilterPathsByPublishAccess / CheckPathAccessableByPublishIgnore checks used by getBacklink/getBacklink2 to the content endpoints. 2) Until patched, disable Publish mode entirely, or enable Publish.Auth.Enable and enforce publish-password protection on any document containing sensitive content, since the flaw is reachable by any RoleReader token and by anonymous users when publish auth is off. 3) Restrict network exposure of the publish port (6808 in the advisory's PoC) to trusted networks/VPN as defense in depth. 4) Detection: monitor kernel logs/reverse-proxy access logs for repeated getBacklinkDoc/getBackmentionDoc calls with varying refTreeID values from a single anonymous or reader session — this pattern indicates ID enumeration or targeted probing for forbidden documents. 5) Review whether any publish-forbidden document was accessed via these endpoints prior to patching, since the advisory notes this also functions as a reference-existence oracle even without full content leakage.
What systems are affected by CVE-2026-68586?
This vulnerability affects the following AI/ML architecture patterns: knowledge management / note-taking backends, publish/sharing web APIs.
What is the CVSS score for CVE-2026-68586?
CVE-2026-68586 has a CVSS v3.1 base score of 8.6 (HIGH). The EPSS exploitation probability is 0.41%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0036Data from Information RepositoriesCompliance Controls Affected
What are the technical details?
Original Advisory
**CVE:** This vulnerability corresponds to [CVE-2026-68586](https://nvd.nist.gov/vuln/detail/CVE-2026-68586). ### Summary The backlink API splits into list endpoints (which documents reference a block) and content endpoints (the rendered text of those referencing blocks). The list endpoints apply a publish-access filter, the content endpoints do not. As a result, `/api/ref/getBacklinkDoc` and `/api/ref/getBackmentionDoc` return the rendered DOM of blocks belonging to a publish-forbidden document to an anonymous reader, with no access check. Both content endpoints are gated by `CheckAuth` only, reachable by the publish `RoleReader` token and by the anonymous account when `Publish.Auth.Enable` is `false`. ### Details The asymmetry between the list and content sides is the tell that this is an oversight, not intended behavior: | Endpoint | Returns | Publish-access filter | Route | |---|---|---|---| | `getBacklink` | list (`*Path`) | `FilterPathsByPublishAccess` - present | `CheckAuth` | | `getBacklink2` | list (`*Path`) | `FilterPathsByPublishAccess` - present | `CheckAuth` | | `getBacklinkDoc` | rendered DOM | none | `CheckAuth` | | `getBackmentionDoc` | rendered DOM | none | `CheckAuth` | `model/backlink.go` contains no publish-access reference anywhere, and `Backlink.DOM` is the rendered HTML of the referencing blocks. `getBacklinkDoc(defID, refTreeID)` returns the rendered content of blocks in `refTreeID` - including a publish-forbidden, publish-disabled, or password-protected document with no access check. The filtered list siblings (`getBacklink`/`getBacklink2`) demonstrate that the publish boundary is meant to apply to this data; the content endpoints simply omit it. A reader is not limited to the filtered backlink list, they call `getBacklinkDoc` directly with any `refTreeID`. This also yields a reference-existence oracle: the response reveals whether the forbidden document `refTreeID` references the block `defID`. ### Proof of Concept Reproduced on a local instance (SiYuan running locally, publish mode enabled on port 6808, publish Basic Auth disabled). Setup: a publish-forbidden document `D` (`REFTREEID`) whose body contains the unique marker `SECRET_MARKER_77` and which references a block `DEFID` in a separate known document. **1. Mark the target document publish-forbidden (admin action, the boundary that should block reads):** ``` POST http://127.0.0.1:6806/api/filetree/setPublishAccess Authorization: Token <admin-token> {"id":"REFTREEID","visible":false,"password":"","disable":true} ``` **2. Baseline: the list endpoint correctly hides the forbidden doc from the reader (anonymous, port 6808):** ``` POST http://127.0.0.1:6808/api/ref/getBacklink2 {"id":"DEFID","k":"","mk":""} ``` The returned backlinks do not include the forbidden document `D`, the list side is filtered. **3. Disclosure: the content endpoint returns the forbidden doc's blocks anyway (anonymous, port 6808):** ``` POST http://127.0.0.1:6808/api/ref/getBacklinkDoc {"defID":"DEFID","refTreeID":"REFTREEID","keyword":""} ``` Returns HTTP 200; `data.backlinks[].dom` contains `SECRET_MARKER_77`, the rendered content of the publish-forbidden document, returned to an anonymous reader. `getBackmentionDoc` behaves identically for mention-type references. ### Impact An anonymous reader (publish mode with auth disabled) or any publish `RoleReader`, can read the rendered content of a publish-forbidden document's referencing blocks, defeating a boundary the administrator explicitly configured, and can determine whether a forbidden document references a given block (a reference-existence oracle). **Precondition (stated honestly):** the request requires `refTreeID` (the forbidden document's ID) and `defID` (a block it references). `defID` may be any published/known block, so if the forbidden document references any public content, `defID` is known and only `refTreeID` need be supplied. Block/document IDs for forbidden documents are also obtainable from other `CheckAuth`-only endpoints that lack the publish-access filter (reported separately). This endpoint alone does not enumerate arbitrary documents; it discloses content once an ID is known. Impact is confidentiality-only: content disclosure plus a reference-existence oracle, no modification. No admin role, CSRF token, or write permission is required. Encrypted notebooks are out of scope. ### Suggested fix Apply the same publish-access check the list siblings use. In `getBacklinkDoc`/`getBackmentionDoc`, filter each `Backlink` by its source document's box/path via `CheckPathAccessableByPublishIgnore` plus the publish-password cookie check consistent with `FilterPathsByPublishAccess` in `getBacklink`/`getBacklink2`. Any endpoint returning rendered block DOM should enforce the same publish boundary as the corresponding list endpoint.
Exploitation Scenario
An attacker identifies a SiYuan instance running in publish mode (a common self-hosted note-sharing setup) with publish authentication disabled or with a valid RoleReader token. Through reconnaissance of publicly visible published documents, they learn a block ID (defID) that is referenced elsewhere, and separately learn or guess the tree ID (refTreeID) of a document the administrator marked forbidden/password-protected — potentially harvested from other unfiltered CheckAuth-only endpoints noted in the advisory as reported separately. The attacker sends a single unauthenticated POST to /api/ref/getBacklinkDoc (or getBackmentionDoc) with {defID, refTreeID}; the response returns HTTP 200 with the rendered DOM of the forbidden document's referencing blocks in the clear, with no password or access check enforced despite the document being explicitly locked down. The attacker can repeat this against multiple refTreeID values to both exfiltrate content and map which forbidden documents reference which blocks (a reference-existence oracle), without ever touching the correctly-filtered list endpoints that would have hidden the forbidden document.
Weaknesses (CWE)
CWE-862 — Missing Authorization: The product does not perform an authorization check when an actor attempts to access a resource or perform an action.
- [Architecture and Design] Divide the product into anonymous, normal, privileged, and administrative areas. Reduce the attack surface by carefully mapping roles with data and functionality. Use role-based access control (RBAC) [REF-229] to enforce the roles at the appropriate boundaries. Note that this approach may not protect against horizontal authorization, i.e., it will not protect a user from attacking others with the same role.
- [Architecture and Design] Ensure that access control checks are performed related to the business logic. These checks may be different than the access control checks that are applied to more generic resources such as files, connections, processes, memory, and database records. For example, a database may restrict access for medical records to a specific database user, but each record might only be intended to be accessible to the patient and the patient's doctor [REF-7].
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:NReferences
Timeline
Related Vulnerabilities
CVE-2026-7281110.0SiYuan: SQL injection enables cross-notebook DB access
Same package: notebookCVE-2026-6908510.0SiYuan: SQL injection in searchDocs allows DB tampering
Same package: notebookCVE-2026-6908410.0SiYuan: SQL injection in search endpoint exposes notebooks
Same package: notebookCVE-2026-6908310.0SiYuan: unauthenticated SQLi in full-text search endpoint
Same package: notebookCVE-2026-11105710.0Mercury: regex blocklist bypass allows unauthenticated RCE
Same package: notebook