
SQLite 3.53.4 - عالي - محلي - انهيار - VALUES UNION ALL fallback cleanup stack overflow
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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؛ لم يُثبت تنفيذ عن بُعد) |
| الوصول | محلي (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 ميبيبايت. يبقى VALUES العادي على الروتين المساعد وهو الضابط السلبي.
cd lab
./run.sh
أرشيف المصدر القياسي 3.53.4، sqlite3 مع ASan. Compose 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) يأتي بعد هذا الإصدار العام.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 تخطي SELECT المركّب عند تعيين SF_Valuessrc/insert.c:681-704 المسار الاحتياطي UNION ALL في sqlite3MultiValuessrc/expr.c:1406-1430 الدالة العودية sqlite3ExprDeleteNN