
MySQL Community Server 26.7.0 - उच्च - mysqldump SHOW TABLES स्टैक ओवरफ़्लो - क्रैश डंप UID
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-show-tables-overflow
Class: Crash Reach: Remote
MySQL Community Server mysqldump 26.7.0 (06a5c1c) - Oracle
डिफ़ॉल्ट mysqldump SHOW TABLES नामों को बिना किसी NAME_LEN सीमा के कॉपी करता है। getTableName एक कच्चा mysql_fetch_row लौटाता है। dump_all_tables_in_db उस स्ट्रिंग को hash_key[2*NAME_LEN+2] में my_stpcpy करता है और quote_name उसे बिना किसी बाउंड के 387-बाइट स्टैक बफ़र में लिखता है। एक शत्रुतापूर्ण सर्वर जो 192 बाइट से लंबा टेबल नाम लौटाता है, डंप UID को क्रैश कर देता है।
एक वास्तविक mysqld इतने लंबे आइडेंटिफ़ायर नहीं देगा। बचा हुआ हिस्सा क्लाइंट का प्रोटोकॉल पर भरोसा करना है।
| ID | अभी तक कोई CVE नहीं |
| Class | Crash (क्लाइंट SIGSEGV; RCE प्रदर्शित नहीं) |
| Reach | Remote (पीड़ित हमलावर MySQL के विरुद्ध mysqldump चलाता है; UI:R) |
| CWE | CWE-120, CWE-121 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Product | MySQL Community Server mysqldump |
| Affected | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | पीड़ित हमलावर MySQL के विरुद्ध डिफ़ॉल्ट mysqldump चलाता है |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1। क्रैश साक्षी। कोई RIP पेलोड नहीं। |
एक MySQL-प्रोटोकॉल सर्वर खड़ा करें। हैंडशेक पूरा करें। सत्र के SETs का उत्तर दें। जब क्लाइंट show tables भेजता है, तो एक पंक्ति लौटाएँ जिसका नाम दसियों किलोबाइट लंबा हो।
जिस ऑपरेटर ने mysqldump testdb को उस होस्ट की ओर इंगित किया, वह डंप प्रक्रिया में एक स्टैक बफ़र को ओवरफ़्लो कर देता है। mysqldump Ver 26.7.0 पर लैब SIGSEGV है। विश्वसनीय इंस्ट्रक्शन-पॉइंटर नियंत्रण इस पैक का हिस्सा नहीं है। क्रैश है।
वही पीड़ित मॉडल जो एक बैकअप क्लाइंट को दुर्भावनापूर्ण सर्वर की ओर इंगित करने पर होता है। lock_tables --opt के माध्यम से डिफ़ॉल्ट है। ओवरफ़्लो उस पहले SHOW TABLES लूप में है।
मैंने https://github.com/mysql/mysql-server टैग https://github.com/mysql/mysql-server/tree/mysql-26.7.0 के इकतीस स्रोत शिकार चलाए। डिफ़ॉल्ट mysqld के अप्रकाशित Crit/High खाली वापस आए। जुलाई 2026 CPU High Server पंक्तियाँ इस पिन पर बंद हैं। क्लाइंट टूल्स बची हुई श्रेणी थे, उसी आकार के जैसे PostgreSQL pg_basebackup एक शत्रुतापूर्ण पथ का अनुसरण करता है।
static char *getTableName(int reset) {
static MYSQL_RES *res = nullptr;
MYSQL_ROW row;
if (!res) {
if (!(res = mysql_list_tables(mysql, NullS))) return (nullptr);
}
if ((row = mysql_fetch_row(res))) return ((char *)row[0]);
static char *quote_name(char *name, char *buff, bool force) {
char *to = buff;
const char qtype = ansi_quotes_mode ? '"' : '`';
if (!force && !opt_quoted && !test_if_special_chars(name)) return name;
*to++ = qtype;
while (*name) {
if (*name == qtype) *to++ = qtype;
*to++ = *name++;
}
NAME_LEN 64 * 3 = 192 है। hash_key 386 बाइट्स है। dump_table में quote_name table_buff[NAME_LEN+3] में लिखता है।
पहले से दर्ज गलत मोड़: एक वास्तविक mysqld को ओरेकल मानना (यह 193-बाइट आइडेंटिफ़ायर नहीं देगा); hash_key के समान फ़्रेम पर real_columns[MAX_FIELDS] द्वारा अवशोषित 4KiB नाम; पूर्ण सर्वर ट्री से ASan संकलित करना; क्रैश को इंस्ट्रक्शन-पॉइंटर नियंत्रण कहना।
cd lab
./run.sh
इमेज mysql:26.7.0। कंपोज़ stub:3306 (नियंत्रण, टेबल t) और stub:3307 (ओवरफ़्लो, 64KiB नाम सहित साक्षी) पर शत्रुतापूर्ण स्टब। प्रकाशित 127.0.0.1:18600 / 18601। इसे लूपबैक पर बाइंड करें।
control-rc=2 control-signal=0
overflow-rc=139 overflow-signal=SIGSEGV
SUCCESS mysql-mysqldump-show-tables-overflow ... MYSQL-DUMP-SHOW-TABLES-OVERFLOW-WITNESS
नियंत्रण एक 26.7.0 डंप हेडर प्रिंट करता है और SQL 1146 पर 2 के साथ बाहर निकलता है। ओवरफ़्लो show tables के ठीक बाद मर जाता है। उस कनेक्शन पर कोई LOCK TABLES नहीं।
getTableName को NAME_LEN पर सीमित करें। quote_name को एक बफ़र लंबाई दें और उससे आगे लिखने से इनकार करें। hash_key में my_stpcpy एक बाउंडेड कॉपी होना चाहिए। एक शत्रुतापूर्ण SHOW TABLES नाम एक टेबल नहीं है।
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)getTableName, quote_name, dump_all_tables_in_dbNAME_LENmysql_list_tables