
SQLite 3.53.4 - عالي - محلي - تسريب معلومات - عدم تطابق حجم صفحة WAL/DB وذيل صفحة غير مهيأ
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-wal-pagesize
المقال: https://abraxaslabs.tech/research/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 عند نقطة التحقق (checkpoint). هذا المتبقي يخص مسار القراءة ذا WAL الأصغر فقط. ليس RCE.
عشرون عملية بحث في الشيفرة المصدرية لـ 3.53.4 بعد مصفوفة المتبقيات في الفرع الرئيسي اللاحق. أبلغ عنه Winter في المنتدى باسم 2026-08-17T15:54:41Z. الفرع الرئيسي f9b4ee3695 / branch-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 من ملف zip المصدر الرسمي. يُركّب 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;
}
هذا الجزء موجود على الفرع الرئيسي بعد هذا الإصدار GA. وهو غير موجود في 3.53.4.
b09c88c14082339b66c7b7158d609a771e64ca69)src/wal.c sqlite3WalReadFrame، walIndexRecoversrc/pager.c readDbPage