
SQLite 3.53.4 - उच्च - स्थानीय - सूचना लीक - WAL/DB पृष्ठ-आकार बेमेल अनइनिशियलाइज़्ड पृष्ठ टेल
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-wal-pagesize
वर्ग: सूचना लीक पहुँच: स्थानीय
SQLite 3.53.4 (b09c88c) अभी भी एक WAL फ़्रेम को बिना टेल memset के पूर्ण पेजर पेज में शॉर्ट-रीड करता है। walIndexRecover [512, SQLITE_MAX_PAGE_SIZE] में किसी भी पावर-ऑफ़-टू WAL पेज साइज़ को स्वीकार करता है और इसे डेटाबेस पेज साइज़ से कभी तुलना नहीं करता। पुनर्चक्रित pcache स्लॉट तब सामान्य SQL के माध्यम से पूर्व heap/page बाइट्स लौटाते हैं।
लैब: 4096-पेज WAL-मोड .db, सहोदर -wal हेडर पेज साइज़ 512, SELECT b FROM t ने 2000 बाइट्स लौटाए। 512-बाइट फ़्रेम के आगे का टेल SQLITE-WAL-PAGESIZE-WITNESS था। RCE नहीं।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | सूचना लीक (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 |
एक WAL-मोड .db और सहोदर -wal भेजें जिसका हेडर पेज साइज़ डेटाबेस से छोटा वैध पावर-ऑफ़-टू हो। रिकवरी इसे स्वीकार करती है। sqlite3WalReadFrame केवल WAL फ़्रेम साइज़ को .db से आकारित पेजर बफ़र में कॉपी करता है। एक टेबल-लीफ़ सेल जो उस फ़्रेम से बड़ा पेलोड दावा करती है, पुनर्चक्रित pcache टेल से संतुष्ट होती है। उस ब्लॉब पर SELECT / substr() / hex() उसी प्रक्रिया में पूर्व पेजों से बचे पेजर/heap बाइट्स लौटाता है।
विपरीत बेमेल (पेजर से बड़ा WAL) चेकपॉइंट पर SQLITE_CORRUPT है। यह अवशेष केवल छोटे-WAL रीड पथ का है। RCE नहीं।
बाद के-ट्रंक अवशेष मैट्रिक्स के बाद 3.53.4 की बीस स्रोत खोजें। Winter ने इसे फ़ोरम पर 2026-08-17T15:54:41Z के रूप में रिपोर्ट किया। ट्रंक f9b4ee3695 / branch-3.53 4fde87b2a0 (2026-08-16) इस GA (2026-07-24) के बाद है। इस पिन पर sqlite3WalReadFrame अभी भी (nOut>sz ? sz : nOut) है, टेल का कोई memset नहीं।
गलत मोड़: एक प्रारंभिक लीफ़ सेल विकृत थी और SELECT ने SQLITE_CORRUPT rc=11 लौटाया। जो सेल काम करती है वह 4096-बाइट पेजर पेज पर 512-बाइट फ़्रेम के आर-पार 2000 बाइट्स स्थानीय पेलोड दावा करती है।
cd lab
./run.sh
कैनोनिकल स्रोत ज़िप से SQLite 3.53.4 बनाता है। sqlite-wal-pagesize कंपोज़ करें। 127.0.0.1:18830 पर प्रकाशित। 48x4000-बाइट विटनेस पंक्तियों से pcache प्राइम करता है, फिर शॉर्ट-रीड लीफ़ पर SELECT b FROM t।
SUCCESS sqlite-wal-pagesize how=wal-shortread-pcache-tail len=2000 rootpage=2 SQLITE-WAL-PAGESIZE-WITNESS
रिकवरी के दौरान WAL हेडर पेज साइज़ की डेटाबेस पेज साइज़ से तुलना करें। जब वे असहमत हों, WAL को अस्वीकार करें या पेजर पेज को पूरी तरह इनिशियलाइज़ करें:
if( nOut>sz ){
memset(pOut+sz, 0, nOut-sz);
nOut = sz;
}
वह हंक इस GA के बाद ट्रंक पर है। यह 3.53.4 में नहीं है।
b09c88c14082339b66c7b7158d609a771e64ca69)src/wal.c sqlite3WalReadFrame, walIndexRecoversrc/pager.c readDbPage