Sep 5, 2026·5 min read·21 visits
Missing authorization checks in SiYuan renderAttributeView allow anonymous readers to bypass database access controls and extract sensitive cell data from hidden or password-protected databases via crafted API requests.
Prior to version v3.7.4, the SiYuan personal knowledge management system contained a critical logical authorization vulnerability within its database view rendering component. The flaws allowed unauthenticated remote attackers to bypass publish-access filters on databases, exposing sensitive Relation and Rollup cell contents belonging to private or password-protected repositories.
SiYuan is a local-first personal knowledge management system designed to support complex databases, relation attributes, and page-publishing features. When deployed in publish mode, the server is designed to enforce access control boundaries, ensuring that anonymous web readers can only view explicitly authorized, public-facing database blocks.
Prior to version v3.7.4, the API endpoint responsible for rendering database view attributes, 'renderAttributeView', suffered from critical security flaws that compromised these access controls. Specifically, the component failed to adequately validate the authorization context when rendering row attributes and serializing nested cell relationships.
These design oversights allowed anonymous remote users to bypass publish-access boundaries. By querying public database views containing references to private tables, users could extract confidential records from hidden or password-protected databases.
The first security flaw stems from a fail-open logical assumption in the primary filter function 'FilterViewByPublishAccess'. To verify row-level access permissions, the system checked the block identifier stored in the first column of each row ('row.Cells[0]'). It retrieved the block tree state and verified its public availability.
If the database layout was modified or reordered such that the first column was a non-block type—such as a selection, text, relation, or rollup field—the cell did not contain a valid block ID. Consequently, the block tree lookup returned a 'nil' state, causing the access check to return true and bypass authorization checks entirely.
The second logical flaw is located in the serialization of 'Relation' and 'Rollup' database attributes. These fields do not merely store pointers to other tables; they encapsulate cached copies of structures like 'ValueRelation' and 'ValueRollup', which contain raw content from the target databases. Because the rendering process failed to recursively inspect and sanitize these complex nested structs, confidential metadata was exposed to unauthorized users.
The vulnerable implementation in 'renderAttributeView' loaded data blocks without validating that the targeted relation database was accessible to the client. The fix introduces a multi-layered security boundary by integrating recursive, layout-aware validation.
Below is a simplified representation of the recursive validation loop introduced in the patch to intercept unauthorized cells:
// Patched logic evaluating layout and filtering cell values
func (filter *attributeViewPublishAccessFilter) filterViewable(attrView *av.AttributeView, viewable av.Viewable) {
if nil == viewable {
return
}
switch viewable.GetType() {
case av.LayoutTypeTable:
table := viewable.(*av.Table)
filter.filterGroupValue(attrView, table.BaseInstance)
for _, row := range table.Rows {
if nil == row {
continue
}
for _, cell := range row.Cells {
if nil == cell {
continue
}
// Deeply evaluates authorization context per cell
filter.filterBaseValue(attrView, row.ID, cell.BaseValue)
}
}
}
}When encountering relationship properties, the system now enforces a strict verification check against the target view. If authorization to the related target view is not present, the content is replaced with empty structures via the 'clearAttributeViewSensitiveValue' function:
func clearAttributeViewSensitiveValue(value *av.Value) *av.Value {
ret := cloneAttributeViewSensitiveValue(value)
switch value.Type {
case av.KeyTypeRelation:
// Clears out potentially sensitive relations
ret.Relation = &av.ValueRelation{}
case av.KeyTypeRollup:
// Clears out potentially sensitive rollups
ret.Rollup = &av.ValueRollup{}
}
return ret
}This recursive approach prevents parent database views from leaking cached records belonging to restricted or password-protected datasets.
An attacker can exploit this vulnerability with network-level access to the SiYuan web interface. The prerequisites are minimal: the attacker must locate a published, public-access database view that contains relation fields linking to protected databases.
To retrieve unauthorized cell values, the attacker initiates a direct POST request to the '/api/av/renderAttributeView' endpoint specifying the public attribute view identifier. The request payload matches the following format:
POST /api/av/renderAttributeView HTTP/1.1
Host: target-siyuan-instance:6806
Content-Type: application/json
{
"id": "public-attribute-view-id",
"blockID": "public-block-id"
}Because the vulnerable server fails to recursively sanitize relations, the response JSON includes the serialized 'Relation' and 'Rollup' structures containing information retrieved from the linked, protected databases. This bypasses the access controls configured on the target databases.
Additionally, if the first column layout has been reordered to a non-block type, sending a request to view that specific table bypasses all row-level authorization entirely, exposing the entire table contents to unauthenticated visitors.
The following sequence diagram outlines the data flow in an exploitation scenario:
The security impact of CVE-2026-72798 is high due to the exposure of confidential records from private repositories. The vulnerability scores 9.2 under CVSS v4.0 and 8.6 under CVSS v3.1, reflecting its critical nature.
Attackers can leverage this bypass to harvest intellectual property, access credentials, personal documentation, or internal lists that users assumed were secured behind authorization parameters or password prompts.
Because SiYuan is often used to maintain integrated personal or organizational wikis, exposing database relationship structures represents a complete breach of the confidentiality model. There is no impact on integrity or availability, as the endpoint does not process state-modifying requests.
To remediate the vulnerability, administrators must update their SiYuan installations to version v3.7.4 or later. This version introduces comprehensive filtering, validating both top-level and recursive relation paths.
In environments where immediate software updates are not feasible, administrators should restrict network exposure of the SiYuan server. Ensure that port 6806 is bound exclusively to local network interfaces or positioned behind a robust reverse proxy that enforces secondary authentication layers.
Additionally, administrators can mitigate the leak vector by temporarily deleting active 'Relation' or 'Rollup' attributes that link public databases to private or sensitive repositories.
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
SiYuan Siyuan Note | < 3.7.4 | 3.7.4 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-862 (Missing Authorization) |
| Attack Vector | Network |
| CVSS v4.0 Base Score | 9.2 (Critical) |
| EPSS Score | 0.00256 |
| Exploit Status | Proof-of-Concept / Theoretical Analysis |
| KEV Status | Not Listed |
The software does not perform an authorization check when an actor attempts to access a resource or perform an action, or performs the check incorrectly, allowing access to unauthorized data.
CVE-2026-61427 is a critical authentication bypass and improper input validation vulnerability within the Model Context Protocol (MCP) HTTP-stream server of PraisonAI. In versions prior to 4.6.78, the server lacks authentication by default and forwards client messages directly to Python tool handlers without input validation. When bound to non-localhost interfaces, this permits unauthenticated remote attackers to perform unauthorized administrative operations and execute tools.
CVE-2026-107387 is a high-impact uncontrolled memory allocation vulnerability in music-metadata, a widely used Node.js metadata parser. The flaw occurs in the APEv2 tag parser, where the library reads an attacker-controlled 32-bit integer indicating the tag size and immediately requests a corresponding heap buffer reservation. Because this allocation occurs before validating if the input stream actually contains those bytes, an attacker can supply a minuscule audio file to trigger large, disproportionate allocations, resulting in heap exhaustion and an uncatchable process-wide Out of Memory (OOM) crash.
An input validation vulnerability exists in music-metadata versions prior to 11.16.0, where parsing a crafted MP4 file containing a sample-description (stsd) box with a zero-value size entry causes a synchronous infinite loop and memory exhaustion, resulting in complete Denial of Service.
A path traversal vulnerability in datamodel-code-generator allows remote attackers to write or overwrite arbitrary files on the local host filesystem via a manipulated Protobuf schema containing malicious weak import paths.
PraisonAI is vulnerable to an arbitrary local file read vulnerability prior to version 4.6.78. The flaw is in the ContextGatherer component, where validation checks are executed only after files are parsed and appended to the context bundle, bypassing security constraints.
An algorithmic complexity vulnerability (CWE-770) in the Excelize library allows remote attackers to cause resource exhaustion (100% CPU usage) via a crafted Microsoft Excel spreadsheet. This occurs because the look-ahead row index parsing in Rows.Columns() fails to enforce upper boundary limits, enabling an out-of-bounds row index to trigger an infinite seek loop inside the Rows iterator.