MariaDB 纯 SQL 全链:空密码 GRANT 提权 + 游标 UAF 到容器内命令执行
MariaDB 13.0.1-rc:只用 SQL 从 USAGE 权限打到容器内 RCE
一句话:对 MariaDB 13.0.1-rc 的完整攻击链:一个只有 USAGE 权限的账号、只有 3306
可达,全程用 SQL 完成"提权到 DBA → 读服务进程内存布局 → UAF+JOP 堆利用 → 容器内以
mysql 用户执行任意命令",唯一外部操作是重启容器读结果。
要点:
- F-09 提权:GRANT PROXY 时"空密码+空插件名"被当成"指定了空认证",has_auth() 返回
false 跳过权限检查但 replace_user_table() 照常执行 → 两条 SQL 把 root 变成空密码账号;
修复只在开发分支,10.6.27–13.0.1 所有发布版裸奔(QVD-2026-48306 已验证可复现) - 内存布局:secure_file_priv 未设时用 FILE 权限 LOAD DATA INFILE 读 /proc/self/maps
- F-05 内存破坏:SYS_REFCURSOR 存储过程游标数组 use-after-free,open 阶段执行攻击者
SQL 再开 15 个游标 + 三轮诱饵分配把数组顶到增长点,旧指针悬垂,配堆喷 + JOP 链 - 启发:"空值语义"(未指定 ≠ 指定为空)是数据库生态反复翻车点;DB 审计只看
"注入了什么"看不到"SQL 本身在干什么"
原语抽象:协议内自举——合法 SQL 语法里依次取齐提权(空值语义漏洞)、信息
(FILE 读 /proc/self/maps)、内存破坏(存储过程堆编排)三类原语,全程封闭在
"数据库在干自己的活"的表象下。
亲戚手法:数据库从 SQL 到系统执行的家族;差异:无需文件写入原语,堆编排
(递归开游标顶增长点 + 三轮诱饵分配)完全在存储过程内完成,检测面只剩 SQL 行为本身。
防御启示:数据库审计要看"SQL 在干什么"(游标/存储过程异常模式)而非只匹配
注入特征;"未指定 ≠ 指定为空"的语义差异要进认证/授权代码的测试用例。
原文: https://xz.aliyun.com/news/92718
来源发布时间: 2026-08-18