CVE-2026-72788
SiYuan before v3.7.4 Information Disclosure via UILayout Filter
SiYuan versions before v3.7.4 contain an information disclosure vulnerability in the UILayout filter that fails to properly restrict administrator workspace state from publish readers. Unauthenticated attackers can retrieve the administrator's open documents, search terms, notebook paths, and private asset locations by calling the getConf endpoint without authentication.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.9
SiYuan before v3.7.4 Information Disclosure via UILayout Filter
SiYuan versions before v3.7.4 contain an information disclosure vulnerability in the UILayout filter that fails to properly restrict administrator workspace state from publish readers. Unauthenticated attackers can retrieve the administrator's open documents, search terms, notebook paths, and private asset locations by calling the getConf endpoint without authentication.
- Record
CVE-2026-72788- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N - CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
EUVDEUVD-2026-57448
6.9
SiYuan versions before v3.7.4 contain an information disclosure vulnerability in the UILayout filter that fails to properly restrict administrator workspace state from publish readers. Unauthenticated attackers can retrieve the administrator's open documents, search terms, notebook paths, and private asset locations by calling the getConf endpoint without authentication.
- Record
EUVD-2026-57448- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-hgfg-j9pg-43xw
5.8
SiYuan discloses an administrator's open documents and search terms to anonymous readers
Summary
/api/system/getConf serves Conf.UILayout to publish readers after passing it through FilterConfByPublishIgnore, whose only function is to filter that layout. The layout is written exclusively by setUILayout, which is administrator-gated, so what readers receive is the administrator's own live workspace state, re-saved on every tab open, close and focus change.
The filter that is supposed to protect it, filterLayoutItemByPublishIgnore, has four separate defects. Together they mean a single unauthenticated POST with no arguments returns the titles and identifiers of the administrator's open password-protected documents, the titles of documents in locked or closed notebooks, their recent search terms and the paths those searches were scoped to, and the paths of private assets they have open.
This report concerns FilterConfByPublishIgnore and its layout walker. It is distinct from the previously reported getConf issues, which concern configuration fields surviving HideConfSecret's blocklist. Restructuring the secret-masking path would not affect this, because UILayout is not a secret to be stripped. It is a field intended to be served and filtered.
Details
Route and writer asymmetry. kernel/api/router.go:70 registers POST /api/system/getConf with model.CheckAuth only, so it is reachable by the publish RoleReader token and anonymously when Publish.Auth.Enable is false. The corresponding writer, setUILayout at kernel/api/router.go:67, carries CheckAuth, CheckAdminRole and CheckReadonly. Only an administrator can write this state, and any reader can read it.
The filter exists and is intended to work. HideConfSecret never touches UILayout (zero matches on both refs). Instead the reader branch runs:
if model.IsReadOnlyRoleContext(c) {
publishIgnore := model.GetInvisiblePublishAccess(publishAccess)
maskedConf = model.FilterConfByPublishIgnore(publishIgnore, maskedConf)
}
FilterConfByPublishIgnore does exactly one thing, which is filter UILayout. The intent that readers must not see the administrator's private tabs is therefore already established in the code. The four defects below are failures of that filter, not an argument that it should exist.
filterLayoutItemByPublishIgnore is byte-identical at eef105683 and v3.7.4-alpha.1 and has not changed since 3facc37df (#16041).
Defect 1: the password tier is not checked. GetPathPasswordByPublishAccess and CheckPublishAuthCookie appear zero times in the walker. Of the five access levels defined in publishAccess.ts, only the protected level is {visible: true, password: ...}. A password-protected document therefore never matches the invisible list, and there is no password check to catch it afterwards. Its tab survives intact, carrying title (the document title), docIcon, notebookId, rootId and blockId.
To be precise about scope: the forbidden level sets visible: false, so forbidden documents are correctly filtered. The leak is specific to the password tier.
This is the same class of defect as the recently fixed tag-label filter, on a different function that the tag fix does not touch.
Defect 2: fail-open on an unresolvable document. The walker does:
bt := treenode.GetBlockTree(rootId)
if bt == nil {
return
}
and the tab is retained. Compare CheckBlockIdAccessableByPublishAccess, which fails closed on the same condition. A rootId is unresolvable when its notebook is a locked encrypted notebook or a closed notebook, which are precisely the notebooks a reader must not learn about. Their tab titles pass through.
This survives the recent change that appends encrypted boxes to the invisible and disable ignore lists, because that change only takes effect once bt resolves. The nil branch returns before any ignore list is consulted.
Defect 3: non-editor tabs are never inspected. The walker examines one key, children["rootId"].…
- Record
GHSA-hgfg-j9pg-43xw- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-hpmw-8pgp-x77j
6.9
Duplicate Advisory: SiYuan discloses an administrator's open documents and search terms to anonymous readers
Duplicate Advisory
This advisory has been withdrawn because it is a duplicate of GHSA-hgfg-j9pg-43xw. This link is maintained to preserve external references.
Original Description
SiYuan versions before v3.7.4 contain an information disclosure vulnerability in the UILayout filter that fails to properly restrict administrator workspace state from publish readers. Unauthenticated attackers can retrieve the administrator's open documents, search terms, notebook paths, and private asset locations by calling the getConf endpoint without authentication.
- Record
GHSA-hpmw-8pgp-x77j- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
NVD
6.9
SiYuan versions before v3.7.4 contain an information disclosure vulnerability in the UILayout filter that fails to properly restrict administrator workspace state from publish readers. Unauthenticated attackers can retrieve the administrator's open documents, search terms, notebook paths, and private asset locations by calling the getConf endpoint without authentication.
- Record
CVE-2026-72788- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
OSVGHSA-hgfg-j9pg-43xw
5.8
SiYuan discloses an administrator's open documents and search terms to anonymous readers
Summary
/api/system/getConf serves Conf.UILayout to publish readers after passing it through FilterConfByPublishIgnore, whose only function is to filter that layout. The layout is written exclusively by setUILayout, which is administrator-gated, so what readers receive is the administrator's own live workspace state, re-saved on every tab open, close and focus change.
The filter that is supposed to protect it, filterLayoutItemByPublishIgnore, has four separate defects. Together they mean a single unauthenticated POST with no arguments returns the titles and identifiers of the administrator's open password-protected documents, the titles of documents in locked or closed notebooks, their recent search terms and the paths those searches were scoped to, and the paths of private assets they have open.
This report concerns FilterConfByPublishIgnore and its layout walker. It is distinct from the previously reported getConf issues, which concern configuration fields surviving HideConfSecret's blocklist. Restructuring the secret-masking path would not affect this, because UILayout is not a secret to be stripped. It is a field intended to be served and filtered.
Details
Route and writer asymmetry. kernel/api/router.go:70 registers POST /api/system/getConf with model.CheckAuth only, so it is reachable by the publish RoleReader token and anonymously when Publish.Auth.Enable is false. The corresponding writer, setUILayout at kernel/api/router.go:67, carries CheckAuth, CheckAdminRole and CheckReadonly. Only an administrator can write this state, and any reader can read it.
The filter exists and is intended to work. HideConfSecret never touches UILayout (zero matches on both refs). Instead the reader branch runs:
if model.IsReadOnlyRoleContext(c) {
publishIgnore := model.GetInvisiblePublishAccess(publishAccess)
maskedConf = model.FilterConfByPublishIgnore(publishIgnore, maskedConf)
}
FilterConfByPublishIgnore does exactly one thing, which is filter UILayout. The intent that readers must not see the administrator's private tabs is therefore already established in the code. The four defects below are failures of that filter, not an argument that it should exist.
filterLayoutItemByPublishIgnore is byte-identical at eef105683 and v3.7.4-alpha.1 and has not changed since 3facc37df (#16041).
Defect 1: the password tier is not checked. GetPathPasswordByPublishAccess and CheckPublishAuthCookie appear zero times in the walker. Of the five access levels defined in publishAccess.ts, only the protected level is {visible: true, password: ...}. A password-protected document therefore never matches the invisible list, and there is no password check to catch it afterwards. Its tab survives intact, carrying title (the document title), docIcon, notebookId, rootId and blockId.
To be precise about scope: the forbidden level sets visible: false, so forbidden documents are correctly filtered. The leak is specific to the password tier.
This is the same class of defect as the recently fixed tag-label filter, on a different function that the tag fix does not touch.
Defect 2: fail-open on an unresolvable document. The walker does:
bt := treenode.GetBlockTree(rootId)
if bt == nil {
return
}
and the tab is retained. Compare CheckBlockIdAccessableByPublishAccess, which fails closed on the same condition. A rootId is unresolvable when its notebook is a locked encrypted notebook or a closed notebook, which are precisely the notebooks a reader must not learn about. Their tab titles pass through.
This survives the recent change that appends encrypted boxes to the invisible and disable ignore lists, because that change only takes effect once bt resolves. The nil branch returns before any ignore list is consulted.
Defect 3: non-editor tabs are never inspected. The walker examines one key, children["rootId"].…
- Record
GHSA-hgfg-j9pg-43xw- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
OSVGHSA-hpmw-8pgp-x77j
6.9
Duplicate Advisory: SiYuan discloses an administrator's open documents and search terms to anonymous readers
Duplicate Advisory
This advisory has been withdrawn because it is a duplicate of GHSA-hgfg-j9pg-43xw. This link is maintained to preserve external references.
Original Description
SiYuan versions before v3.7.4 contain an information disclosure vulnerability in the UILayout filter that fails to properly restrict administrator workspace state from publish readers. Unauthenticated attackers can retrieve the administrator's open documents, search terms, notebook paths, and private asset locations by calling the getConf endpoint without authentication.
- Record
GHSA-hpmw-8pgp-x77j- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
OSVGO-2026-6622 No score
SiYuan discloses an administrator's open documents and search terms to anonymous readers in github.com/siyuan-note/siyuan/kernel
SiYuan discloses an administrator's open documents and search terms to anonymous readers in github.com/siyuan-note/siyuan/kernel
- Record
GO-2026-6622- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
github.com/siyuan-note/siyuan/kernelGo |
before 0.0.0-20260812083335-251596fc0de2 | 0.0.0-20260812083335-251596fc0de2 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-72788 is a medium vulnerability (CVSS 6.9) in Siyuan-note Siyuan, published August 12, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.38%, the 31st percentile. Fixed in github.com/siyuan-note/siyuan/kernel 0.0.0-20260812083335-251596fc0de2.
References
github.com/siyuan-note/siyuan/security/advisories/GHSA-hgfg-j9pg-43xw
vulncheck.com/advisories/siyuan-before-information-disclosure-via-uilayout-filter
nvd.nist.gov/vuln/detail/CVE-2026-72788
github.com/siyuan-note/siyuan/releases/tag/v3.8.0
github.com/advisories/GHSA-hgfg-j9pg-43xw
github.com/advisories/GHSA-hpmw-8pgp-x77j
github.com/siyuan-note/siyuan
Left out here: the rest of 2 source descriptions. The JSON record has them.