MySQL Community Server 26.7.0 — высокий — остаточный путь mysqldump --tab — запись файла клиентом
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-tab-path
Класс: запись файла (клиент) Достижимость: удалённая (UI:R)
MySQL Community Server mysqldump 26.7.0 (06a5c1c) — Oracle
mysqldump --tab=DIR записывает по одному .sql на таблицу, используя fn_format без MY_REPLACE_DIR. Враждебное имя из SHOW TABLES, содержащее / или .., сохраняет этот каталог. DIR игнорируется. UID дампа выполняет my_fopen по этому пути.
--tab документирован как режим для одной машины, поскольку .txt проходит через серверный INTO OUTFILE. Но .sql всё равно записывается клиентом.
| ID | CVE пока нет |
| Класс | Запись файла (клиентский --tab .sql) |
| Достижимость | Удалённая (жертва запускает mysqldump --tab против MySQL атакующего; UI:R) |
| CWE | CWE-22 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| Продукт | MySQL Community Server mysqldump |
| Затронуто | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Аутентификация | жертва запускает mysqldump --tab=DIR против MySQL атакующего |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1. Свидетель .sql вне DIR. |
Поднять сервер с протоколом MySQL. Ответить на SHOW TABLES значением /abs/path или ../outside. Оператор, запустивший mysqldump --tab=/backup testdb, запишет /abs/path.sql (или путь относительно cwd) от имени UID дампа.
Перезаписать любой файл, который этот UID может создать. Тот же класс, что и клиент резервного копирования, доверяющий удалённому имени файла. Путь .txt через INTO OUTFILE — это серверный FILE. Остаётся клиентский .sql.
Настоящий mysqld не выдаст имя таблицы с /. Остаётся клиент.
Та же охота на 26.7.0, что и mysqldump SHOW TABLES overflow. Демон по умолчанию был пуст. Клиентские утилиты всё ещё доверяли SHOW TABLES. Переполнение было одной из находок. --tab — следующей.
static FILE *open_sql_file_for_table(const char *table, int flags) {
FILE *res;
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
convert_dirname(tmp_path, path, NullS);
res = my_fopen(fn_format(filename, table, tmp_path, ".sql",
MYF(MY_UNPACK_FILENAME | MY_APPEND_EXT)),
flags, MYF(MY_WME));
return res;
}
mysys/mf_format.cc: если dirname_part(name) не пуст и MY_REPLACE_DIR выключен, переданный dir не используется.
Уже зафиксированные ложные пути: считать настоящий mysqld оракулом; падение на SHOW TABLE STATUS до SHOW CREATE TABLE (.sql открывается только после успешного CREATE); считать INTO OUTFILE .txt остатком; имя размером 64KiB, которое снова попадает в переполнение G1.
Это не MariaDB CVE-2025-13699 (обход имени представления в mariadb-dump). Тот же класс, но копия MySQL Community.
cd lab
./run.sh
Образ mysql:26.7.0. --tab=/work/tabdir. Контрольная заглушка таблицы t записывает work/tabdir/t.sql. Заглушка обхода таблицы /work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS записывает work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS.sql. Опубликованы 127.0.0.1:18610 / 18611. Привяжите к loopback.
control-sql=yes
traversal-outside=yes
SUCCESS mysql-mysqldump-tab-path ... MYSQL-DUMP-TAB-TRAVERSAL-WITNESS
Передавать MY_REPLACE_DIR в fn_format для клиентских файлов --tab или сначала брать basename от имени таблицы. --tab=DIR должен означать DIR.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqldump.cc open_sql_file_for_tablemysys/mf_format.cc