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):
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 }