
SQLite 3.53.4 - عالي - محلي - تسريب معلومات - عدم تطابق حجم صفحة WAL/DB وذيل صفحة غير مهيأ
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-wal-pagesize
الفئة: تسريب معلومات النطاق: محلي
SQLite 3.53.4 (b09c88c) لا يزال يقرأ إطار WAL قراءةً ناقصة إلى صفحة pager كاملة دون تصفير الذيل بـ memset. يقبل walIndexRecover أي حجم صفحة WAL من قوى العدد اثنين ضمن [512, SQLITE_MAX_PAGE_SIZE] ولا يقارنه أبدًا بحجم صفحة قاعدة البيانات. ثم تُعيد فتحات pcache المُعاد تدويرها بايتات الكومة/الصفحة السابقة عبر SQL عادي.
المختبر: قاعدة .db بوضع WAL بحجم صفحة 4096، وملف -wal مرافق بحجم صفحة ترويسة 512، وأعاد SELECT b FROM t 2000 بايت. كان الذيل بعد الإطار ذي 512 بايت هو SQLITE-WAL-PAGESIZE-WITNESS. ليس RCE.
| المعرّف | لا يوجد CVE بعد |
| الفئة | تسريب معلومات (ذيل pager غير مُهيّأ عبر SQL) |
| النطاق | محلي (ملف .db غير موثوق مع -wal مرافق) |
| CWE | CWE-908، CWE-200 |
| CVSS | مرتفع: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| المنتج | SQLite (Hwaci) |
| المتأثر | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69)؛ SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc |
| المصادقة | لا شيء (الضحية يفتح ملفات المهاجم) |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18830 فقط |
إرسال قاعدة .db بوضع WAL مع ملف -wal مرافق يكون حجم صفحة ترويسته قوةً صحيحة أصغر من قاعدة البيانات. تقبل عملية الاسترداد ذلك. ينسخ sqlite3WalReadFrame حجم إطار WAL فقط إلى مخزن pager المؤقت بحجم مشتق من .db. تُلبّى خلية ورقة جدول تدّعي حِملًا أكبر من ذلك الإطار من ذيل pcache المُعاد تدويره. تُعيد SELECT / substr() / hex() على ذلك الـ blob بايتات pager/كومة متبقية من صفحات سابقة في العملية نفسها.
عدم التطابق العكسي (WAL أكبر من pager) يؤدي إلى SQLITE_CORRUPT عند نقطة التحقق. هذا المتبقي خاص بمسار القراءة عند WAL الأصغر فقط. ليس RCE.
عشرون عملية بحث في الشيفرة المصدرية لـ 3.53.4 بعد مصفوفة المتبقيات في الفرع الأحدث. أبلغت Winter عنه في المنتدى كـ 2026-08-17T15:54:41Z. الفرع الرئيسي f9b4ee3695 / الفرع 3.53 4fde87b2a0 (2026-08-16) يأتي بعد هذا الإصدار العام (2026-07-24). لا يزال sqlite3WalReadFrame عند هذه النقطة (nOut>sz ? sz : nOut) دون memset للذيل.
منعطف خاطئ: كانت خلية ورقة مبكرة مشوّهة وأعاد SELECT رمز SQLITE_CORRUPT rc=11. الخلية التي تعمل تدّعي 2000 بايت من الحِمل المحلي عبر إطار بحجم 512 بايت على صفحة pager بحجم 4096 بايت.
cd lab
./run.sh
يبني SQLite 3.53.4 من ملف المصدر المضغوط الرسمي. Compose sqlite-wal-pagesize. منشور على 127.0.0.1:18830. يهيّئ pcache بـ 48 صفًا شاهدًا بحجم 4000 بايت، ثم SELECT b FROM t على ورقة القراءة الناقصة.
SUCCESS sqlite-wal-pagesize how=wal-shortread-pcache-tail len=2000 rootpage=2 SQLITE-WAL-PAGESIZE-WITNESS
قارن حجم صفحة ترويسة WAL بحجم صفحة قاعدة البيانات أثناء الاسترداد. عند اختلافهما، ارفض WAL أو هيّئ صفحة pager بالكامل:
if( nOut>sz ){
memset(pOut+sz, 0, nOut-sz);
nOut = sz;
}
هذه القطعة موجودة في الفرع الرئيسي بعد هذا الإصدار العام. وهي غير موجودة في 3.53.4.
b09c88c14082339b66c7b7158d609a771e64ca69)src/wal.c sqlite3WalReadFrame، walIndexRecoversrc/pager.c readDbPage