
SQLite 3.53.4 - عالي - محلي - كتابة خارج الحدود في الكومة - نمو nCol بنفس الاسم في مجموعة تغييرات الجلسة
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-session-ncol
المقال التقني: https://abraxaslabs.tech/research/sqlite-session-ncol
الفئة: كتابة خارج حدود الذاكرة في الكومة (heap OOB write) نطاق الوصول: محلي
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69، SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) مع -DSQLITE_ENABLE_SESSION. مجموعة تغييرات (changeset) من كتلتين تعيد استخدام اسم الجدول t بـ nCol=2 ثم nCol=64، فتتجاوز إعادة تعيين sessionTableInfo (sqlite3session.c:5619) وتنفّذ memset يتجاوز aUpdateMask الخاص بالكتلة الأولى. كتابة ASan بحجم 12 في sessionUpdateFind. الضابط: تطبيق UPDATE واحد بعمودين apply-rc=0.
ليست ضمن الدمج الافتراضي (amalgamation) ما لم يكن SESSION مفعّلًا. ثغرة CVE-2026-50812 من نوع NPD مغلقة في 3.53.2+. ليست حمولة RCE مسلّحة. الدليل هو كتابة ASan.
| المعرّف | لا يوجد CVE بعد |
| الفئة | كتابة خارج حدود الذاكرة في الكومة (كتابة ASan بحجم 12؛ لم يُثبت RCE) |
| نطاق الوصول | محلي (changeset غير موثوق عبر sqlite3changeset_apply*) |
| CWE | CWE-787 |
| CVSS | مرتفع: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| المنتج | SQLite إضافة Session (Hwaci) |
| المتأثر | 3.53.4 (b09c88c) مُجمّع بـ -DSQLITE_ENABLE_SESSION |
| المصادقة | يطبّق المضيف changeset غير موثوق |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18900 فقط. دليل كتابة ASan بحجم 12. |
تطبيق changeset غير موثوق تكون كتلة جدوله الثانية تعيد استخدام اسم جدول مع nCol أكبر. كتابة خارج حدود الذاكرة في الكومة. إضافة تجميع. ليست ضمن الدمج الافتراضي ما لم يكن SESSION مفعّلًا.
الكتلة الأولى تخصّص aUpdateMask من pIter->nCol. الكتلة اللاحقة ذات الاسم نفسه تتجاوز إعادة تعيين sessionTableInfo وتنفّذ memset بقناع أكبر فوق التخصيص القديم. المختبر: nCol=2 ثم nCol=64 عبر UPDATE. كتابة ASan بحجم 12 في sessionUpdateFind. الضابط: تطبيق UPDATE واحد بعمودين apply-rc=0.
لا تتعامل مع هذه الحزمة كأداة كتابة-أين-شئت (write-what-where). كتابة ASan بحجم 12 هي الدليل.
عشرون عملية بحث في مصدر SQLite 3.53.4 بعد موجة FTS5 / session-NPD في 3.53.2. ثغرة CVE-2026-50812 مغلقة (sessionBindRow يعامل القيمة المفقودة كـ SQLITE_CORRUPT). لا يزال Session يعتمد على اسم الجدول فقط في SessionApplyCtx. كتلة ثانية بالاسم نفسه مع عدد أعمدة معلن أكبر تعيد استخدام aUpdateMask.
مسارات خاطئة مسجّلة مسبقًا: اعتبار الدمج الافتراضي ضمن النطاق (SESSION معطّل)؛ إعادة تقديم CVE-2026-50812؛ إرسال كتلة جدول واحدة بـ nCol=64 مقابل مخطط بعمودين (schemaMismatch، لا كتابة)؛ الادعاء بوجود RCE من memset بحجم 12 بايت.
cd lab
./run.sh
تم دمج ASan من ملف sqlite-src-3530400 الرسمي بصيغة zip. ترجمة إضافية باستخدام -DSQLITE_ENABLE_SESSION و-DSQLITE_ENABLE_PREUPDATE_HOOK. فحص السلامة على 127.0.0.1:18900. اربطه بواجهة loopback.
SUCCESS sqlite-session-ncol how=asan-heap-write-sessionUpdateFind write-size=12 control-apply-rc=0 SQLITE-SESSION-NCOL-WITNESS
عندما تعيد كتلة جدول changeset لاحقة استخدام اسم ما، أعد بناء SessionApplyCtx بالطريقة التي يفعلها الاسم الجديد بالفعل: حرّر aUpdateMask، وأعد تشغيل sessionTableInfo، وارفض nCol أكبر من المخطط الحي. إن Trunk 3f57024aec / branch-3.53 a1dd7123d8 (2026-08-17) يأتي بعد هذا الإصدار GA.
b09c88c14082339b66c7b7158d609a771e64ca69)sessionChangesetApply :5619، sessionUpdateFind :4381-4412