
SQLite 3.53.4 - عالي - محلي - انهيار - CTEs المتداخلة تتجاوز الحد الأقصى لعمق عرض nNestSel
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-cte-nest
التحليل المكتوب: https://abraxaslabs.tech/research/sqlite-cte-nest
الفئة: انهيار الوصول: محلي
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69، SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
تقوم sqlite3ResultSetOfSelect بزيادة nNestSel وإصدار الخطأ VIEWs and/or subqueries nested too deep عندما تصل السلسلة إلى SQLITE_LIMIT_EXPR_DEPTH. إن الـ VIEWs المتداخلة على هذا الإصدار المثبّت تصل بالفعل إلى هذا الحد الأقصى. أما ربط الـ CTE عند select.c:5754 (sqlite3SrcItemAttachSubquery) فلا يزيد nNestSel. بعد ذلك تقوم selectExpander / sqlite3WalkSelect بالاستدعاء التكراري لسلسلة الـ CTE حتى ينفد مكدس C.
سلسلة CTE صغيرة تُرجع صفًا. أما FROM المتداخل عند N=25000 فهو خطأ محلل Recursion limit ولا يسبب انهيارًا. الـ VIEWs المتداخلة عند .limit expr_depth 20 تُصدر خطأ too-deep. أما CTE عند N=25000 فهو ASan stack-overflow. ليس RCE.
| المعرّف | لا يوجد CVE بعد |
| الفئة | انهيار (ASan stack-overflow في selectExpander؛ لم يُثبَت RCE) |
| الوصول | محلي (SQL غير موثوق أو مخطط CTE متداخل) |
| CWE | CWE-674 |
| CVSS | مرتفع: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| المنتج | SQLite (مرآة GitHub sqlite/sqlite) |
| المتأثر | 3.53.4 (b09c88c)؛ بقايا nNestSel للـ CTE في trunk اللاحق |
| المصادقة | SQL غير موثوق أو سلسلة WITH مزروعة |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18810 فقط. دمج ASan. شاهد الانهيار. |
تغذية سلسلة CTE طويلة، سواء كـ SQL أو كجسم VIEW على ملف .db غير موثوق:
WITH c0 AS (SELECT 1),
c1 AS (SELECT * FROM c0),
...
cN AS (SELECT * FROM cN-1)
SELECT * FROM cN;
selectExpander يمرّ عبر كل CTE كاستعلام فرعي FROM متداخل. لا يتحرك nNestSel أبدًا. تموت العملية المضيفة على مكدس C. عروض VIEW المتداخلة محدودة مسبقًا. الوصول إلى FROM المتداخل يصطدم بحدّ التكرار في المحلّل. هذه البقايا هي مسار إرفاق CTE. لا يقوم SQLite بتقييم أسماء CTE في صدفة. انهيار، وليس RCE.
عشرون عملية بحث في المصدر لـ https://github.com/sqlite/sqlite وسم https://github.com/sqlite/sqlite/releases/tag/version-3.53.4. كانت عروض VIEW المتداخلة محدودة على هذا التثبيت (3f3fb9b638 / branch-3.53 38430aa5ed، 2026-06-16). أما إرفاق CTE فلم يكن كذلك. الفرع الرئيسي f547308713 (2026-10-05) يأتي بعد هذا الإصدار العام.
مسارات خاطئة مسجّلة سلفًا: اعتبار عروض VIEW المتداخلة هي الانهيار (فهي تُخطئ بعمق مفرط)؛ اعتبار FROM المتداخل N=25000 هو الانهيار (المحلّل Recursion limit)؛ اعتبار سلسلة من 5 CTE دليلًا على انطباق الحد.
cd lab
./run.sh
ملف sqlite-src-3530400 zip الرسمي، دمج ASan، تركيب sqlite-cte-nest، منشور على 127.0.0.1:18810. اربطه بواجهة الاسترجاع (loopback). لا توجّه هذا إلى SQLite الخاص بأي شخص آخر.
SUCCESS sqlite-cte-nest how=asan-stack-overflow crash-n=25000 small-cte=ok nested-views=too-deep nested-from=rejected SQLITE-CTE-NEST-WITNESS
قم بزيادة nNestSel عند إرفاق CTE بالطريقة التي يفعلها sqlite3ResultSetOfSelect بالفعل مع VIEWs، وأصدر خطأً عند SQLITE_LIMIT_EXPR_DEPTH. يُعدّ الفرع الرئيسي f547308713 (2026-10-05، "Limit the depth of recursion for CTEs using SQLITE_LIMIT_EXPR_DEPTH") من هذا النوع من التصحيحات. وهو غير موجود في 3.53.4.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/select.c sqlite3ResultSetOfSelect (nNestSel++)، إرفاق CTE :5754src/walker.c sqlite3WalkSelectFrom اجتياز الاستعلام الفرعيselectExpander / sqlite3SelectExpand2026-10-04T04:58:58Z؛ الفرع الرئيسي f547308713