
MySQL Community Server 26.7.0 - उच्च - SET ROLE ALL EXCEPT शेष FILE - mysqld UID लेखन
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-set-role-leftover
राइट-अप: https://abraxaslabs.tech/research/mysql-set-role-leftover
वर्ग: विशेषाधिकार अवशेष (mysqld UID के रूप में FILE; OS LPE नहीं) पहुँच: रिमोट
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
SET ROLE ALL EXCEPT rfile (या डिफ़ॉल्ट के बिना SET ROLE DEFAULT) सक्रिय-भूमिका सूची को साफ़ करता है, फिर checkout_access_maps() set_master_access(user->access) के बिना लौटता है। CURRENT_ROLE() NONE है। वे स्थिर वैश्विक बिट्स जिन्हें भूमिका ने एकत्र किया था (FILE, PROCESS, SUPER, ...) m_master_access में बने रहते हैं। check_access उसी अवशेष को पढ़ता है। लैब: अवशेष FILE, mysqld UID के रूप में INTO OUTFILE लिखता है।
SET ROLE NONE वह पथ है जो ACL_USER::access को पुनर्स्थापित करता है। गतिशील विशेषाधिकार (SYSTEM_USER) हट जाते हैं। DB-स्तरीय अवशेष पहले ही बंद हो चुका है (Bug#35386565)। डिफ़ॉल्ट खातों में कोई भूमिका नहीं होती।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | विशेषाधिकार अवशेष (mysqld UID के रूप में FILE; OS LPE नहीं) |
| पहुँच | रिमोट (प्रमाणित SQL) |
| CWE | CWE-269 |
| CVSS | उच्च: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| उत्पाद | MySQL Community Server mysqld |
| प्रभावित | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| प्रमाणीकरण | प्रमाणित; पीड़ित को एक भूमिका दी गई है जो स्थिर वैश्विक ACL रखती है (लैब में FILE) |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1। साक्षी फ़ाइल। अवशेष FILE लेखन। |
ऐसा खाता रखें जिसे FILE (या कोई अन्य स्थिर वैश्विक बिट) वाली भूमिका दी गई हो। उस भूमिका पर SET ROLE करें, फिर उसे SET ROLE ALL EXCEPT करें। CURRENT_ROLE() NONE बताता है। SELECT 'witness' INTO OUTFILE अभी भी secure_file_priv के अंतर्गत mysqld UID के रूप में लिखता है।
जो एप्लिकेशन SET ROLE ALL EXCEPT dangerous_role या SET ROLE DEFAULT से सैंडबॉक्स बनाता है और फिर CURRENT_ROLE() पर भरोसा करता है, उसके पास अभी भी वे स्थिर बिट्स होते हैं। SET ROLE NONE वास्तव में उन्हें हटा देता है।
अवशेष उस खाते को FILE नहीं देता जो उसने कभी किसी भूमिका के माध्यम से नहीं रखा था। यह निष्क्रियता के बाद FILE को हटाने में विफल रहता है।
तीन क्लाइंट अवशेषों की तरह ही 26.7.0 की खोज। डिफ़ॉल्ट डेमॉन के अप्रकाशित Crit/High खाली थे। ACL / भूमिकाओं में अभी भी यह खाली-भूमिका वाला अर्ली रिटर्न था।
void Security_context::checkout_access_maps(void) {
if (m_acl_map != nullptr) {
get_global_acl_cache()->return_acl_map(m_acl_map);
m_acl_map = nullptr;
}
if (m_active_roles.size() == 0) return;
// ...
}
activate_role_all (ALL EXCEPT) और खाली activate_role_default उस चेकआउट को कॉल करते हैं। फिर activate_role_none set_master_access(user->access) करता है।
पहले से दर्ज गलत मोड़: पहला बचा हुआ SELECT note FROM lab.t INTO OUTFILE ने 1142 लौटाया (db_acl() कैश 0)। स्थिर SELECT 'witness' INTO OUTFILE ही FILE ऑरेकल है।
cd lab
./run.sh
Image mysql:26.7.0. प्रकाशित 127.0.0.1:18630. भूमिका rfile में FILE है। Victim के पास GRANT SELECT ON lab.* और GRANT rfile, file_priv=N, कोई डिफ़ॉल्ट भूमिका नहीं। लॉगिन outfile 1227. SET ROLE rfile outfile ठीक। SET ROLE ALL EXCEPT rfile CURRENT_ROLE() को NONE बनाता है; शेष outfile /var/lib/mysql-files/MYSQL-SET-ROLE-LEFTOVER-WITNESS लिखता है। SET ROLE NONE फिर से 1227 है।
SUCCESS mysql-set-role-leftover before-file=denied with-role=yes leftover-role=NONE leftover-file=yes after-none=denied dump=26.7.0 image=mysql:26.7.0 MYSQL-SET-ROLE-LEFTOVER-WITNESS
जब m_active_roles खाली हो, तो checkout_access_maps() को SET ROLE NONE की तरह ही set_master_access(user->access) करना चाहिए। खाली ALL EXCEPT / DEFAULT को पिछला एकत्रित मैप नहीं रखना चाहिए।
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)sql/auth/sql_security_ctx.cc checkout_access_mapssql/auth/roles.cc activate_role_all / activate_role_none