{"id":"CVE-2026-72790","revision":null,"records":[{"revision":"32708eb87e4b4629954f5d576352dbda","observedAt":"2026-10-23T15:48:27.903+00:00","statement":{"source":"cve-program","id":"CVE-2026-72790","aliases":[],"title":"SiYuan before v3.7.4 Information Disclosure via getNotebookInfo","description":"SiYuan before v3.7.4 contains an information disclosure vulnerability in the /api/notebook/getNotebookInfo endpoint that returns notebook metadata without authorization checks. Attackers can read notebook names, document counts, sizes, and timestamps for closed or non-published notebooks that should be hidden from readers.","state":0,"publishedAt":"2026-08-12T19:07:38.949+00:00","modifiedAt":"2026-08-14T16:52:00.45+00:00","affected":[{"ecosystem":"Vendor product","name":"siyuan","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"siyuan-note\",\n                    \"product\": \"siyuan\",\n                    \"defaultStatus\": \"unaffected\",\n                    \"packageURL\": \"pkg:golang/github.com/siyuan-note/siyuan/kernel\",\n                    \"versions\": [\n                        {\n                            \"version\": \"0\",\n                            \"status\": \"affected\",\n                            \"versionType\": \"semver\",\n                            \"lessThan\": \"3.7.4\"\n                        },\n                        {\n                            \"version\": \"3.7.4\",\n                            \"status\": \"unaffected\",\n                            \"versionType\": \"semver\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 4.0","vector":"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","score":6.9,"severity":"MEDIUM"},{"system":"CVSS 3.1","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","score":5.8,"severity":"MEDIUM"}],"references":["https://github.com/siyuan-note/siyuan/security/advisories/GHSA-74pj-6g7r-j55c","https://www.vulncheck.com/advisories/siyuan-before-information-disclosure-via-getnotebookinfo"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-72790","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-72790","identifiers":["CVE-2026-72790"]},"retained":false,"historicalAffected":[]},{"revision":"0b3a24211f244fee88abe62621f5dc21","observedAt":"2026-10-25T15:19:03.401+00:00","statement":{"source":"nvd","id":"CVE-2026-72790","aliases":[],"title":"SiYuan before v3.7.4 contains an information disclosure vulnerability in the /api/notebook/getNotebookInfo endpoint that returns notebook metadata without authorization checks. Attackers can read notebook names, document counts, sizes, and …","description":"SiYuan before v3.7.4 contains an information disclosure vulnerability in the /api/notebook/getNotebookInfo endpoint that returns notebook metadata without authorization checks. Attackers can read notebook names, document counts, sizes, and timestamps for closed or non-published notebooks that should be hidden from readers.","state":0,"publishedAt":"2026-08-12T20:17:50.407+00:00","modifiedAt":"2026-10-24T15:10:00.19+00:00","affected":[],"metrics":[{"system":"CVSS 4.0 · disclosure@vulncheck.com · Secondary","vector":"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","score":6.9,"severity":"MEDIUM"},{"system":"CVSS 3.1 · disclosure@vulncheck.com · Primary","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","score":5.8,"severity":"MEDIUM"}],"references":["https://github.com/siyuan-note/siyuan/security/advisories/GHSA-74pj-6g7r-j55c","https://www.vulncheck.com/advisories/siyuan-before-information-disclosure-via-getnotebookinfo"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-72790","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Deferred","weaknesses":["CWE-862"],"productCriteria":[],"sourceDates":{"published":"2026-08-12T20:17:50.407","lastModified":"2026-10-24T15:10:00.190"},"relatedAdvisories":[],"note":"NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON."},"key":"nvd:CVE-2026-72790","identifiers":["CVE-2026-72790"]},"retained":false,"historicalAffected":[]},{"revision":"8c138def51c24942a7b6e774dd5aa6be","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GHSA-74pj-6g7r-j55c","aliases":["CVE-2026-72790","GO-2026-6431"],"title":"SiYuan: Notebook name, document count, size and timestamps are returned for any notebook, including notebooks hidden from readers, by /api/notebook/getNotebookInfo","description":"**CVE:** This vulnerability corresponds to [CVE-2026-72790](https://nvd.nist.gov/vuln/detail/CVE-2026-72790).\n\n### Relationship to GHSA-8x84-r2ff-h8pq (please read first)\n\n`getNotebookInfo` is named in the earlier advisory GHSA-8x84-r2ff-h8pq, in its remediation section, which asked for reader filtering on both `getNotebookConf` and `getNotebookInfo`. Commit `3bc014c7d` applied that filtering to `getNotebookConf` only.\n\nThat advisory grouped `getNotebookInfo` under `BoxCrypt`, and `getNotebookInfo` never returns `BoxCrypt`. Anyone checking the handler for key material would correctly find none and move on. This report corrects that characterisation and states what the handler actually discloses, which is notebook metadata rather than key material. If you would prefer this tracked as a follow-up on the original advisory rather than separately, that is entirely reasonable.\n\n### Summary\n\n`/api/notebook/getNotebookInfo` is registered with `CheckAuth` only and applies no authorization check of any kind. Given a notebook identifier, it returns that notebook's author-written name, document count, total size and creation and modification timestamps. It does so for every notebook the server has loaded, including notebooks that `lsNotebooks` deliberately withholds from readers because they are closed or not publish-visible.\n\n### Details\n\n| Item | Detail |\n|---|---|\n| Route | `kernel/api/router.go:123` `POST /api/notebook/getNotebookInfo` → `model.CheckAuth` → `getNotebookInfo` |\n| Middleware | `CheckAuth` only, no `CheckReadonly`, no `CheckAdminRole` |\n| Guard in handler | None. `IsReadOnlyRoleContext`, `publishAccess`, `Visible` and `Closed` all return zero matches |\n| Exposed | `BoxInfo{ID, Name, DocCount, Size, HSize, Mtime, CTime, HMtime, HCtime}` |\n| Affected refs | `eef105683` (v3.7.3, master HEAD) and `v3.7.4-alpha.1`, handler identical on both |\n\n**The handler.** It validates `boxID` against the ID pattern, calls `box := model.Conf.Box(boxID)`, returns a not-found response if that is nil, and otherwise returns `box.GetInfo()` unmodified. `GetInfo()` (`kernel/model/box.go:470`) walks the notebook's files and returns the metadata listed above. There is no ownership check and no publish-access check anywhere on the path.\n\nThe nil branch is also a minor existence oracle: a valid-format identifier that names no loaded notebook is distinguishable from one that does.\n\n**Guarded sibling.** `lsNotebooks`, the notebook lister, is also reader-reachable and does filter. For read-only roles it skips any notebook where `notebook.Closed` holds, and skips any notebook whose publish-access entry has `!item.Visible`. The codebase therefore intends closed and non-published notebooks to be invisible to readers. `getNotebookInfo` returns their name and statistics to any reader who supplies the identifier.\n\n**Precedent.** GHSA-f2rw-w22v-54vh restricted `getEncryptedNotebookStatus`, which disclosed encrypted-notebook names and lock state, to administrators. `getNotebookInfo` is the non-encrypted analogue, disclosing regular notebook names and statistics including for notebooks outside the reader's publish scope, and was not restricted.\n\n**Reachability, stated precisely, because it differs by branch.**\n\nOn v3.7.3 a reader can obtain the identifier of a notebook they cannot see, by chaining two endpoints that are currently ungated on that branch. `getBlockDefIDsByRefText` returns block and document identifiers workspace-wide, including from hidden notebooks. `getPathByID` then returns the owning notebook identifier for any such block, in its `notebook` field. `getFullHPathByID` additionally discloses the notebook name directly. The chain requires no special conditions beyond a reference text that occurs somewhere in the workspace.\n\nOn the development branch those sources are already closed. `getPathByID` now gates through `CheckBlockIdMetadataAccessableByPublishAccessInBox`, `getIDsByHPath` through `filterFileTreeBlockIDsByPublishDiscoverability`, and `getBlockDefIDsByRefText` and `getFullHPathByID` are likewise gated. Notebook identifiers are a fourteen-digit timestamp plus seven random characters, and `Conf.Box(boxID)` returns non-nil only for loaded notebooks, so guessing is not practical. A reader-reachable route on the development branch that yields the identifier of a hidden notebook was not found.\n\nSo on the development branch this is defence in depth rather than a live path. It is reported because the handler itself remains unguarded on both branches, and because closing it removes any dependence on those identifier sources staying gated in future.\n\n### Proof of Concept\n\nPrecondition: publish mode enabled (default port 6808), anonymous when `Publish.Auth.Enable` is `false`, otherwise any publish reader account. A notebook that is closed or not publish-visible. Steps 1 and 2 apply to v3.7.3; on the development branch, start at step 3 with a known identifier.\n\nStep 1, obtain block identifiers workspace-wide:\n\n```\nPOST http://127.0.0.1:6808/api/block/getBlockDefIDsByRefText\n{\"anchor\":\"<a word likely to occur anywhere in the workspace>\"}\n\n→ 200, block and document identifiers including ones inside hidden notebooks\n```\n\nStep 2, resolve one to its owning notebook:\n\n```\nPOST http://127.0.0.1:6808/api/filetree/getPathByID\n{\"id\":\"<identifier from step 1>\"}\n\n→ 200, the notebook field carries the hidden notebook's boxID\n```\n\nStep 3, read the notebook's metadata:\n\n```\nPOST http://127.0.0.1:6808/api/notebook/getNotebookInfo\n{\"notebook\":\"<boxID from step 2>\"}\n\n→ 200, returns name, docCount, size, hSize, mtime, ctime, hMtime, hCtime\n   for a notebook that lsNotebooks does not return to this same session\n```\n\nThe differential is the point: call `lsNotebooks` with the same session and confirm the notebook is absent from the list, then call `getNotebookInfo` and receive its name and statistics.\n\n### Impact\n\nAn anonymous reader in publish mode, or any publish `RoleReader`, can read the author-written name, document count, total size and activity timestamps of notebooks that are closed or not published, which are exactly the notebooks the notebook lister withholds from them. Notebook names are free text chosen by the author and routinely describe their contents. Document count and size indicate scale, and the modification timestamp reveals recent activity in a workspace area the reader has no access to. Confidentiality only, with no integrity or availability impact, and no document content is disclosed.\n\n### Suggested fix\n\nApply the same filtering `lsNotebooks` already performs. When `IsReadOnlyRoleContext(c)` holds, return the not-found response unless the notebook is publish-visible and not closed, before calling `GetInfo()`. This is the reader filtering the earlier advisory's remediation section requested for this handler.","state":0,"publishedAt":"2026-09-08T17:54:19+00:00","modifiedAt":"2026-09-10T15:26:00.5915335+00:00","affected":[{"ecosystem":"Go","name":"github.com/siyuan-note/siyuan/kernel","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"0.0.0-20260726005141-9edb321eb451"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"MODERATE"}],"references":["https://github.com/siyuan-note/siyuan/security/advisories/GHSA-74pj-6g7r-j55c","https://nvd.nist.gov/vuln/detail/CVE-2026-72790","https://github.com/siyuan-note/siyuan/commit/9edb321eb451db445f3c824380e1993c3df0fc16","https://github.com/siyuan-note/siyuan","https://www.vulncheck.com/advisories/siyuan-before-information-disclosure-via-getnotebookinfo"],"sourceUrl":"https://github.com/advisories/GHSA-74pj-6g7r-j55c","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-74pj-6g7r-j55c","identifiers":["GHSA-74pj-6g7r-j55c","CVE-2026-72790","GO-2026-6431"]},"retained":false,"historicalAffected":[]},{"revision":"c74fad6d53fb4d3799538791a96fd9da","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GO-2026-6431","aliases":["CVE-2026-72790","GHSA-74pj-6g7r-j55c"],"title":"SiYuan: Notebook name, document count, size and timestamps are returned for any notebook, including notebooks hidden from readers, by /api/notebook/getNotebookInfo in github.com/siyuan-note/siyuan/kernel","description":"SiYuan: Notebook name, document count, size and timestamps are returned for any notebook, including notebooks hidden from readers, by /api/notebook/getNotebookInfo in github.com/siyuan-note/siyuan/kernel","state":0,"publishedAt":"2026-09-10T14:48:42+00:00","modifiedAt":"2026-09-10T15:15:14.761364+00:00","affected":[{"ecosystem":"Go","name":"github.com/siyuan-note/siyuan/kernel","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"0.0.0-20260726005141-9edb321eb451"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[],"references":["https://github.com/siyuan-note/siyuan/security/advisories/GHSA-74pj-6g7r-j55c","https://nvd.nist.gov/vuln/detail/CVE-2026-72790","https://github.com/siyuan-note/siyuan/commit/9edb321eb451db445f3c824380e1993c3df0fc16","https://www.vulncheck.com/advisories/siyuan-before-information-disclosure-via-getnotebookinfo"],"sourceUrl":"https://osv.dev/vulnerability/GO-2026-6431","license":"OSV · upstream source license applies","key":"osv:GO-2026-6431","identifiers":["GO-2026-6431","CVE-2026-72790","GHSA-74pj-6g7r-j55c"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-10-25T22:04:08.5875992+00:00","complete":true,"records":1756,"lastAttemptAt":"2026-10-25T22:04:08.5875992+00:00","lastSuccessAt":"2026-10-25T22:04:08.8596165+00:00","error":null,"lastVerifiedAt":"2026-10-25T22:04:08.8596241+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-1a687ad2a0b90150aa7d97c9f39e63de695ae2db23e31ebc28df1492c461b23c-1c072e7db56f0d3179c99f5b33ed9988c328ad75783993f151d8522bc700aaba","complete":true,"records":414046,"lastAttemptAt":"2026-10-25T22:02:18.7733512+00:00","lastSuccessAt":"2026-10-25T22:02:18.6654575+00:00","error":null,"lastVerifiedAt":"2026-10-25T22:02:18.7733512+00:00","snapshotPublishedAt":"2026-10-25T21:21:07+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-43321610382942b8ad8c85917eab1546","complete":false,"records":4735,"lastAttemptAt":"2026-10-25T22:04:11.413428+00:00","lastSuccessAt":"2026-10-24T23:18:49.862+00:00","error":"InvalidDataException","lastVerifiedAt":"2026-10-24T23:18:49.862+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":4764,"expectedIdentifiers":13474},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-10-25T22:04:08.5875992+00:00","complete":true,"records":1093,"lastAttemptAt":"2026-10-25T22:04:08.5875992+00:00","lastSuccessAt":"2026-10-25T22:04:08.8610999+00:00","error":null,"lastVerifiedAt":"2026-10-25T22:04:08.8611051+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-204a3fb93a00487e8f7f36db01dc851d","complete":true,"records":13413,"lastAttemptAt":"2026-10-25T22:04:09.4303098+00:00","lastSuccessAt":"2026-10-25T16:19:28.681+00:00","error":null,"lastVerifiedAt":"2026-10-25T16:19:28.681+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13474,"expectedIdentifiers":13474},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-2375a4e597279abf92e8747e140fe8da9d421877cd49cae3ac69a2cb78469b2c","complete":true,"records":9779,"lastAttemptAt":"2026-10-25T22:04:08.4463409+00:00","lastSuccessAt":"2026-10-24T13:19:53.1346702+00:00","error":null,"lastVerifiedAt":"2026-10-25T22:04:08.4463409+00:00","snapshotPublishedAt":"2026-10-24T03:03:12+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-16ad89dfea13ab9e9b0108e63a759d63bd4559cc68b58491107d62ee35bbbaf2","complete":true,"records":1965,"lastAttemptAt":"2026-10-25T22:02:18.9302775+00:00","lastSuccessAt":"2026-10-23T16:01:26.4487605+00:00","error":null,"lastVerifiedAt":"2026-10-25T22:02:18.9302775+00:00","snapshotPublishedAt":"2026-10-21T12:18:07+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-7da67a15aa6e56a0e3081a7646dc74d537e6ef974afc593c2b1794ed01970648","complete":true,"records":2969,"lastAttemptAt":"2026-10-25T22:04:08.554556+00:00","lastSuccessAt":"2026-10-24T13:19:59.1145547+00:00","error":null,"lastVerifiedAt":"2026-10-25T22:04:08.554556+00:00","snapshotPublishedAt":"2026-10-24T08:47:51+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-11236ada05a0588e51df37636716526867f73fb127392c49680b6f8561496a99","complete":true,"records":230781,"lastAttemptAt":"2026-10-25T22:04:08.3201814+00:00","lastSuccessAt":"2026-10-25T22:04:07.173333+00:00","error":null,"lastVerifiedAt":"2026-10-25T22:04:08.3201814+00:00","snapshotPublishedAt":"2026-10-25T21:33:06+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null}]}