SiYuan: The publish filter for database backlinks consults the forbidden list instead of the visibility list, disclosing hidden-tier documents to anonymous readers
### Summary `/api/av/getAttributeViewBacklinks` filters its results for reader roles through `FilterAttributeViewBacklinksByPublishAccess`. That function resolves its ignore list with `GetDisablePublishAccess`, which covers only the forbidden tier. Documents at the hidden tier are absent from that list, so they pass the check. The result is that an anonymous reader supplying a publicly visible database row receives the database name, row title and document path of rows in hidden documents that reference it. The rest of the function is correct. It takes `*gin.Context` and calls `GetPathPasswordByPublishAccess` and `CheckPublishAuthCookie` at all four decision points, so the password-protected and private tiers are properly enforced. The defect is the choice of list, on one line. ### Details **Route,** `kernel/api/router.go:545` on the development branch and `:527` on master: ```go ginServer.Handle("POST", "/api/av/getAttributeViewBacklinks", model.CheckAuth, getAttributeViewBacklinks) ``` `CheckAuth` only. No `CheckAdminRole`, no `CheckReadonly`. **The defect.** In `FilterAttributeViewBacklinksByPublishAccess` (`kernel/model/publish_access.go:1060` on dev, `:435` on master): ```go publishIgnore := GetDisablePublishAccess(publishAccess) ``` `GetDisablePublishAccess` returns only entries at the forbidden tier. A hidden document has `visible:false`, `password:""`, `disable:false`, so it does not appear in that list. `CheckPathAccessableByPublishIgnore` therefore returns true for
- Products
- github.com/siyuan-note/siyuan/kernel
- Affected versions
- Not specified
- Fixed versions
- 0.0.0-20260730150429-5b42614311b0
- CVEs
- CVE-2026-73049
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 1 Nov 2026, 02:32 UTC · Revision 1
Source evidence
SiYuan: The publish filter for database backlinks consults the forbidden list instead of the visibility list, disclosing hidden-tier documents to anonymous readers
core-osv · Original sourcePublished 23 Oct 2026, 18:30 UTC
### Summary `/api/av/getAttributeViewBacklinks` filters its results for reader roles through `FilterAttributeViewBacklinksByPublishAccess`. That function resolves its ignore list with `GetDisablePublishAccess`, which covers only the forbidden tier. Documents at the hidden tier are absent from that list, so they pass the check. The result is that an anonymous reader supplying a publicly visible database row receives the database name, row title and document path of rows in hidden documents that reference it. The rest of the function is correct. It takes `*gin.Context` and calls `GetPathPasswordByPublishAccess` and `CheckPublishAuthCookie` at all four decision points, so the password-protected and private tiers are properly enforced. The defect is the choice of list, on one line. ### Details **Route,** `kernel/api/router.go:545` on the development branch and `:527` on master: ```go ginServer.Handle("POST", "/api/av/getAttributeViewBacklinks", model.CheckAuth, getAttributeViewBacklinks) ``` `CheckAuth` only. No `CheckAdminRole`, no `CheckReadonly`. **The defect.** In `FilterAttributeViewBacklinksByPublishAccess` (`kernel/model/publish_access.go:1060` on dev, `:435` on master): ```go publishIgnore := GetDisablePublishAccess(publishAccess) ``` `GetDisablePublishAccess` returns only entries at the forbidden tier. A hidden document has `visible:false`, `password:""`, `disable:false`, so it does not appear in that list. `CheckPathAccessableByPublishIgnore` therefore returns true for
osv:GHSA-p4qw-vx5p-g984
github.com/siyuan-note/siyuan/kernel
Fixed versions: 0.0.0-20260730150429-5b42614311b0
Complete source record
{
"id": "9754170b358418ee5ef5749462d1fe2389f948018ebbbb1bb2d6526fab6239ae",
"url": "https://osv.dev/vulnerability/GHSA-p4qw-vx5p-g984",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "SiYuan: The publish filter for database backlinks consults the forbidden list instead of the visibility list, disclosing hidden-tier documents to anonymous readers",
"summary": "### Summary `/api/av/getAttributeViewBacklinks` filters its results for reader roles through `FilterAttributeViewBacklinksByPublishAccess`. That function resolves its ignore list with `GetDisablePublishAccess`, which covers only the forbidden tier. Documents at the hidden tier are absent from that list, so they pass the check. The result is that an anonymous reader supplying a publicly visible database row receives the database name, row title and document path of rows in hidden documents that reference it. The rest of the function is correct. It takes `*gin.Context` and calls `GetPathPasswordByPublishAccess` and `CheckPublishAuthCookie` at all four decision points, so the password-protected and private tiers are properly enforced. The defect is the choice of list, on one line. ### Details **Route,** `kernel/api/router.go:545` on the development branch and `:527` on master: ```go ginServer.Handle(\"POST\", \"/api/av/getAttributeViewBacklinks\", model.CheckAuth, getAttributeViewBacklinks) ``` `CheckAuth` only. No `CheckAdminRole`, no `CheckReadonly`. **The defect.** In `FilterAttributeViewBacklinksByPublishAccess` (`kernel/model/publish_access.go:1060` on dev, `:435` on master): ```go publishIgnore := GetDisablePublishAccess(publishAccess) ``` `GetDisablePublishAccess` returns only entries at the forbidden tier. A hidden document has `visible:false`, `password:\"\"`, `disable:false`, so it does not appear in that list. `CheckPathAccessableByPublishIgnore` therefore returns true for ",
"evidence": "osv:GHSA-p4qw-vx5p-g984",
"products": [
{
"name": {
"value": "github.com/siyuan-note/siyuan/kernel",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "0.0.0-20260730150429-5b42614311b0",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
}
],
"severity": "medium",
"structured": {
"id": "GHSA-p4qw-vx5p-g984",
"aliases": [
"CVE-2026-73049",
"GHSA-p4qw-vx5p-g984"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N"
}
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "0"
},
{
"fixed": "0.0.0-20260730150429-5b42614311b0"
}
]
}
],
"package": {
"name": "github.com/siyuan-note/siyuan/kernel",
"purl": "pkg:golang/github.com/siyuan-note/siyuan/kernel",
"ecosystem": "Go"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-p4qw-vx5p-g984/GHSA-p4qw-vx5p-g984.json"
}
}
],
"modified": "2026-10-23T18:45:08.573625414Z",
"provider": "osv",
"references": [
"https://github.com/siyuan-note/siyuan/security/advisories/GHSA-p4qw-vx5p-g984",
"https://nvd.nist.gov/vuln/detail/CVE-2026-73049",
"https://github.com/siyuan-note/siyuan/commit/5b42614311b0afda29ccc65e55d74bf3e8cc9054",
"https://github.com/siyuan-note/siyuan",
"https://github.com/siyuan-note/siyuan/releases/tag/v3.7.4-alpha.4",
"https://www.vulncheck.com/advisories/siyuan-before-information-disclosure-via-getattributeviewbacklinks"
],
"provider_metadata": {
"cwe_ids": [
"CWE-863"
],
"severity": "MODERATE",
"github_reviewed": true,
"nvd_published_at": null,
"github_reviewed_at": "2026-10-23T18:30:42Z"
}
},
"related_cves": [
{
"value": "CVE-2026-73049",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 424598,
"published_at": "2026-10-23T18:30:42+00:00"
}