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,且未进行 basename 检查。随后的 FORMAT_DESCRIPTION 事件对该路径执行 my_fopen,并写入 BINLOG_MAGIC 及该事件。一个恶意 dump 若发送带有 / 的真实 Rotate ident,就会以客户端 UID 写入该文件。
--raw 是文档所述的远程 binlog 文件复制功能。遗留问题在于将 ident 当作路径处理。
| ID | 暂无 CVE |
| 类别 | 文件写入(客户端 --raw BINLOG_MAGIC) |
| 可达性 | 远程(受害者对攻击者 dump 运行 mysqlbinlog --raw -R;UI:R) |
| CWE | CWE-22 |
| CVSS | 高危: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) |
| 认证 | 受害者对攻击者 dump 运行 mysqlbinlog --raw -R |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1。见证文件包含 BINLOG_MAGIC。文件写入,非 RCE。 |
搭建一个 MySQL 协议服务器。使用 COM_BINLOG_DUMP 通信。发送一个匹配的伪造 Rotate(时间戳为 0,ident 等于请求的日志名),使 dump 不会停止。发送一个真实的 Rotate(时间戳 != 0),其 ident 为 /abs/path。发送一个 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 与请求的日志不匹配,会停止 dump。匹配的伪造 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(dump 停止);使用 --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
在 my_stpcpy / snprintf 写入 log_file_name 之前,对 new_log_ident 取 basename。--raw 应写入 cwd 或 --result-file 前缀下,而非带有 / 的 ident。
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqlbinlog.cc dump_remote_log_entries