CVE-2026-73606: SiYuan The Reference Filter For GetRefIDs Vulnerability
MODERATECVE-2026-73606 is a MODERATE (CVSS 5.8) the reference filter for getrefids vulnerability (CWE-863: Incorrect Authorization) affecting SiYuan libraries in the Go ecosystem. The issue involves the reference filter for getrefids checks visibility but not the password tier, disclosing that password-protected documents reference a given block. Remediation is available by upgrading affected packages to version 0.0.0-20260812083335-251596fc0de2.
CVE-2026-73606 at a Glance
Security Impact
CVSS: 5.8
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N).
How to Fix CVE-2026-73606
To remediate this vulnerability, upgrade all affected SiYuan dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade github.com/siyuan-note/siyuan/kernel to 0.0.0-20260812083335-251596fc0de2
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for github.com/siyuan-note/siyuan/kernel
How to Check if You Are Affected
To determine whether your application is affected by CVE-2026-73606, inspect your project dependencies for SiYuan:
inspect dependencies for github.com/siyuan-note/siyuan/kernel
Analyze the terminal output to locate any version of SiYuan in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 0.0.0-20260812083335-251596fc0de2), your application is affected.
Note: Verify declared build manifests and deployed runtime container environments.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-863: Incorrect Authorization, where the product performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly perform the check. In SiYuan, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-73606 Affected SiYuan Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
github.com/siyuan-note/siyuan/kernel
|
Go |
< 0.0.0-20260812083335-251596fc0de2
|
0.0.0-20260812083335-251596fc0de2
|
References
Frequently Asked Questions
What is CVE-2026-73606?
Which SiYuan versions are affected?
What version fixes CVE-2026-73606?
Is github.com/siyuan-note/siyuan/kernel affected?
What is the CVSS score of CVE-2026-73606?
What CWE is associated with CVE-2026-73606?
How can I check Go dependencies for CVE-2026-73606?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-vg99-7gj7-2fr5",
"modified" : "2026-10-01T16:29:35Z",
"published" : "2026-10-01T16:29:35Z",
"aliases" : [ "CVE-2026-73606" ],
"summary" : "SiYuan: The reference filter for getRefIDs checks visibility but not the password tier, disclosing that password-protected documents reference a given block",
"details" : "### Summary\n\n`/api/block/getRefIDs` filters its results for reader roles through a helper that checks only the visibility tiers. The password tier is not checked, because the helper does not receive the request context and therefore cannot evaluate the publish auth cookie. A reader who has not entered a document's publish password learns that the document references a given block.\n\nA function ten lines away in the same file does perform the full check, on the same input type.\n\n### Details\n\n**Route,** identical at `eef105683` (`kernel/api/router.go:235`) and dev `a7ae96ce` (`:245`):\n\n```go\nginServer.Handle(\"POST\", \"/api/block/getRefIDs\", model.CheckAuth, getRefIDs)\n```\n\nNo `CheckReadonly`, no `CheckAdminRole`.\n\n**The filter chain.** `getRefIDs` (`kernel/api/block.go:631`) checks `isEncryptedNotebookDeniedForPublish`, calls `model.GetBlockRefsInBox`, then for read-only roles:\n\n```go\npublishIgnore := model.GetInvisiblePublishAccess(publishAccess)\nrefDefs, originalRefBlockIDs = model.FilterRefDefsByPublishIgnore(publishIgnore, refDefs)\n```\n\n`FilterRefDefsByPublishIgnore` (`kernel/model/publish_access.go:1324`) collects the reference and definition identifiers, resolves their block trees, and delegates the decision to `FilterBlockTreesByPublishIgnore` (`:1314`), whose entire body is:\n\n```go\nfor id, bt := range bts {\n if CheckPathAccessableByPublishIgnore(bt.BoxID, bt.Path, publishIgnore) {\n ret[id] = bt\n }\n}\n```\n\nInside that helper, `CheckPublishAuthCookie`, `GetPathPasswordByPublishAccess`, `checkBlockTreeAccessableByPublishAccess` and `password` all appear zero times.\n\n**The complete check exists in the same file.** `kernel/model/publish_access.go:431`:\n\n```go\nfunc checkBlockTreeAccessableByPublishAccess(c *gin.Context, publishAccess PublishAccess, bt *treenode.BlockTree) bool {\n if bt == nil || IsEncryptedBoxDeniedByPublishAccess(bt.BoxID) {\n return false\n }\n publishIgnore := filterDisablePublishAccess(publishAccess)\n passwordID, password := GetPathPasswordByPublishAccess(bt.BoxID, bt.Path, publishAccess)\n return CheckPathAccessableByPublishIgnore(bt.BoxID, bt.Path, publishIgnore) &&\n (password == \"\" || CheckPublishAuthCookie(c, passwordID, password))\n}\n```\n\nSame package, same file, same `*treenode.BlockTree` input. One takes the context and evaluates the password; the other does not receive it and structurally cannot.\n\n**Route-level contrast.** The adjacent `getChildBlocks` and `getTailChildBlocks` both carry `model.CheckAdminRole`.\n\n**Note on a prior assessment.** `getRefIDs` has been described as correctly filtered because it calls a publish-access filter. It does. The filter it calls covers the visibility tiers only.\n\n### Proof of Concept\n\nKernel 3.7.2, publish mode on port 6808, `Publish.Auth.Enable` false, anonymous client. A public document referenced from a second document whose publish tier was changed between runs. `getRefIDs` was called anonymously each time.\n\n| Tier of the referring document | Anonymous result |\n|---|---|\n| Public | reference returned (baseline) |\n| Password-protected | **reference still returned** |\n| Hidden | `[]`, filtered |\n| Forbidden | `[]`, filtered |\n\nThe hidden and forbidden rows confirm the filter runs and works. The password-protected row is the defect.\n\n### Impact\n\nAn anonymous reader in publish mode, or any publish `RoleReader`, learns that a password-protected document contains a reference to a given block, without entering that document's password, and receives the block identifiers involved.\n\nScoped precisely: the response carries identifiers only. `type RefDefs { RefID string; DefIDs []string }`, returned alongside `originalRefBlockIDs`, a map of identifier to identifier. There is no reference text, title or content. The disclosure is the existence of a relationship, plus identifiers usable as input to other endpoints.\n\nConfidentiality only.\n\n### Suggested fix\n\nThread `*gin.Context` into `FilterRefDefsByPublishIgnore` and `FilterBlockTreesByPublishIgnore`, and use `checkBlockTreeAccessableByPublishAccess` in place of the bare `CheckPathAccessableByPublishIgnore` call, so the password tier and the encrypted-box check are both applied.",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "Go",
"name" : "github.com/siyuan-note/siyuan/kernel"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "0.0.0-20260812083335-251596fc0de2"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/siyuan-note/siyuan/security/advisories/GHSA-vg99-7gj7-2fr5"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-73606"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/siyuan-note/siyuan"
}, {
"type" : "WEB",
"url" : "https://github.com/siyuan-note/siyuan/releases/tag/v3.8.0"
}, {
"type" : "WEB",
"url" : "https://www.vulncheck.com/advisories/siyuan-before-information-disclosure-via-getrefids"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-863" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2026-10-01T16:29:35Z",
"nvd_published_at" : null
}
}