
SQLite 3.53.4 - عالي - محلي - انهيار - VALUES UNION ALL fallback cleanup stack overflow
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-values-union
المقال التقني: https://abraxaslabs.tech/research/sqlite-values-union
الفئة: انهيار النطاق: محلي
SQLite 3.53.4 (b09c88c) - Hwaci
يستخدم VALUES الافتراضي روتينًا مشتركًا (co-routine). أما WITH (أو إعادة تحميل المخطط، أو صف غير ثابت) فيجبر sqlite3MultiValues على استخدام UNION ALL. يتم تخطي فحص طول SELECT المركّب عند تعيين SF_Values (parse.y:562-567). عندئذٍ تُرفض قائمة الصفوف الكبيرة بما يكفي بواسطة SQLITE_LIMIT_EXPR_DEPTH، وتُفجّر الدالة العودية sqlite3ExprDeleteNN مكدس C في مسار تنظيف الأخطاء.
VALUES العادي المكوّن من 5000 صف لا مشكلة فيه. أما WITH مع 1000 صف فيُنتج خطأً نظيفًا (Expression tree is too large). وWITH مع 300000 صف يُنتج تجاوزًا لمكدس ASan في sqlite3ExprDeleteNN (rc=134). ليس RCE.
| المعرّف | لا يوجد CVE بعد |
| الفئة | انهيار (تجاوز مكدس ASan في ExprDelete؛ لم يُثبت RCE) |
| النطاق | محلي (SQL غير موثوق، أو VALUES داخل VIEW/TRIGGER) |
| 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 |
| المتأثر | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69، SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). بقايا حدّ VALUES المركّب في الفرع الرئيسي اللاحق. |
| المصادقة | SQL من المهاجم، أو مخطط مزروع يأخذ مسار UNION ALL الاحتياطي |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18820 فقط. دمج ASan. دليل الانهيار. |
تغذية SQL غير موثوق سيُحضّره مضيف. أضف بادئة WITH إلى قائمة VALUES ضخمة حتى يُعطّل مسار الروتين المشترك. يُفترض أن يفشل التحليل بخطأ عمق التعبير. لكن تنظيف تلك الشجرة يتكرر في sqlite3ExprDeleteNN حتى تموت العملية.
ينطلق المسار الاحتياطي نفسه عندما تكون VALUES داخل VIEW أو TRIGGER (db->init.busy). المضيف هو المُضمِّن: واجهة سطر أوامر، أو تطبيق يحضّر SQL المهاجم، أو خدمة تفتح ملف .db خبيثًا. لا تُقيّم SQLite بايتات VALUES كشيفرة. الانهيار هو النتيجة.
عشرون عملية بحث في المصدر لوسم github.com/sqlite/sqlite version-3.53.4. قائمة التخطي أغلقت بالفعل CVE-2026-11824، وsession NPD، وconcat_ws، وLOOKASIDE، وJSON UAF، وWAL-reset. load_extension الافتراضي معطّل. كانت بقايا المحلل/VDBE هي هذا التخطي لـ VALUES UNION ALL بالإضافة إلى مُدمِّر عودي.
if( (p->selFlags & (SF_MultiValue|SF_Values))==0
&& (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0
&& cnt>mxSelect
){
sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
}
if( pParse->bHasWith
|| pParse->db->init.busy
|| exprListIsConstant(pParse,pRow)==0
...
){
/* The co-routine method cannot be used. Fall back to UNION ALL. */
...
pSelect->op = TK_ALL;
pSelect->pPrior = pLeft;
}
clearSelect() يمشي عبر pPrior بشكل تكراري. لا يزال sqlite3ExprDeleteNN() يعاود الاستدعاء الذاتي على pRight وعلى pLeft عندما يكون EP_Static مضبوطًا.
المنعطفات الخاطئة: 1000 صف مع WITH يفشل بشكل نظيف عند حد العمق الموثّق ولا ينهار؛ احتجنا إلى 300000 صف حتى يتجاوز عمق المُدمِّر مكدس C البالغ 8 MiB. تبقى VALUES العادية على الـ co-routine وهي الضابط السلبي.
cd lab
./run.sh
ملف zip المصدر الأساسي 3.53.4، sqlite3 مع ASan. تركيبة sqlite-values-union. منشور على 127.0.0.1:18820. اربطه بواجهة loopback.
SUCCESS sqlite-values-union how=with-values-union-all-fallback-exprdelete rows=300000 crash=asan-stack-overflow plain=5000 depth-error=1000 SQLITE-VALUES-UNION-WITNESS
طبّق SQLITE_LIMIT_COMPOUND_SELECT على VALUES بالطريقة نفسها التي تُحدَّد بها المركّبات الأخرى. امشِ عبر سلسلة UNION ALL بشكل تكراري عند الحذف، أو حدّد EXPR_DEPTH قبل بناء الشجرة حتى لا يتمكن التنظيف من التكرار خارج مكدس C. الفرع الرئيسي اللاحق (Bug 2026-10-04T05:34:47Z) يأتي بعد هذا الإصدار GA.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 تخطي compound-SELECT عند تعيين SF_Valuessrc/insert.c:681-704 احتياطي UNION ALL في sqlite3MultiValuessrc/expr.c:1406-1430 الاستدعاء التكراري لـ sqlite3ExprDeleteNN