
SQLite 3.53.4 - عالي - محلي - انهيار - سلسلة COLLATE تتجاوز SQLITE_LIMIT_EXPR_DEPTH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
المقال: https://abraxaslabs.tech/research/sqlite-collate-depth
الفئة: انهيار النطاق: محلي
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69، SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
إجراء القواعد النحوية COLLATE لا يستدعي sqlite3ExprCheckHeight أبدًا. تُخصِّص sqlite3ExprAddCollateToken عقدة TK_COLLATE بينما تظل nHeight مساوية لـ 1، ثم تُعلِّق التعبير السابق على pLeft. تمر المعاملات العادية عبر sqlite3PExpr وتحصل على SQLITE_LIMIT_EXPR_DEPTH الموثَّق (القيمة الافتراضية 1000). أما هذا المعامل فلا.
لا يزال المُتجوِّل (walker) يعيد الاستدعاء الذاتي على كل pLeft. إن EP_Skip مخصص للـ affinity، وليس لـ sqlite3WalkExprNN. سلسلة من 50 عقدة تُرجع 1. وكذلك 8 آلاف و40 ألفًا، متجاوزةً حد العمق. أما 120 ألفًا فتُحدث تجاوزًا لسعة المكدس (stack-overflow) في sqlite3WalkExprNN تحت ASan (rc=134). ليس RCE.
الشجرة الأساسية هي https://sqlite.org/src. مستودع GitHub sqlite/sqlite هو نسخة Fossil مرآة. الأرشيف الرسمي sqlite-src-3530400. مكتبة في الملكية العامة. هذه الحزمة بترخيص AGPLv3.
| المعرّف | لا يوجد CVE بعد |
| الفئة | انهيار (تجاوز سعة المكدس في sqlite3WalkExprNN تحت ASan؛ لم يُثبَت RCE) |
| النطاق | محلي (SQL غير موثوق أو VIEW مزروعة) |
| CWE | CWE-674، CWE-770 |
| CVSS | مرتفع: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| المنتج | SQLite 3.53.4 |
| المتأثر | 3.53.4 (b09c88c)؛ من بقايا فحص ارتفاع COLLATE في trunk اللاحق |
| المصادقة | SQL غير موثوق أو VIEW؛ يبقى load_extension معطّلًا افتراضيًا |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18800 فقط. دمج ASan (amalgamation). شاهد الانهيار. |
يُمرِّر سلسلة COLLATE BINARY لاحقة طويلة كـ SQL، أو يزرعها في VIEW داخل ملف .db غير موثوق. يتجوّل عملية المضيف عبر السلسلة ويموت على مكدس C. حد عمق التعبير الموثَّق لا يُنفَّذ أبدًا على هذا المعامل.
SELECT 1 COLLATE BINARY COLLATE BINARY ... كافٍ. الشكل نفسه في CREATE VIEW v AS SELECT 1 COLLATE BINARY ... ثم SELECT * FROM v على اتصال جديد. يُبقي SQLITE_LIMIT_SQL_LENGTH الافتراضي (1e9) السلسلة البالغة ~1.8 ميغابايت التي أفاضت مكدسًا بحجم 8 ميغابايت في هذا المختبر.
هذا انهيار لعملية المُضمِّن (embedder). ليس تحكمًا في مؤشر التعليمات. يبقى load_extension معطّلًا.
عشرون عملية بحث في المصدر لوسم SQLite version-3.53.4 بعد OpenLiteSpeed. أحدث إصدار GA، وليس مسودة 3.54.0. يعامل sqlite.org/security.html كلاً من SQL غير الموثوق وملف .db غير الموثوق كمواطنين من الدرجة الأولى. load_extension معطّل افتراضيًا.
parse.y الخاص بـ COLLATE يتكوّن من ثلاثة أسطر:
expr(A) ::= expr(A) COLLATE ids(C). {
A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}
sqlite3ExprAddCollateToken يضبط pNew->pLeft = pExpr وEP_Collate|EP_Skip. ترك sqlite3ExprAlloc قيمة nHeight = 1. لا يوجد sqlite3ExprCheckHeight. يقوم sqlite3PExpr بكلا الأمرين لكل معامل ثنائي آخر.
مسارات خاطئة: اعتبار COLLATE بحجم 8k هو الانهيار (أعاد 1)؛ اعتبار 40k هو الانهيار (أعاد أيضًا 1، متجاوزًا بكثير SQLITE_LIMIT_EXPR_DEPTH 1000)؛ الحاجة إلى 120k قبل أن يموت ASan في sqlite3WalkExprNN.
هذا هو G1 من أربعة عشر عنصرًا متبقيًا على التثبيت. الأشقاء هم منشورات أخرى.
cd lab
./run.sh
دمج ASan من sqlite-src-3530400 الرسمي (استنساخ احتياطي للوسم version-3.53.4). تركيب sqlite-collate-depth. HTTP وهمي على 127.0.0.1:18800. اربطه بواجهة loopback.
SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS
50 COLLATE يعيد 1. و8k و40k يعيدان 1 أيضًا. 120k يفشل rc=134، تجاوز سعة المكدس في ASan داخل sqlite3WalkExprNN. فحص التثبيت هو SELECT sqlite_version() / SELECT sqlite_source_id().
استدعِ sqlite3ExprCheckHeight على عقدة COLLATE بعد إرفاق pLeft، بالطريقة التي يفعلها sqlite3PExpr بالفعل. أعد حساب nHeight من العقدة الفرعية. فالمعامل اللاحق لا يزال شجرة تعبير.
Trunk 252c0b7bf5 (2026-10-04) يأتي بعد هذا الإصدار العام.
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.ysqlite3ExprAddCollateToken وsqlite3ExprAlloc (nHeight = 1) وsqlite3PExpr / sqlite3ExprCheckHeight في src/expr.csqlite3WalkExprNN في src/walker.cSQLITE_MAX_EXPR_DEPTH الافتراضي 1000 في src/sqliteLimit.h