CVE-2026-72798

CVE-2026-72798 is a high-severity missing authorization vulnerability in github.com/siyuan-note/siyuan/kernel (go), affecting versions < 0.0.0-20260724121519-426991d155c0. It is fixed in 0.0.0-20260724121519-426991d155c0.

Does this CVE actually affect you?

Kodem shows which CVEs are reachable and running in your applications, so you fix what's exploitable, not just what's listed.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Runtime intelligence, not another scanner.

Summary

SiYuan: Publish-access filter on renderAttributeView leaves related-database content unfiltered and fails open on non-block first columns

CVE: This vulnerability corresponds to CVE-2026-72798.

renderAttributeView correctly applies the reader publish-access filter, but the filter's row-accessibility decision is keyed solely to the row's first cell, and it never inspects the remaining cells' values. Relation and Rollup cells carry mirrored content from a different database, so a row belonging to a published database can hand an anonymous reader the contents of a related database whose host document is hidden, publish-forbidden, or password-protected. Separately, when the first column is not a block value the accessibility check is skipped entirely and the row is returned unchecked.

Note:

This is distinct from the previously reported password-tier omission in the same function that concerns the row's own primary block, whereas these two defects concern (a) other cells' related-database content, which no row-level check covers and (b) rows where the first cell is not a block at all. A fix to the row-drop condition alone would close neither.

Details

renderAttributeView applies the filter (kernel/api/av.go:68):

retDataMap["view"] = model.FilterViewByPublishAccess(c, publishAccess, retDataMap["view"].(av.Viewable))

Inside FilterViewByPublishAccess (kernel/model/publish_access.go):

if row.Cells[0].Value.Block != nil {
    bt = treenode.GetBlockTree(row.Cells[0].Value.Block.ID)
}
if bt != nil {
    if !CheckPathAccessableByPublishIgnore(bt.BoxID, bt.Path, publishIgnore) {
        row = nil   // drop
    }
}
// every other cell in the row is returned as-is

(a) Relation and Rollup cells leak the related database. These value types carry mirrored content, not just references:

type ValueRelation struct { BlockIDs []string; Contents []*Value }
type ValueRollup   struct { Contents []*Value }

The render pipeline populates them from a different attribute view e.g. kernel/model/attribute_view.go:2731:

v.GroupVal.Relation.Contents = []*av.Value{ relationDestAv.GetBlockValue(groupValue) }

relationDestAv is a separate database that may live in a hidden, publish-forbidden, or password-protected document. When a published database's row survives the filter (because its column-0 document is public), its Relation and Rollup columns return the related, non-published database's content block text, titles, and mirrored column values. FilterViewByPublishAccess performs no publish-access evaluation on Relation.Contents or Rollup.Contents.

(b) Fail-open when column 0 is not a block. bt is assigned only when row.Cells[0].Value.Block != nil. If the first column is a non-block type (Relation, Text, …) or the row is detached, bt remains nil, the if bt != nil guard is skipped, and the row is returned with no accessibility check at all. Column order is user-reorderable, so any database whose first column is not the document block bypasses row filtering entirely.

Verified at origin/master (eef105683).

Proof of Concept

Precondition: publish mode enabled (default port 6808); anonymous when Publish.Auth.Enable is false. Two databases: DB-A hosted in a published document, DB-B hosted in a publish-forbidden or password-protected document, with a Relation column in DB-A pointing at DB-B and containing a distinctive marker value.

(a) Related-database content disclosure:

POST http://127.0.0.1:6808/api/av/renderAttributeView
{"id":"<DB_A_AV_ID>"}

Rows of DB-A are returned (correctly, since its host document is public), and their Relation/Rollup cell Contents include DB-B's block text and mirrored column values, despite DB-B's host document being excluded from publishing.

(b) Fail-open row:
Reorder DB-A so its first column is a non-block type (or use a detached row), mark its host document publish-forbidden, and request the same endpoint the row is returned without any accessibility evaluation.

Verification status: both defects are confirmed by code inspection at origin/master. A live demonstration requires a build from HEAD with two linked databases; available on request.

Impact

An anonymous reader (publish mode with auth disabled) or any publish RoleReader can read content from databases whose host documents are hidden, publish-forbidden, or password-protected, by requesting a published database that relates to them. Because relation graphs are commonly used to link a public index to private detail records, this exposes exactly the data the publish boundary is meant to withhold. The fail-open path additionally returns rows with no accessibility check whenever the first column is not a block value, which is a user-controlled layout property. Confidentiality-only.

The application does not perform an authorization check before performing a sensitive operation. Typical impact: unauthorized access to restricted functionality or data.

CVE-2026-72798 has a CVSS score of 8.6 (High). The vector is network-reachable, no privileges required, and no user interaction. A CVSS score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether this affects your application depends on whether the vulnerable code is present and reachable in your environment. A fixed version is available (0.0.0-20260724121519-426991d155c0); upgrading removes the vulnerable code path.

Affected versions

github.com/siyuan-note/siyuan/kernel (< 0.0.0-20260724121519-426991d155c0)

Security releases

github.com/siyuan-note/siyuan/kernel → 0.0.0-20260724121519-426991d155c0 (go)

Kodem intelligence

Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.

Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.

Already deployed Kodem?

See it in your environmentNew to Kodem? Get a demo →

Remediation advice

In FilterViewByPublishAccess:

  1. For each retained row, evaluate every Relation.Contents and Rollup.Contents entry against CheckBlockIdAccessableByPublishAccess (including the publish-password tier) and drop or mask entries that fail.
  2. Fail closed: when row.Cells[0] has no accessible block (Value.Block == nil or bt == nil), drop the row rather than returning it unchecked.

Frequently Asked Questions

  1. What is CVE-2026-72798? CVE-2026-72798 is a high-severity missing authorization vulnerability in github.com/siyuan-note/siyuan/kernel (go), affecting versions < 0.0.0-20260724121519-426991d155c0. It is fixed in 0.0.0-20260724121519-426991d155c0. The application does not perform an authorization check before performing a sensitive operation.
  2. How severe is CVE-2026-72798? CVE-2026-72798 has a CVSS score of 8.6 (High). This score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether it represents real risk in your environment depends on whether the vulnerable code is present and reachable.
  3. Which versions of github.com/siyuan-note/siyuan/kernel are affected by CVE-2026-72798? github.com/siyuan-note/siyuan/kernel (go) versions < 0.0.0-20260724121519-426991d155c0 is affected.
  4. Is there a fix for CVE-2026-72798? Yes. CVE-2026-72798 is fixed in 0.0.0-20260724121519-426991d155c0. Upgrade to this version or later.
  5. Is CVE-2026-72798 exploitable, and should I be worried? Whether CVE-2026-72798 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
  6. What actually determines whether CVE-2026-72798 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
  7. How do I fix CVE-2026-72798? Upgrade github.com/siyuan-note/siyuan/kernel to 0.0.0-20260724121519-426991d155c0 or later.

Stop the waste.
Protect your environment with Kodem.