
SQLite 3.53.4 - عالي - محلي - انهيار - سلسلة COLLATE تتجاوز SQLITE_LIMIT_EXPR_DEPTH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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. وكذلك 8k و40k، متجاوزةً حد العمق. 120k تُسبّب تجاوزًا لسعة المكدس (stack-overflow) في ASan داخل sqlite3WalkExprNN (rc=134). ليس RCE.
الشجرة الأساسية هي https://sqlite.org/src. مستودع GitHub sqlite/sqlite هو مرآة Fossil. الملف المضغوط الرسمي sqlite-src-3530400. مكتبة في الملكية العامة. هذه الحزمة بترخيص AGPLv3.
| ID | لا يوجد CVE بعد |
| الفئة | انهيار (تجاوز سعة المكدس في ASan داخل sqlite3WalkExprNN؛ لم يتم إثبات 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. شاهد الانهيار. |
قم بتغذية سلسلة 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 بكلا هذين الأمرين لكل معامل ثنائي آخر.
المنعطفات الخاطئة: اعتبار 8k COLLATE هو الانهيار (أرجع 1)؛ اعتبار 40k هو الانهيار (أرجع أيضًا 1، متجاوزًا بكثير SQLITE_LIMIT_EXPR_DEPTH 1000)؛ الحاجة إلى 120k قبل أن يموت ASan في sqlite3WalkExprNN.
هذا هو G1 من أربعة عشر من البقايا على الإصدار المثبّت. الأشقاء هم منشورات أخرى.
cd lab
./run.sh
دمج ASan من sqlite-src-3530400 الرسمي (استنساخ احتياطي للوسم version-3.53.4). Compose 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) يأتي بعد هذا الإصدار GA.
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y إجراء COLLATEsrc/expr.c sqlite3ExprAddCollateToken، sqlite3ExprAlloc (nHeight = 1)، sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c sqlite3WalkExprNNsrc/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH الافتراضي 1000