SiYuan Desktop: Stored XSS in imported .sy.zip content leads to arbitrary command execution

説明

Summary

A vulnerability allows crafted block attribute values to bypass server-side attribute escaping when an HTML entity is mixed with raw special characters. An attacker can embed a malicious IAL value inside a .sy document, package it as a .sy.zip, and have the victim import it through the normal Import -> SiYuan .sy.zip workflow. Once the note is opened, the malicious attribute breaks out of its original HTML context and injects an event handler, resulting in stored XSS. In the Electron desktop client, this XSS reaches remote code execution because injected JavaScript runs with access to Node/Electron APIs.

Details

The issue is caused by a logic regression in escapeNodeAttributeValues in kernel/filesys/tree.go.
Previously, the escaping logic converted node.KramdownIAL with parse.IAL2Map(...) before deciding whether a value needed escaping. That conversion unescaped existing entities first, so mixed values such as:

&" onmouseenter="alert('IAL-XSS')

were still recognized as unsafe and escaped correctly.
The logic changed to inspect raw KramdownIAL values directly. The new needsEscapeForValue implementation returns false as soon as it sees any known entity such as &, ", <, or >. This means a value containing both an entity and an unescaped raw quote bypasses escaping entirely.

That bypass becomes exploitable because the renderer later inserts block IAL values directly into HTML attributes. A payload like:

&" onmouseenter="require('child_process').exec('calc')

can be rendered into HTML equivalent to:

<div title="&" onmouseenter="require('child_process').exec('calc')">

This creates a stored XSS condition. In SiYuan Desktop, the Electron renderer runs with Node.js integration available, so attacker-controlled JavaScript can invoke Node APIs directly. As a result, the issue is not limited to script execution in the page context and becomes arbitrary command execution on the victim’s machine.

The stored XSS path was validated by importing a crafted .sy.zip through the normal GUI and triggering JavaScript execution from the rendered block. Because the same injected JavaScript runs in the privileged Electron renderer, this is an RCE issue in the desktop client.

PoC

  1. Start SiYuan Desktop v3.6.1.
  2. Prepare a crafted .sy.zip containing a .sy document with a block IAL property such as:
"title": "&\" onmouseenter=\"require('child_process').exec('calc')"
  1. In the UI, right-click any notebook.
  2. Select Import -> SiYuan .sy.zip.
  3. Import the crafted archive.
  4. Open the imported note.
  5. Move the mouse over the affected paragraph block.
  6. Observe that the injected JavaScript executes.
  7. On Windows, calc.exe launches, demonstrating arbitrary command execution.

Impact

This vulnerability allows an attacker to deliver a malicious .sy.zip file that executes attacker-controlled JavaScript after import. In the desktop application, that JavaScript runs with Node/Electron privileges and can execute arbitrary operating system commands under the victim’s account. This makes the bug equivalent to local code execution triggered by importing and opening attacker-supplied content.

基本情報

タイプ
reviewed
深刻度
high
GitHub 上のアドバイザリ
アドバイザリを開く ↗
リポジトリのアドバイザリ
リポジトリのアドバイザリを開く ↗
ソースコード
ソースを見る ↗
公開(アドバイザリ)
2026-04-01 00:05:11 UTC
更新
2026-04-06 16:40:20 UTC
GitHub レビュー済み
2026-04-01 00:05:11 UTC
NVD で公開
2026-03-31

EPSS Score

Score Percentile
0.07% 20.89%

CVSS Scores

Base score Version Severity Vector
8.6 3.1
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H クリックして展開
攻撃ベクター (AV:L)
対象ホスト上でコードを実行できること、または別ユーザーの誤操作・悪意ある操作が前提になる。
攻撃の複雑さ (AC:L)
攻撃者が条件を満たせば、レース条件や珍しい構成に依存せずに再現しやすい。
必要な権限 (PR:N)
事前のログインや昇格は不要で、匿名アクセスのまま踏み台にしうる。
ユーザーの関与 (UI:R)
インストールの許可、設定変更、悪意あるファイルの実行など、人の一度の判断がトリガーになる。
スコープ (S:C)
脆弱箇所を足がかりに、別コンポーネントや別権限域まで影響が広がりうる。
機密性への影響 (C:H)
広範な機微データの読み取りや持ち出しが現実的。
完全性への影響 (I:H)
権限の奪取や広範なログ改竄など、システムの信頼根拠を揺るがす改ざんが現実的。
可用性への影響 (A:H)
長時間のサービス停止、データ損壊による復旧不能に近い状態など、利用者に著しい不便を与えうる。

Identifiers

CWEs

CWE id Name
CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
CWE-94 Improper Control of Generation of Code ('Code Injection')

Credits

  • ngocnn97 (reporter)

Affected packages (1)

Vulnerable version ranges and first patched releases as published by GitHub.

Ecosystem Package Vulnerable range First patched Vulnerable functions
go github.com/siyuan-note/siyuan/kernel < 0.0.0-20260329142331-918d1bd9f967 0.0.0-20260329142331-918d1bd9f967

References

cvelogic Threat Intelligence