
SQLite 3.53.4 - उच्च - स्थानीय - विशेषाधिकार अवशेष - FULL JOIN USING sqlite3AuthRead को छोड़ देता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fj-using-auth
राइट-अप: https://abraxaslabs.tech/research/sqlite-fj-using-auth
वर्ग: विशेषाधिकार अवशेष पहुँच: स्थानीय
SQLite 3.53.4 (b09c88c / SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
lookupName() एक FULL JOIN USING कॉलम को coalesce(...) (TK_FUNCTION) में बदल देता है। sqlite3AuthRead केवल TK_COLUMN / TK_TRIGGER के लिए चलता है, इसलिए USING कॉलम को कभी SQLITE_READ कॉलबैक नहीं मिलता। जिस एम्बेडर ने sqlite3_set_authorizer इंस्टॉल किया है और t2.x पर READ को DENY/IGNORE करता है, वह भी SELECT x FROM t1 FULL JOIN t2 USING(x) के माध्यम से वह कॉलम प्राप्त कर लेता है।
डिफ़ॉल्ट ओपन पर Authorizer बंद रहता है। यह उस C API का अवशेष है। RCE नहीं है। FULL JOIN ON और LEFT JOIN USING अस्वीकृत / लीक-रहित रहते हैं। स्पष्ट coalesce(t2.x) अभी भी अधिकृत होता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | विशेषाधिकार अवशेष (कॉलम-स्तरीय authorizer छूट) |
| पहुँच | स्थानीय (एम्बेडर sqlite3_set_authorizer; हमलावर SQL) |
| CWE | CWE-863, CWE-284 |
| CVSS | उच्च: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| उत्पाद | SQLite (GitHub मिरर sqlite/sqlite) |
| प्रभावित | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69)। केवल 3.54 में उपलब्ध authorizer FULL JOIN USING फ़िक्स (2cb2287768) इस GA पर नहीं है। |
| प्रमाणीकरण | एम्बेडर ने sqlite3_set_authorizer इंस्टॉल किया; डिफ़ॉल्ट कॉलबैक NULL है |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1:18840। साक्षी स्ट्रिंग। RCE नहीं। |
उस एम्बेडर के विरुद्ध जिसने कॉलम ACL के रूप में sqlite3_set_authorizer इंस्टॉल किया है, SELECT x FROM t1 FULL JOIN t2 USING(x) (या NATURAL FULL JOIN) तैयार करें। सादा SELECT x FROM t2 अस्वीकृत होता है (SQLITE_AUTH 23)। FULL JOIN USING रूप READ-अस्वीकृत कॉलम लौटा देता है। शून्य READ t2.x कॉलबैक सक्रिय होते हैं।
Authorizer तब तक बंद रहता है जब तक एम्बेडर इसे इंस्टॉल न करे। डिफ़ॉल्ट sqlite3_open इस अवशेष से प्रभावित नहीं है। RCE नहीं है।
PHP के बाद 3.53.4 की बीस स्रोत खोजें। स्किप सूची में पहले से ही 3.54 FULL JOIN USING authorizer चेक-इन का नाम था। यह नवीनतम GA पर अभी भी अनुपस्थित है। lookupname_end पर pExpr->op TK_FUNCTION है, इसलिए AuthRead गेट कभी नहीं चलता। WRC_Prune वॉकर को coalesce आर्ग्युमेंट्स में उतरने से भी रोक देता है।
lookupname_end:
if( cnt==1 ){
#ifndef SQLITE_OMIT_AUTHORIZATION
if( pParse->db->xAuth
&& (pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER)
){
sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList);
}
#endif
गलत मोड़ पहले ही दर्ज किए जा चुके हैं: authorizer को डिफ़ॉल्ट-ऑन मानना; LEFT JOIN USING या FULL JOIN ON से लीक होने की अपेक्षा करना; स्पष्ट coalesce(t2.x) से AuthRead छूट जाने की अपेक्षा करना; 3.54.0 को पिन करना जबकि वह अभी ड्राफ़्ट में था।
cd lab
./run.sh
आधिकारिक sqlite-src-3530400 amalgamation बनाता है। Harness lab/auth.c है। Loopback 127.0.0.1:18840। Authorizer DENY READ t2.x। SELECT x FROM t2 अस्वीकृत। SELECT x FROM t1 FULL JOIN t2 USING(x) witness लौटाता है, 0 READ t2.x। FULL JOIN ON अस्वीकृत। LEFT JOIN USING में कोई लीक नहीं। IGNORE baseline NULL है; IGNORE FULL JOIN USING अभी भी लीक करता है।
SUCCESS sqlite-fj-using-auth how=full-join-using-skip-authread baseline=denied fj-using=witness fj-on=denied left-using=no-leak SQLITE-FJ-USING-AUTH-WITNESS
कोलेस्क रीराइट के बाद प्रत्येक pFJMatch चाइल्ड पर sqlite3AuthRead को लूप करें, जैसे ट्रंक 2cb2287768 / Git 5694c3bb 3.54 के लिए करता है। केवल a[0] (bbd69ce274) को अधिकृत करना पर्याप्त नहीं है। LEFT JOIN USING और FULL JOIN ON पहले से ही अधिकृत करते हैं; वे यह शेष नहीं हैं।
b09c88c14082339b66c7b7158d609a771e64ca69)src/resolve.c lookupName कोलेस्क रीराइट और AuthRead गेटsrc/auth.c sqlite3AuthRead / sqlite3AuthReadCol