CVE-2026-72800: SiYuan: broken authz leaks DB schema & block IDs
GHSA-5fhr-f75j-8wr9MEDIUMPoC AVAILABLESiYuan's publish-mode API exposes three endpoints that skip the authorization filter its own sibling endpoint enforces, letting any publish reader — or an anonymous visitor if publish auth is disabled — pull the complete column schema of any database in the workspace, including field names, select-option vocabularies, template logic, and cross-database relation targets, even for databases whose host document is hidden or password-protected. Two companion endpoints turn any known reference text or block ID into further valid IDs workspace-wide, including inside unlocked encrypted notebooks, removing the 'you must already know the ID' precondition other read endpoints rely on. Impact is confidentiality-only (CVSS 5.8, no code execution or availability loss), EPSS is very low at 0.00237, and there is no public PoC, Nuclei template, or CISA KEV listing, so this is not being mass-exploited today. Even so, the trigger is trivial — the avID is exposed in plain HTML (`data-av-id`) on any published page embedding the database — and with 2,997 downstream dependents this warrants patching rather than deferring. Upgrade to commit `0.0.0-20260724103335-f36331956ae9` or later, and until then set `Publish.Auth.Enable=true` to remove anonymous publish access.
What is the risk?
Medium severity (CVSS 3.1 5.8, AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N): network-reachable, no privileges or user interaction required, but impact is limited to confidentiality (schema and ID disclosure, no data modification or service disruption). Exploitability is trivial for anyone who can view a single published page containing an embedded database, since the avID needed is exposed client-side. However, real-world exploitation likelihood is low — EPSS 0.00237, no public exploit code, no Nuclei template, not in CISA KEV or SSVC decision data — so this is an integrity-of-access-control gap rather than an actively weaponized flaw. Risk rises specifically for self-hosted SiYuan instances running publish mode (default port 6808), particularly where `Publish.Auth.Enable` is false or where sensitive databases (e.g., PII, credentials tracking, incident logs) are stored alongside intentionally published content.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Jupyter Notebook | go | < 0.0.0-20260724103335-f36331956ae9 | 0.0.0-20260724103335-f36331956ae9 |
Do you use Jupyter Notebook? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step1) Patch: upgrade SiYuan kernel to the fixed commit
0.0.0-20260724103335-f36331956ae9or later (merges commits 931ba69 and f36331956 per the GitHub Advisory GHSA-5fhr-f75j-8wr9). 2) Workaround until patched: setPublish.Auth.Enable=trueso publish mode requires an authenticated reader account rather than allowing anonymous access, and audit which databases/documents are exposed via publish mode — remove or password-protect any that should stay private. 3) Detection: monitor kernel API logs for repeated calls to/api/av/getAttributeViewKeysByID,/api/block/getBlockDefIDsByRefText, or/api/block/getBlockRelevantIDsfrom publish-reader or anonymous sessions, especially with varyingavID/anchorvalues suggesting enumeration. 4) Post-patch validation: confirmgetAttributeViewKeysByIDnow appliesFilterBlockAttributeViewKeysByPublishAccesslike its siblinggetAttributeViewKeys, and that the two block-ID endpoints scope results to publish-accessible blocks for reader sessions.
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-72800?
SiYuan's publish-mode API exposes three endpoints that skip the authorization filter its own sibling endpoint enforces, letting any publish reader — or an anonymous visitor if publish auth is disabled — pull the complete column schema of any database in the workspace, including field names, select-option vocabularies, template logic, and cross-database relation targets, even for databases whose host document is hidden or password-protected. Two companion endpoints turn any known reference text or block ID into further valid IDs workspace-wide, including inside unlocked encrypted notebooks, removing the 'you must already know the ID' precondition other read endpoints rely on. Impact is confidentiality-only (CVSS 5.8, no code execution or availability loss), EPSS is very low at 0.00237, and there is no public PoC, Nuclei template, or CISA KEV listing, so this is not being mass-exploited today. Even so, the trigger is trivial — the avID is exposed in plain HTML (`data-av-id`) on any published page embedding the database — and with 2,997 downstream dependents this warrants patching rather than deferring. Upgrade to commit `0.0.0-20260724103335-f36331956ae9` or later, and until then set `Publish.Auth.Enable=true` to remove anonymous publish access.
Is CVE-2026-72800 actively exploited?
Proof-of-concept exploit code is publicly available for CVE-2026-72800, increasing the risk of exploitation.
How to fix CVE-2026-72800?
1) Patch: upgrade SiYuan kernel to the fixed commit `0.0.0-20260724103335-f36331956ae9` or later (merges commits 931ba69 and f36331956 per the GitHub Advisory GHSA-5fhr-f75j-8wr9). 2) Workaround until patched: set `Publish.Auth.Enable=true` so publish mode requires an authenticated reader account rather than allowing anonymous access, and audit which databases/documents are exposed via publish mode — remove or password-protect any that should stay private. 3) Detection: monitor kernel API logs for repeated calls to `/api/av/getAttributeViewKeysByID`, `/api/block/getBlockDefIDsByRefText`, or `/api/block/getBlockRelevantIDs` from publish-reader or anonymous sessions, especially with varying `avID`/`anchor` values suggesting enumeration. 4) Post-patch validation: confirm `getAttributeViewKeysByID` now applies `FilterBlockAttributeViewKeysByPublishAccess` like its sibling `getAttributeViewKeys`, and that the two block-ID endpoints scope results to publish-accessible blocks for reader sessions.
What systems are affected by CVE-2026-72800?
This vulnerability affects the following AI/ML architecture patterns: Knowledge management / PKM systems used as data sources, Self-hosted note/database tools feeding manual or automated RAG pipelines, Multi-tenant publish/sharing platforms with mixed public-private content.
What is the CVSS score for CVE-2026-72800?
CVE-2026-72800 has a CVSS v3.1 base score of 5.8 (MEDIUM). The EPSS exploitation probability is 0.33%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0025Exfiltration via Cyber MeansAML.T0036Data from Information RepositoriesCompliance Controls Affected
What are the technical details?
Original Advisory
**CVE:** This vulnerability corresponds to [CVE-2026-72800](https://nvd.nist.gov/vuln/detail/CVE-2026-72800). ### Summary `POST /api/av/getAttributeViewKeysByID` returns a database's full column schema with no publish-access filtering, while its sibling `getAttributeViewKeys` applies the filter for reader sessions. Two further endpoints, `getBlockDefIDsByRefText` and `getBlockRelevantIDs` return workspace-wide block IDs with no publish scoping. All three are `CheckAuth`-only, so they are reachable by the publish `RoleReader` token and by the anonymous account when `Publish.Auth.Enable` is `false`. ### Details **(a) `getAttributeViewKeysByID`: ungated column-schema disclosure** The entire handler (`kernel/api/av.go`, router line 548): ```go ret.Data = model.GetAttributeViewKeysByID(avID, keyIDs...) // no publish gate ``` With an empty `keyIDs`, `GetAttributeViewKeysByID` calls `av.ParseAttributeView(avID)` and returns every column's `*av.Key`: | Field | Discloses | |---|---| | `Name`, `Desc` | column title and user-authored description | | `Options` | the full single/multi-select vocabulary and colours (e.g. status labels such as "Fired", "Confidential") | | `Template` | the column's Sprig template expression — logic and field references | | `Relation` | the target `avID`, allowing pivot to another database | | `Rollup`, `NumberFormat`, date config | further schema | **Guarded-sibling asymmetry, same file:** `getAttributeViewKeys` (router line 526) runs `FilterBlockAttributeViewKeysByPublishAccess(...)` when `IsReadOnlyRoleContext`. `getAttributeViewKeysByID` applies nothing. A reader who knows an `avID` — trivially harvested from the `data-av-id` attribute of any published document embedding a database obtains the schema of any database in the workspace, including those whose host documents are hidden, password-protected, or publish-forbidden. `Relation` targets allow walking to sibling databases. **(b) Two unscoped block-ID enumeration oracles** Both `CheckAuth`-only with no publish gate. Neither returns content of its own, but both yield valid block IDs that other endpoints turn into content: - `getBlockDefIDsByRefText` (router line 237) → `GetBlockDefIDsByRefText(anchor)` returns the block IDs, workspace-wide and including private documents, whose reference/anchor text equals a caller-supplied string: a ref-text → ID oracle. - `getBlockRelevantIDs` (router line 274) → `GetBlockRelevantIDsInBox(id, <notebook from request>)` returns parent/previous/next block IDs and traverses decrypted encrypted-notebook structure while the notebook is unlocked, a tree-walk oracle. Verified at `origin/master` (`eef105683`): all three handler bodies contain no publish-access, publish-ignore, or readonly-role check; all three routes are registered `CheckAuth` without `CheckAdminRole`. ### Proof of Concept Precondition: publish mode enabled (default port 6808); anonymous when `Publish.Auth.Enable` is `false`, otherwise any publish reader account. A database exists whose host document is publish-forbidden or password-protected. **(a) Column schema of any database:** ``` POST http://127.0.0.1:6808/api/av/getAttributeViewKeysByID {"avID":"<AV_ID>"} ``` Returns every column's key object names, descriptions, select vocabularies, template expressions, and `Relation` target `avID`s for a database whose host document the reader may not access. **Control:** the sibling `getAttributeViewKeys` with the same `avID` returns filtered results for the same reader session, confirming the boundary is enforced there and omitted here. **(b) ID oracles:** ``` POST http://127.0.0.1:6808/api/block/getBlockDefIDsByRefText {"anchor":"<known ref text>"} → block IDs workspace-wide, including blocks in private documents POST http://127.0.0.1:6808/api/block/getBlockRelevantIDs {"id":"<BLOCK_ID>","notebook":"<BOX_ID>"} → parent/previous/next block IDs; traverses encrypted-notebook structure when unlocked ``` ### Impact An anonymous reader (publish mode with auth disabled) or any publish `RoleReader` can read the complete column schema of any database in the workspace, including column descriptions, select-option vocabularies (which frequently encode sensitive category labels), template logic, and relation targets that permit pivoting to further databases regardless of whether the host document is hidden, password-protected, or excluded from publishing. The two enumeration endpoints additionally supply valid block IDs across the publish boundary, including from encrypted notebooks while unlocked. This removes the "attacker must already know a valid ID" precondition from other block-read endpoints, converting ID knowledge into content disclosure. Confidentiality-only. ### Note getAttributeViewKeysByID is a distinct handler from getAttributeView; although column definitions also appear within the latter's response payload, a fix applied to one handler does not remediate the other, and getAttributeViewKeysByID has its own filtered sibling (getAttributeViewKeys) demonstrating the intended treatment. ### Suggested fix - Gate `getAttributeViewKeysByID` with `FilterBlockAttributeViewKeysByPublishAccess`, mirroring `getAttributeViewKeys`. - Scope `getBlockDefIDsByRefText` and `getBlockRelevantIDs` to publish-accessible blocks for reader sessions, and ensure the `*InBox` traversal path applies the same check before walking encrypted-notebook structure.
Exploitation Scenario
An attacker browses a public SiYuan publish-mode site (or, if `Publish.Auth.Enable` is false, accesses it anonymously) and opens any published document that embeds a database view. From the page's HTML they extract the `data-av-id` attribute value for that database. They then send `POST /api/av/getAttributeViewKeysByID` with that avID and an empty `keyIDs` array, receiving the full column schema — including select-option vocabularies that may encode sensitive labels like 'Confidential' or 'Terminated' — for a database whose host document is actually hidden or password-protected. Noticing a `Relation` field pointing to another avID, the attacker repeats the call to pivot into a second, unrelated database's schema. Separately, they call `getBlockDefIDsByRefText` with common anchor text to harvest valid block IDs from private documents workspace-wide, then feed a returned ID into `getBlockRelevantIDs` to walk parent/sibling/child relationships — including inside an encrypted notebook that happens to be unlocked on the server — building a map of content structure that can be fed into other (already-authenticated) block-content endpoints to retrieve the actual private text.
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:L/I:N/A:NReferences
- github.com/advisories/GHSA-5fhr-f75j-8wr9
- github.com/siyuan-note/siyuan/commit/931ba693375ea9877b2ef74f9bfb632fad5bab3f
- github.com/siyuan-note/siyuan/commit/f36331956ae98fc5358f8f93bf1da3427221edf3
- github.com/siyuan-note/siyuan/security/advisories/GHSA-5fhr-f75j-8wr9
- vulncheck.com/advisories/siyuan-before-information-disclosure-via-unfiltered-api
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