CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-72795

CVE-2026-72795: Missing Authorization in SiYuan Block DOM Rendering

Alon Barad
Alon Barad
Software Engineer

Sep 5, 2026·5 min read·19 visits

Executive Summary (TL;DR)

Unauthenticated information exposure in SiYuan note platform allows remote anonymous attackers to view private note content via missing authorization checks in dynamic block transclusion endpoints.

CVE-2026-72795 is a critical missing authorization vulnerability (CWE-862) in SiYuan, a self-hosted personal knowledge platform. When configured in publish/read-only mode, the application fails to validate publish-access rules on dynamic child blocks transcluded via SQL queries. This allows anonymous external visitors to access hidden, password-protected, or forbidden note content.

Vulnerability Overview

The open-source personal knowledge-management platform SiYuan provides a publish feature to share notes externally. When running in self-hosted or server mode, external readers can access designated documents in a read-only capacity. The APIs responsible for retrieving block Document Object Models (DOMs), specifically /api/block/getBlockDOMWithEmbed and /api/block/getBlockDOMsWithEmbed, are exposed to allow rendering of pages containing block transclusions. This mechanism relies on dynamic SQL queries to locate and embedded child block elements.

The vulnerability is classified under CWE-862 (Missing Authorization) and manifests because the application fails to validate publish-access controls on individual child blocks fetched via dynamic queries. When resolving these transcluded structures, the backend retrieves internal blocks based on search patterns without confirming if the requesting user possesses authorization to read the parent document containing those blocks. Consequently, unauthorized users can read protected block content through public documents that embed dynamic queries.

Root Cause Analysis

The root cause of CVE-2026-72795 is an inconsistent authorization check within the Go backend rendering engine. Inside the SiYuan block model, a document is parsed into an abstract syntax tree (AST) containing nodes of type NodeBlockQueryEmbed. These nodes represent embedded blocks configured to dynamically query the internal SQLite-like database using SQL criteria. When rendering the page DOM, the engine matches these nodes and executes database queries to merge the matching sub-blocks' DOM representation into the parent page.

Although the system correctly enforces access restrictions on the parent document requested by the user, it did not apply authorization checks recursively on the blocks returned from the sub-query. When a read-only or anonymous session calls the DOM retrieval endpoints, the backend queries the database for target child blocks and merges them directly into the output payload. The server bypasses validation for whether the resolved sub-block resides in a password-protected notebook or a private document.

This missing authorization layer creates a logic flaw where any public document containing a dynamic embed block can act as an oracle. If the embedded SQL query inside the public document matches blocks from private files, the server serializes that restricted content into the DOM response. The vulnerability allows an unauthorized remote attacker to extract arbitrary text from secure, non-published notes.

Code Analysis

The core fix for CVE-2026-72795 lies in the introduction of an authorization callback interface to check publish access for embedded blocks. In kernel/api/block.go, the application now explicitly determines whether the request originates from a read-only session and initializes a validator closure:

isReadOnlyRole := model.IsReadOnlyRoleContext(c)
var publishAccess model.PublishAccess
var accessChecker model.EmbedBlockAccessChecker
if isReadOnlyRole {
    publishAccess = model.GetPublishAccess()
    accessChecker = func(blockID string) bool {
        // Verifies if the requested block ID can be accessed by the current publish access level
        return model.CheckBlockIdAccessableByPublishAccessInBox(c, publishAccess, blockID, boxID)
    }
}
dom := model.GetBlockDOMWithEmbedInBoxWithAccessChecker(id, boxID, accessChecker)

The validation logic is propagated down to the rendering code in kernel/model/block.go. Within resolveEmbedContentInBox, the returned database blocks are filtered prior to serialization:

func filterEmbedBlocksByAccess(blocks []*sql.Block, accessChecker EmbedBlockAccessChecker) (ret []*sql.Block) {
    if nil == accessChecker {
        return blocks // If no access checker is active (e.g. admin session), return all
    }
    ret = make([]*sql.Block, 0, len(blocks))
    for _, block := range blocks {
        if nil != block && accessChecker(block.ID) {
            ret = append(ret, block) // Only allow blocks that pass verification
        }
    }
    return
}

The patch ensures that blocks failing the accessChecker validation are discarded prior to DOM construction, successfully mitigating the cross-document data leakage.

Exploitation Methodology

To exploit CVE-2026-72795, an attacker must first locate a SiYuan instance with public read-only access enabled. The attacker identifies at least one public document that contains a block embed query (NodeBlockQueryEmbed). This configuration is typical for websites using SiYuan as a public CMS or documentation portal where certain pages aggregate content dynamically.

The attacker can then execute a direct HTTP POST request targeting the /api/block/getBlockDOMWithEmbed endpoint, specifying the ID of the public block. Because authorization checks are not applied to the query results, the returned payload contains the complete rendered DOM of the matching transcluded blocks in its attributes.

POST /api/block/getBlockDOMWithEmbed HTTP/1.1
Host: target-siyuan.local
Content-Type: application/json
 
{
  "id": "20260725000001-public1"
}

In a vulnerable deployment, the response contains data-type="NodeBlockQueryEmbed" with the raw HTML representing the forbidden, restricted, or password-protected content. This allows the attacker to extract arbitrary confidential information matching the query terms without needing any administrative credentials or session tokens.

Impact Assessment

The impact of CVE-2026-72795 is a severe confidentiality compromise of self-hosted SiYuan knowledge databases. An unauthorized attacker can read block content from any private, password-protected, or hidden notebook on the system if it gets matched by the dynamic block embeds. The flaw has a CVSS v4.0 score of 9.2 (Critical) and a CVSS v3.1 score of 8.6 (High), highlighting the ease of exploitation and the depth of the information exposure.

The vulnerability does not allow modification of notes (Integrity) or service disruption (Availability). However, the leakage of confidential personal data, credentials, and organizational documentation represents a critical failure of the platform's privacy-first security model. This threat is particularly acute for public-facing deployments that aggregate notes via SQL block queries.

Remediation & Mitigations

The primary remediation for CVE-2026-72795 is upgrading the SiYuan application to version 3.7.4 or later. The patch implements the mandatory authorization callbacks to ensure that public queries do not transclude unauthorized content.

If an immediate upgrade is not feasible, administrators should disable public publishing or restrict network access to the instance. This can be achieved by placing the SiYuan workspace behind an authenticating reverse proxy or VPN. Additionally, removing dynamic block embed queries (NodeBlockQueryEmbed) from public pages prevents the unauthorized database querying behavior.

Fix Analysis (1)

Technical Appendix

CVSS Score
9.2/ 10
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
EPSS Probability
0.24%
Top 85% most exploited

Affected Systems

SiYuan personal knowledge-management platform

Affected Versions Detail

Product
Affected Versions
Fixed Version
siyuan
siyuan-note
< 3.7.43.7.4
AttributeDetail
CWE IDCWE-862 (Missing Authorization)
Attack VectorNetwork
CVSS v4.0 Score9.2
EPSS Score0.00241
Exploit StatusPoC / Technical Analysis
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-862
Missing Authorization

The software does not perform an authorization check when an actor attempts to access a resource or perform an action, resulting in data exposure to unauthorized entities.

Known Exploits & Detection

GitHub Security AdvisoryGHSA detailed advisory documenting missing authorization on transcluded blocks.

Vulnerability Timeline

Patch implemented and committed to GitHub main branch.
2026-07-25
CVE-2026-72795 officially assigned and GHSA-h6w7-xxcf-w2mq published.
2026-08-12
CVE record updated with extended CVSS 4.0 vectors.
2026-08-14
National Vulnerability Database (NVD) publishes CVSS 3.1 analysis.
2026-08-26

References & Sources

  • [1]GHSA-h6w7-xxcf-w2mq: Security Advisory
  • [2]VulnCheck Vulnerability Report
  • [3]Fix Commit 1ca1c3c

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•2 minutes ago•CVE-2026-109619
9.2

CVE-2026-109619: Remote Code Execution in PHP Core via Stale Global State Memory Corruption (PHP2Shell)

CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.

Alon Barad
Alon Barad
1 views•6 min read
•5 minutes ago•CVE-2026-113721
4.5

CVE-2026-113721: Unsafe Link Resolution in virtualenv File Generation

In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.

Amit Schendel
Amit Schendel
1 views•5 min read
•9 days ago•CVE-2026-87697
8.8

CVE-2026-87697: Untrusted Deserialization in .NET PresentationCore Clipboard Handling

A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.

Alon Barad
Alon Barad
31 views•5 min read
•9 days ago•CVE-2026-70007
8.8

CVE-2026-70007: Out-of-Bounds Write Vulnerability in .NET Framework and WPF Subsystem

An out-of-bounds write vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio allows unauthenticated remote attackers to execute arbitrary code via crafted pixel-shader bytecode or auto-converted clipboard payloads.

Amit Schendel
Amit Schendel
19 views•6 min read
•10 days ago•CVE-2026-70186
7.5

CVE-2026-70186: ASP.NET Core Denial of Service Vulnerability via Framework Deadlock

ASP.NET Core contains a thread deadlock vulnerability (CWE-833) that allows an unauthenticated remote attacker to cause a denial of service over the network by exhausting server thread pool resources.

Amit Schendel
Amit Schendel
18 views•5 min read
•10 days ago•CVE-2026-70035
8.8

CVE-2026-70035: Insecure Deserialization Remote Code Execution in Microsoft .NET Framework and .NET Runtime

CVE-2026-70035 is a high-severity Remote Code Execution (RCE) vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio caused by improper handling during the deserialization of untrusted data (CWE-502). An unauthenticated attacker can execute arbitrary code within the context of the affected process by delivering a crafted serialized payload.

Amit Schendel
Amit Schendel
24 views•6 min read