
MySQL Community Server 26.7.0 - عالي - تجاوز سعة المكدس في mysqldump SHOW TABLES - تفريغ الأعطال UID
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-show-tables-overflow
الفئة: انهيار الوصول: عن بُعد
MySQL Community Server mysqldump 26.7.0 (06a5c1c) - Oracle
يقوم mysqldump الافتراضي بنسخ أسماء SHOW TABLES دون حدّ NAME_LEN. تُعيد getTableName صفًا خامًا من mysql_fetch_row. تقوم dump_all_tables_in_db بنسخ ذلك النص عبر my_stpcpy إلى hash_key[2*NAME_LEN+2]، وتكتبه quote_name في مخزن مؤقت على المكدس بحجم 387 بايت دون أي حدّ. خادم خبيث يردّ باسم جدول أطول من 192 بايت يُسقط عملية النسخ الاحتياطي (UID).
خادم mysqld حقيقي لن يُصدر معرّفات بهذا الطول. ما تبقّى هو ثقة العميل بالبروتوكول.
| المعرّف | لا يوجد CVE بعد |
| الفئة | انهيار (SIGSEGV في العميل؛ لم يُثبَت استغلال RCE) |
| الوصول | عن بُعد (الضحية تشغّل mysqldump ضد خادم MySQL مهاجم؛ UI:R) |
| CWE | CWE-120، CWE-121 |
| CVSS | مرتفع: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| المنتج | MySQL Community Server mysqldump |
| المتأثر | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| المصادقة | الضحية تشغّل mysqldump الافتراضي ضد خادم MySQL مهاجم |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط. إثبات الانهيار. لا حمولة RIP. |
أنشئ خادمًا يتحدث بروتوكول MySQL. أكمل المصافحة. ردّ على جلسات SET. عندما يرسل العميل 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 فارغة. صفوف CPU High Server لشهر يوليو 2026 مغلقة على هذا الإصدار. كانت أدوات العميل هي الفئة المتبقية، بنفس شكل 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 بايت. تكتب quote_name في dump_table إلى table_buff[NAME_LEN+3].
مسارات خاطئة مسجّلة مسبقًا: اعتبار mysqld حقيقي هو المرجع (لن يُصدر معرّفًا بطول 193 بايت)؛ اسم بحجم 4KiB تمتصّه real_columns[MAX_FIELDS] على نفس الإطار الذي يحوي hash_key؛ ترجمة ASan من شجرة الخادم الكاملة؛ وصف الانهيار بأنه تحكم بمؤشر التعليمات.
cd lab
./run.sh
الصورة mysql:26.7.0. خادم وهمي خبيث على compose stub:3306 (تحكم، جدول t) وstub:3307 (فيض، اسم بحجم 64KiB مع شاهد). منشور على 127.0.0.1:18600 / 18601. اربطه بواجهة loopback.
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 ويخرج بالرمز 2 عند SQL 1146. يموت الفيض مباشرة بعد show tables. لا يوجد LOCK TABLES على ذلك الاتصال.
حدّد getTableName عند NAME_LEN. أعطِ quote_name طول المخزن المؤقت وارفض الكتابة بعده. يجب أن يكون my_stpcpy إلى hash_key نسخًا محدودًا. اسم SHOW TABLES خبيث ليس جدولًا.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)getTableName، quote_name، dump_all_tables_in_dbNAME_LENmysql_list_tables