
SQLite 3.53.4 - उच्च - स्थानीय - विशेषाधिकार अवशेष - FULL JOIN USING sqlite3AuthRead को छोड़ देता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-fj-using-auth
Class: Privilege leftover Reach: Local
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 कॉलबैक नहीं मिलता। एक embedder जिसने 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 नहीं |
| Class | Privilege leftover (कॉलम-स्तरीय authorizer स्किप) |
| Reach | Local (embedder sqlite3_set_authorizer; हमलावर SQL) |
| CWE | CWE-863, CWE-284 |
| CVSS | High: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Product | SQLite (GitHub मिरर sqlite/sqlite) |
| Affected | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69)। केवल 3.54 में मौजूद authorizer FULL JOIN USING फिक्स (2cb2287768) इस GA पर नहीं है। |
| Auth | embedder ने sqlite3_set_authorizer इंस्टॉल किया; डिफ़ॉल्ट कॉलबैक NULL है |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:18840। Witness स्ट्रिंग। RCE नहीं। |
एक embedder के विरुद्ध जिसने कॉलम 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 तब तक बंद रहता है जब तक embedder इसे इंस्टॉल न करे। डिफ़ॉल्ट sqlite3_open इस अवशेष से प्रभावित नहीं है। RCE नहीं।
PHP के बाद 3.53.4 की बीस स्रोत खोजें। Skip सूची में पहले से ही 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 बेसलाइन 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
coalesce रीराइट के बाद प्रत्येक pFJMatch चाइल्ड पर sqlite3AuthRead को लूप करें, जैसा कि trunk 2cb2287768 / Git 5694c3bb 3.54 के लिए करता है। केवल a[0] (bbd69ce274) को अधिकृत करना पर्याप्त नहीं है। LEFT JOIN USING और FULL JOIN ON पहले से ही अधिकृत करते हैं; वे इस अवशेष का हिस्सा नहीं हैं।
b09c88c14082339b66c7b7158d609a771e64ca69)src/resolve.c lookupName coalesce रीराइट और AuthRead गेटsrc/auth.c sqlite3AuthRead / sqlite3AuthReadCol