VYPR
Moderate severityNVD Advisory· Published Mar 19, 2026· Updated Mar 25, 2026

SiYuan importStdMd: unvalidated localPath imports arbitrary host directories as persistent notes

CVE-2026-32750

Description

SiYuan is a personal knowledge management system. In versions 3.6.0 and below, POST /api/import/importStdMd passes the localPath parameter directly to model.ImportFromLocalPath with zero path validation. The function recursively reads every file under the given path and permanently stores their content as SiYuan note documents in the workspace database, making them searchable and accessible to all workspace users. Data persists in the workspace database across restarts and is accessible to Publish Service Reader accounts. Combined with the renderSprig SQL injection ( separate advisory ), a non-admin user can then read all imported secrets without any additional privileges. This issue has been fixed in version 3.6.1.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
github.com/siyuan-note/siyuanGo
<= 0.0.0-20260313024916-fd6526133bb3

Affected products

1

Patches

1
13b6d3d45e83

:lock: https://github.com/siyuan-note/siyuan/security/advisories/GHSA-rjhh-m223-9qqv

https://github.com/siyuan-note/siyuanDanielMar 14, 2026via ghsa
1 file changed · +18 0
  • kernel/api/import.go+18 0 modified
    @@ -17,6 +17,7 @@
     package api
     
     import (
    +	"fmt"
     	"io"
     	"net/http"
     	"os"
    @@ -188,6 +189,23 @@ func importStdMd(c *gin.Context) {
     	notebook := arg["notebook"].(string)
     	localPath := arg["localPath"].(string)
     	toPath := arg["toPath"].(string)
    +
    +	if util.IsSubPath(util.WorkingDir, localPath) {
    +		msg := fmt.Sprintf("import from local path [%s] failed: local path is sub path of working dir", localPath)
    +		logging.LogErrorf(msg)
    +		ret.Code = -1
    +		ret.Msg = msg
    +		return
    +	}
    +
    +	if util.IsSensitivePath(localPath) {
    +		msg := fmt.Sprintf("import from local path [%s] failed: local path is sensitive path", localPath)
    +		logging.LogErrorf(msg)
    +		ret.Code = -1
    +		ret.Msg = msg
    +		return
    +	}
    +
     	err := model.ImportFromLocalPath(notebook, localPath, toPath)
     	if err != nil {
     		ret.Code = -1
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.