
MySQL Community Server 26.7.0 - 高 - mysqlbinlog --raw Rotate パス残留 - クライアントファイル書き込み
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqlbinlog-raw-path
クラス: ファイル書き込み (クライアント) 到達性: リモート (UI:R)
MySQL Community Server mysqlbinlog 26.7.0 (06a5c1c) - Oracle
mysqlbinlog --raw --read-from-remote-server は Rotate イベントの new_log_ident をベース名チェックなしで log_file_name にコピーする。次の FORMAT_DESCRIPTION イベントがそのパスを my_fopen し、BINLOG_MAGIC とイベントを書き込む。/ を含む本物の Rotate ident を送信する悪意あるダンプは、クライアントの UID でそのファイルを書き込む。
--raw はドキュメント化されたリモート binlog ファイル コピーである。残された問題は、ident をパスとして扱っていることだ。
| ID | CVE 未割当 |
| クラス | ファイル書き込み (クライアント --raw BINLOG_MAGIC) |
| 到達性 | リモート (被害者が攻撃者のダンプに対して mysqlbinlog --raw -R を実行; 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 mysqlbinlog |
| 影響バージョン | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| 認証 | 被害者が攻撃者のダンプに対して mysqlbinlog --raw -R を実行 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ。BINLOG_MAGIC を含む証拠ファイル。ファイル書き込みであり、RCE ではない。 |
MySQL プロトコルサーバーを立ち上げる。COM_BINLOG_DUMP を送信する。ダンプが停止しないよう、一致する偽の Rotate (タイムスタンプ 0、ident が要求されたログ名と等しい) を送信する。ident が /abs/path である本物の Rotate (タイムスタンプ != 0) を送信する。FORMAT_DESCRIPTION イベントを送信する。
mysqlbinlog --raw -R ... mysql-bin.000001 を実行したオペレーターは、クライアントの UID で /abs/path を書き込む。内容は binlog バイト列 (\xfebin と FD イベント) であり、任意のペイロードではない。その UID が作成できる任意のパスを上書きする。
本物の mysqld は / を含む Rotate ident を出力しない。残された問題はクライアント側にある。
mysqldump SHOW TABLES オーバーフロー および mysqldump --tab パス と同じ 26.7.0 の調査。デフォルトのデーモンは空だった。クライアントツールは依然としてリモートの名前を信頼していた。
if (raw_mode) {
if (output_file != nullptr) {
snprintf(log_file_name, sizeof(log_file_name), "%s%s", output_file,
rev->new_log_ident);
} else {
my_stpcpy(log_file_name, rev->new_log_ident);
}
}
偽の Rotate (when.tv_sec == 0) で ident が要求されたログと一致しない場合、ダンプは停止する。一致する偽の Rotate はコピー後にスキップされる (continue)。本物の Rotate は停止しない。次の FD:
if (!(result_file = my_fopen(
log_file_name, O_WRONLY | MY_FOPEN_BINARY, MYF(MY_WME)))) {
error("Could not create log file '%s'", log_file_name);
LOAD DATA の一時ファイルは tmpdir 配下の SQL_LOAD_MB のままである。クローズ済み。ident の長さは FN_REFLEN-1 に制限されている。/ は除去されない。
記録済みの誤った方向性: ident がパスである偽の Rotate を送信する (ダンプが停止する); --result-file を使用する (ident がプレフィックスになり、異なる残存問題となる); オラクルとして本物の mysqld を使用する; チェックサムを有効のままにする。
cd lab
./run.sh
イメージ mysql:26.7.0。バイナリ /usr/libexec/mysqlsh/mysqlbinlog Ver 26.7.0 (そのイメージでは PATH 上にない)。コントロールスタブ: 偽の Rotate mysql-bin.000001 と FD が work/mysql-bin.000001 を書き込む。トラバーサルスタブ: 一致する偽の Rotate、本物の Rotate ident /work/oracle/MYSQL-BINLOG-RAW-WITNESS、FD がそのパスを書き込む (BINLOG_MAGIC)。公開 127.0.0.1:18620 / 18621。ループバックにバインドすること。binlog バイト列のファイル書き込みであり、RCE ではない。--result-file は使用しない。
control-basename=yes
traversal-outside=yes
SUCCESS mysql-mysqlbinlog-raw-path ... MYSQL-BINLOG-RAW-WITNESS
log_file_name への my_stpcpy / snprintf の前に new_log_ident の basename を取得する。--raw は cwd または --result-file プレフィックス配下に書き込むべきであり、/ を含む ident に書き込むべきではない。
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqlbinlog.cc dump_remote_log_entries