
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
वर्ग: विशेषाधिकार अवशेष (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 उस checkout को कॉल करते हैं। 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
इमेज mysql:26.7.0। प्रकाशित 127.0.0.1:18630। भूमिका rfile में FILE है। पीड़ित के पास 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_master_access(user->access) करना चाहिए जैसे SET ROLE NONE पहले से करता है। खाली ALL EXCEPT / DEFAULT को पिछला एकत्रित मैप नहीं रखना चाहिए।
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)sql/auth/sql_security_ctx.cc checkout_access_mapssql/auth/roles.cc activate_role_all / activate_role_none