# 思源笔记 `setBlockAttrs` 图标属性存储型XSS/RCE漏洞
## 概述
SiYuan 是一个个人知识管理系统。在 3.5.4 之前版本中存在存储型跨站脚本(XSS)漏洞,攻击者可通过 `/api/attr/setBlockAttrs` API 向区块的 `icon` 属性注入任意 HTML 属性。
## 影响版本
3.5.4 之前的所有版本。
## 细节
攻击者可利用 `/api/attr/setBlockAttrs` 接口在区块的 `icon` 属性中注入恶意 HTML 属性。该 payload 会在动态图标功能中被直接渲染,且未经过充分的输入过滤与输出编码。
此漏洞绕过了此前针对 issue `#15970`(通过动态图标实现 XSS → RCE)所实施的修复措施。
## 影响
导致存储型 XSS。在桌面环境中,可进一步利用该漏洞实现远程代码执行(RCE)。
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: Stored XSS / RCE via `setBlockAttrs` icon attribute (bypass of dynamic icon XSS fix #15970) · Advisory · siyuan-note/siyuan · GitHub -- 🔗来源链接
标签:x_refsource_CONFIRM
神龙速读:
### 关键漏洞信息
- **漏洞类型**: 存储型XSS / RCE
- **影响版本**: <=v3.5.3
- **修复版本**: v3.5.4
- **CVE ID**: CVE-2026-23852
- **严重性**: 高
### 漏洞描述
- **摘要**
- SiYuan中存在存储型XSS漏洞,允许攻击者通过`/api/attr/setBlockAttrs` API 将任意HTML属性注入块的`icon`属性中。不在适当的上下文中渲染payload后,在动态图标特性中可能导致存储型XSS和潜在的远程代码执行(RCE)。
- **细节**
- `/api/attr/setBlockAttrs`端点接受攻击者控制的数据在`attrs.icon`字段
- 静态图标存储在块里并会在按需加载时插入到HTML的属性上下文中。如果未进行适当转码,攻击者可利用故意插入的某些属性执行任意脚本。
- 该问题为之前修复过的原动态图标问题的变体,之前的修复成功限制客户端,但变动API仍然可到达此sink 因此该问题是一个可绕过修复/回归错误。
### 影响
- **存储XSS**: 任何查看受影响块的用户都会触发攻击者控制的JavaScript
- **桌面RCE**: 在桌面应用中,XSS可被升级为任意命令执行
- **攻击先决条件**: 对API和块属性的写入权限(直接写或者间接调用`setBlockAttrs`函数)
### 操纵代码样例
```javascript
POST /api/attr/setBlockAttrs HTTP/1.1
Host: localhost:8006
Content-Type: application/json
{
"id": "<BLOCK_ID>",
"attrs": {
"icon": "api/icon/getDynamicIcon\" onload=\"alert(document.domain)"
}
}
```
### 影响评估
- 存储型XSS 可能导致远程代码执行的潜在问题。 需要将其视为#15970的修复绕过问题 并分配新的CVE编号
标题: :lock: Fix https://github.com/siyuan-note/siyuan/security/advisories/… · siyuan-note/siyuan@0be7e1d · GitHub -- 🔗来源链接
标签:x_refsource_MISC
神龙速读:
- **漏洞相关信息:**
- **Commit Message**: 修复了漏洞 GHSA-7c6g-g2hx-23vv。
- **修复内容**:在 `app/src/emoji/index.ts` 文件中添加了两次 `Lute.Sanitize(emoji)`,对生成的 `img` 标签进行了安全处理,防止潜在的XSS攻击。
- **修复原因**: 通过调用 `Lute.Sanitize` 方法对 `emoji` 变量进行安全过滤,避免了直接将未处理的字符串嵌入到 `src` 属性中,从而防止了可能的跨站脚本攻击(XSS)。
暂无评论