
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 は fn_format を使用してテーブルごとに1つの .sql を書き出しますが、MY_REPLACE_DIR は使用しません。/ や .. を含む悪意ある SHOW TABLES の名前はそのディレクトリを保持します。DIR は無視されます。ダンプ UID がそのパスを my_fopen します。
--tab は、.txt がサーバーの INTO OUTFILE を経由するため、同一マシンモードとして文書化されています。.sql は依然としてクライアント側の書き込みです。
| ID | CVE 未割り当て |
| クラス | ファイル書き込み (クライアント --tab .sql) |
| 到達範囲 | リモート (被害者が攻撃者の MySQL に対して mysqldump --tab を実行; 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) |
| 認証 | 被害者が攻撃者の MySQL に対して mysqldump --tab=DIR を実行 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ。DIR 外の .sql を目撃。 |
MySQL プロトコルサーバーを立ち上げます。SHOW TABLES に対して /abs/path または ../outside を返答します。mysqldump --tab=/backup testdb を実行したオペレーターは、ダンプ UID として /abs/path.sql (または cwd からの相対パス) を書き込みます。
その UID が作成できる任意のファイルを上書きします。リモートのファイル名を信頼するバックアップクライアントと同じクラスです。.txt の INTO OUTFILE パスはサーバー側の FILE です。残るのはクライアントの .sql です。
実際の mysqld は / を含むテーブル名を出力しません。残るのはクライアントです。
mysqldump SHOW TABLES overflow と同じ 26.7.0 の調査です。デフォルトのデーモンは空でした。クライアントツールは依然として SHOW TABLES を信頼していました。オーバーフローは1つの残存物でした。--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 CREATE TABLE の前に SHOW TABLE STATUS で終了すること (.sql は CREATE が成功した後にのみ開かれる)。INTO OUTFILE の .txt を残存物と呼ぶこと。G1 オーバーフローを再び引き起こす 64KiB の名前。
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。ループバックにバインドしてください。
control-sql=yes
traversal-outside=yes
SUCCESS mysql-mysqldump-tab-path ... MYSQL-DUMP-TAB-TRAVERSAL-WITNESS
--tab クライアントファイルに対して fn_format に MY_REPLACE_DIR を渡すか、先にテーブル名の basename を取得してください。--tab=DIR は DIR を意味すべきです。
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqldump.cc open_sql_file_for_tablemysys/mf_format.cc