CVE-2026-72804: SiYuan Graph Endpoints Missing Publish-Password Check
SiYuan's graph API endpoints leak the full block-level content of password-protected documents to any anonymous or low-privilege publish reader, because the graph filter checks document visibility…

The problem
The getGraph and getLocalGraph handlers in SiYuan's publish mode filter graph nodes using only the visibility tier via FilterGraphByPublishIgnore. Password-protected documents are marked Visible = true, so their nodes pass the filter unchanged.
Each node carries real block content: genTreeNodes emits one node per block and nodeTitleLabel sets node.Title = node.Label = block.Content. An anonymous reader (when Publish.Auth.Enable is false) or any publish RoleReader account can therefore read every block's text and the full backlink topology of every protected document, without supplying a password.
Both routes are CheckAuth-only, so no admin role is required.
Proof of concept
A working proof-of-concept for CVE-2026-72804 in github.com/siyuan-note/siyuan/kernel, with the exact payload below.
# Workspace-wide: all password-protected documents, no password supplied
POST http://127.0.0.1:6808/api/graph/getGraph
Content-Type: application/json
{}
# Targeted: one protected document's block content and reference graph
POST http://127.0.0.1:6808/api/graph/getLocalGraph
Content-Type: application/json
{"id":"<PROTECTED_DOC_ID>"}The root cause is a missing authorization tier in FilterGraphByPublishIgnore (kernel/model/publish_access.go). It calls only CheckPathAccessableByPublishIgnore, which evaluates the visibility tier, and never calls CheckPublishAuthCookie or checks whether a document's publish password is set.
Sibling filters elsewhere in the codebase do evaluate both tiers, so the omission is inconsistent.
The patch at commit 82e9ded423e4 extends the graph filter to also evaluate the password tier, dropping a node unless the document's publish password is empty or the caller holds a valid publish-auth cookie for it. This matches the pattern already used by other publish-access filter functions (CWE-200, CWE-862).
The fix
Upgrade to SiYuan kernel pseudo-version 0.0.0-20260724091654-82e9ded423e4 or any tagged release that includes commit 82e9ded423e4. The fix extends FilterGraphByPublishIgnore to validate the publish-password tier in addition to the visibility tier, and both graph routes now correctly deny unauthenticated or passwordless readers access to protected document nodes.
Related research
- high · 8.6CVE-2026-72810CVE-2026-72810: SiYuan WebSocket Broadcast Publish-Boundary Bypass
- high · 8.6CVE-2026-68587CVE-2026-68587: SiYuan getHeading*Transaction Publish-Disabled Document Disclosure
- high · 8.6CVE-2026-68586CVE-2026-68586: SiYuan Missing Publish-Access Filter on Backlink Content Endpoints
- high · 7.5CVE-2026-72801CVE-2026-72801: SiYuan Encrypted Notebook Key Material Disclosed to Anonymous Readers