SiYuan's anonymous publish-mode endpoint `/api/filetree/authFilePublishAccess` gives different responses (a Set-Cookie header and message text) depending on whether a document ID is public, password-protected, hidden or forbidden. An unauthenticated caller who has an ID can therefore confirm that a document exists at a tier meant to be concealed, and on the development branch can also confirm whether an ID belongs to an encrypted notebook. No document content is disclosed and no privilege is gained. Exploitation risk is low: EPSS is 0.34% (73rd percentile), there is no public exploit or Nuclei template, and the CVE is not in CISA KEV. The package has about 3,043 downstream dependents, so the exposure is mainly for teams that publish SiYuan knowledge bases, including ones that hold AI or research notes. Update to a build at or after kernel version 0.0.0-20260731093152-c7522b8db586 (v3.7.4-alpha.4 or later) and confirm that no sensitive notebooks are reachable through publish mode.
What is the risk?
Medium (CVSS 5.8), confidentiality only. The attack needs no authentication, no user interaction and low complexity, but yields only a confirmation primitive: the caller must already hold a candidate document ID, and IDs appear in published page DOM, backlinks and reference payloads. The CVSS scope-changed rating is higher than the practical impact. EPSS is low (0.00343), there is no public exploit and no KEV listing. Risk is higher for publicly exposed publish-mode instances that hold sensitive or encrypted notebooks. Confirming that an encrypted notebook ID exists is the same data class as GHSA-f2rw-w22v-54vh.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Jupyter Notebook | go | < 0.0.0-20260731093152-c7522b8db586 | 0.0.0-20260731093152-c7522b8db586 |
Do you use Jupyter Notebook? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step1) Upgrade the SiYuan kernel to 0.0.0-20260731093152-c7522b8db586 or later (v3.7.4-alpha.4 or later). 2) Until patched, disable publish mode or restrict it to trusted networks, a VPN or an authenticating reverse proxy. 3) Block or rate-limit anonymous POST requests to /api/filetree/authFilePublishAccess at the WAF or reverse proxy. 4) Detect enumeration by alerting on high-volume or repeated requests to this endpoint from one source, especially with an empty password field and varying id values. 5) Review which notebooks and documents sit at the hidden or forbidden tier and whether their IDs have leaked through published pages, backlinks or references. 6) Move highly sensitive notes out of instances exposed in publish mode.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-73630?
SiYuan's anonymous publish-mode endpoint `/api/filetree/authFilePublishAccess` gives different responses (a Set-Cookie header and message text) depending on whether a document ID is public, password-protected, hidden or forbidden. An unauthenticated caller who has an ID can therefore confirm that a document exists at a tier meant to be concealed, and on the development branch can also confirm whether an ID belongs to an encrypted notebook. No document content is disclosed and no privilege is gained. Exploitation risk is low: EPSS is 0.34% (73rd percentile), there is no public exploit or Nuclei template, and the CVE is not in CISA KEV. The package has about 3,043 downstream dependents, so the exposure is mainly for teams that publish SiYuan knowledge bases, including ones that hold AI or research notes. Update to a build at or after kernel version 0.0.0-20260731093152-c7522b8db586 (v3.7.4-alpha.4 or later) and confirm that no sensitive notebooks are reachable through publish mode.
Is CVE-2026-73630 actively exploited?
No confirmed active exploitation of CVE-2026-73630 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-73630?
1) Upgrade the SiYuan kernel to 0.0.0-20260731093152-c7522b8db586 or later (v3.7.4-alpha.4 or later). 2) Until patched, disable publish mode or restrict it to trusted networks, a VPN or an authenticating reverse proxy. 3) Block or rate-limit anonymous POST requests to /api/filetree/authFilePublishAccess at the WAF or reverse proxy. 4) Detect enumeration by alerting on high-volume or repeated requests to this endpoint from one source, especially with an empty password field and varying id values. 5) Review which notebooks and documents sit at the hidden or forbidden tier and whether their IDs have leaked through published pages, backlinks or references. 6) Move highly sensitive notes out of instances exposed in publish mode.
What systems are affected by CVE-2026-73630?
This vulnerability affects the following AI/ML architecture patterns: Knowledge base / note-taking platforms, Self-hosted publish-mode web services, RAG source corpora.
What is the CVSS score for CVE-2026-73630?
CVE-2026-73630 has a CVSS v3.1 base score of 5.8 (MEDIUM). The EPSS exploitation probability is 0.34%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0006Active ScanningAML.T0049Exploit Public-Facing ApplicationCompliance Controls Affected
What are the technical details?
Original Advisory
### Summary `/api/filetree/authFilePublishAccess` is registered with `CheckAuth` only and is reachable anonymously. It never sets a failure code, so its outcome is signalled entirely by the response message and by whether a `Set-Cookie` header is present. Those two signals differ across access tiers, which lets an anonymous caller determine, for any candidate document identifier, whether that document is public or nonexistent, password-protected, or exists at the hidden or forbidden tier. Separately, hidden and forbidden entries carry an empty password. Submitting `password:""` therefore satisfies the equality check for them, and the server responds by issuing `Set-Cookie: publish-auth-<docID>` for a document whose own tier is forbidden. ### Details **Route,** identical on both refs: ```go ginServer.Handle("POST", "/api/filetree/authFilePublishAccess", model.CheckAuth, authFilePublishAccess) ``` No `CheckAdminRole`, no `CheckReadonly`. **Handler,** `kernel/api/filetree.go:1608` on the development branch and `:1421` on master. `ret.Code` is never assigned on the failure path, so every response carries `code:0`. The branch is: ```go if item.Password == password { // SetPublishAuthCookie } else { ret.Msg = Conf.Language(285) } ``` **The cookie is issued for forbidden documents.** Entries at the hidden and forbidden tiers store `Password == ""`. A request with `password:""` therefore makes `item.Password == password` true for them, and the handler takes the success branch. The server issues a publish-auth cookie for a document it otherwise treats as inaccessible. The cookie itself confers nothing, because those tiers are decided before any password check elsewhere in the codebase. The defect is that the endpoint's success signal does not correspond to access being granted, and that signal is observable. **Three distinguishable outcomes.** With `password:""`, one request per candidate identifier: | Tier of the target | `Set-Cookie` | Body | |---|---|---| | Public (no publish-access entry) | absent | `{"code":0,"msg":""}` | | Nonexistent identifier | absent | `{"code":0,"msg":""}` | | Password-protected | absent | `{"code":0,"msg":"Password is incorrect"}` | | Hidden | **present** | `{"code":0,"msg":""}` | | Forbidden | **present** | `{"code":0,"msg":""}` | Public and nonexistent are indistinguishable from each other, which is correct. Everything else separates. A caller learns whether a given identifier names a password-protected document, or a document that exists at the hidden or forbidden tier, which is precisely the class the publish tiers exist to conceal. **Identifiers are readily available.** Document and block identifiers appear in the DOM of published pages, in reference and backlink payloads, and in annotation reference data. The caller does not need to guess them. **A fourth response on the development branch.** `IsEncryptedPublishRuntimeTarget` sets `ret.Code = -1`, which identifies the supplied identifier as belonging to an encrypted notebook. That is a membership oracle for encrypted notebooks, the same data class as `GHSA-f2rw-w22v-54vh`. ### Proof of Concept Publish mode enabled, `Publish.Auth.Enable` false, anonymous client. One request per candidate identifier, all with an empty password: ``` POST /api/filetree/authFilePublishAccess {"id":"<candidate document id>","password":""} ``` Comparing the response message and the presence of `Set-Cookie` against the table above classifies the identifier. Documents at the hidden and forbidden tiers return a publish-auth cookie and an empty message, distinguishing them both from public documents and from identifiers that name nothing at all. ### Impact An anonymous reader in publish mode, or any publish `RoleReader`, can classify arbitrary document identifiers by access tier and confirm the existence of documents at the hidden and forbidden tiers. On the development branch the same endpoint additionally reveals whether an identifier belongs to an encrypted notebook. Scoped precisely: no document content is disclosed and no privilege is gained, since the issued cookie is inert for these tiers. The value is as a confirmation primitive, turning an identifier obtained elsewhere into a definite statement about a document the reader is not permitted to see. Confidentiality only, with no integrity or availability impact. ### Suggested fix Return an identical response for every failure and for every tier the caller may not access, with no `Set-Cookie` header and no distinguishing message. In particular, do not treat an empty stored password as a successful match: hidden and forbidden entries should short-circuit before the password comparison rather than satisfying it. The encrypted-notebook branch should return the same generic response as everything else rather than its own code. A rate limit on this endpoint would be a reasonable additional hardening measure, though it does not address the disclosure above.
Exploitation Scenario
An attacker browses a publicly published SiYuan site and collects document and block IDs from the page DOM, backlinks and reference payloads. They send an anonymous POST to /api/filetree/authFilePublishAccess with each ID and password set to an empty string. IDs that return a publish-auth Set-Cookie with an empty message are classified as hidden or forbidden documents, and IDs that return 'Password is incorrect' are classified as password-protected. On the development branch a code of -1 additionally marks IDs that belong to encrypted notebooks. The attacker uses this map to target phishing, social engineering or further attacks at the owner of the concealed material, or to confirm that leaked IDs from other sources are real.
Weaknesses (CWE)
CWE-203 — Observable Discrepancy: The product behaves differently or sends different responses under different circumstances in a way that is observable to an unauthorized actor.
- [Architecture and Design] Compartmentalize the system to have "safe" areas where trust boundaries can be unambiguously drawn. Do not allow sensitive data to go outside of the trust boundary and always be careful when interfacing with a compartment outside of the safe area. Ensure that appropriate compartmentalization is built into the system design, and the compartmentalization allows for and reinforces privilege separation functionality. Architects and designers should rely on the principle of least privilege to decide the appropriate time to use privileges and the time to drop privileges.
- [Implementation] Ensure that error messages only contain minimal details that are useful to the intended audience and no one else. The messages need to strike the balance between being too cryptic (which can confuse users) or being too detailed (which may reveal more than intended). The messages should not reveal the methods that were used to determine the error. Attackers can use detailed information to refine or optimize their original attack, thereby increasing their chances of success. If errors must be captured in some detail, record them in log messages, but consider what could occur if the log messages can be viewed by attackers. Highly sensitive information such as passwords should never be saved to log files. Avoid inconsistent messaging that might accidentally tip off an attacker about internal state, such as whether a user account exists or not.
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-4pjg-x8qj-33j5
- github.com/siyuan-note/siyuan/commit/c7522b8db586ef1e1d6fa98bbe7ca0eb9d019efe
- github.com/siyuan-note/siyuan/releases/tag/v3.7.4-alpha.4
- github.com/siyuan-note/siyuan/security/advisories/GHSA-4pjg-x8qj-33j5
- nvd.nist.gov/vuln/detail/CVE-2026-73630
- vulncheck.com/advisories/siyuan-before-information-disclosure-via-authfilepublishaccess
Timeline
Related Vulnerabilities
CVE-2026-7281110.0SiYuan: SQL injection enables cross-notebook DB access
Same package: notebookCVE-2026-6908310.0SiYuan: unauthenticated SQLi in full-text search endpoint
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-11105710.0Mercury: regex blocklist bypass allows unauthenticated RCE
Same package: notebook