GHSA-mfrj-v65r-979c: High severity go/github.com/siyuan-note/siyuan/kernel vulnerability

Published Sep 4, 2026
·
Updated

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

Summary

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): go retDataMap["view"] = model.FilterViewByPublishAccess(c, publishAccess, retDataMap["view"].(av.Viewable))

Inside FilterViewByPublishAccess (kernel/model/publishaccess.go): 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: go 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/attributeview.go:2731: go 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":"<DBAAVID>"} 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.

Suggested fix

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.

Affected Software

1 affected componentFixes available
go/github.com/siyuan-note/siyuan/kernel<0.0.0-20260724121519-426991d155c0
0.0.0-20260724121519-426991d155c0

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade go/github.com/siyuan-note/siyuan/kernel to a version that resolves this vulnerability.

    Fixed in 0.0.0-20260724121519-426991d155c0
  2. Upgrade

    Upgrade origin/master to a version that resolves this vulnerability.

    Patch eef105683
  3. Configuration

    Ensure publish mode is not accessible to anonymous users; set Publish.Auth.Enable to true (anonymous is possible when Publish.Auth.Enable is false per the material).

    Publish API (port 6808) Publish.Auth.Enable = false
  4. Compensating control

    Add network/firewall/ACL restrictions so the publish API and related render endpoints (e.g., /api/av/renderAttributeView on port 6808) are reachable only by authenticated/authorized clients; this prevents an anonymous reader (or any publish RoleReader) from requesting published databases to read related database contents that should be withheld.

Event History

Sep 4, 2026
Advisory Published
via GitHub·08:58 PM
Data Sourced
via GitHub·08:58 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

Who can access the exposed data?

Anonymous readers of a published database may receive related-database content through Relation or Rollup cells, even when the related database's host document is hidden, forbidden from publishing, or password-protected. No attacker privileges or user interaction are indicated by the supplied vector.

2

How can I identify attribute views at risk?

Review attribute views in published databases for rows containing Relation or Rollup cells that mirror content from a different database with restricted publication or access. Rows whose first column is not a block value are also returned without the described row-accessibility check.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203