本项目提供了一个专用环境,用于验证和分析 MariaDB server_audit 插件在 SQL 查询中使用特定内联注释(#、--)时可能存在的审计日志绕过问题。
SET PASSWORD 或 Error 1046 场景)未能被记录到审计日志中,而该版本此前被认为已修复此问题。#)可能导致 DCL 语句被审计器错误处理或忽略。server_audit 启用了 QUERY_DCL、QUERY_DDL 和 QUERY_DML 等过滤器时,某些包含内联注释的查询可能会绕过日志记录机制。以下矩阵总结了测试期间观察到的日志记录行为:
[MariaDB 10.3.39 / 11.8.5]
- 用例 #1、#2A、#2B、#3、#4 → 全部已记录(正常行为)
[MariaDB 11.8.6(目标版本)]
- 用例 #2B(Error 1046)→ 未记录(日志遗漏)❗
- 用例 #3(带注释的 SET PASSWORD)→ 未记录(日志遗漏)❗
- 用例 #1、#2A、#4 → 已记录(正常行为)
本项目使用 Docker Compose 运行三个独立的 MariaDB 实例:
构建并启动 MariaDB 容器。环境会自动配置 server_audit 插件并初始化测试用户。
# 构建并启动容器
docker compose up --build -d
# 验证容器状态
docker ps
安装所需的 Python 依赖:
pip install pymysql
该脚本可以从项目内的任何目录执行。
python poc/poc.py
PoC 执行 5 个不同的场景:
# 注释的 SET PASSWORD 命令(绕过检查)。# 注释的 SELECT 语句(绕过检查)。LOGGED:查询已成功记录到审计日志中。NOT LOGGED:查询未记录到日志中(潜在的绕过或回归)。>> Actual Log:以蓝色显示 server_audit.log 中的原始条目,以验证所记录语句的完整性。以下是实际执行日志,显示了预期行为(11.8.5)与日志遗漏(11.8.6)之间的差异。
[+] TEST_CASE_2_B_ERROR_1046
结果:已记录
>> 实际日志:| 20260504 04:45:05,...,QUERY,mysql,'SELECT * FROM user',1046
[+] TEST_CASE_3_COMMENT_SET_PASSWORD
结果:已记录
>> 实际日志:| 20260504 04:45:07,...,QUERY,mysql,'SET PASSWORD # CVE-2026-3494 Test ...',1133
[+] TEST_CASE_2_B_ERROR_1046(未选择数据库)
结果:未记录 <-- 检测到遗漏
[+] TEST_CASE_3_COMMENT_SET_PASSWORD(内联注释 #)
结果:未记录 <-- 检测到遗漏
[!TIP] 如需所有测试用例和版本的完整终端输出,请参阅完整执行日志。
.
├── config/ # MariaDB server_audit 配置
├── init/ # 初始化脚本(用户和插件设置)
├── logs/ # 审计日志卷挂载
├── poc/
│ └── poc.py # 自动化验证脚本
├── results/
│ └── full_execution_log.md # 详细的终端输出日志
├── docker-compose.yml # 多版本环境定义
└── README.md # 项目文档(当前文件)
本项目仅用于教育和安全研究目的。请负责任地使用,未经充分测试,请勿将这些配置应用于生产环境。
| 版本 | 端口 | 状态 | 描述 |
|---|
| MariaDB 10.3.39 | 3306 | 易受攻击 | 旧版稳定版本验证 |
| MariaDB 11.8.5 | 3307 | 易受攻击 | 最新易受攻击版本验证 |
| MariaDB 11.8.6 | 3308 | 目标 | 评估最近的审计日志记录变更 |