mysql中所谓“权限继承”实为角色授权失控导致的隐式高危扩散,真正风险在于with admin option滥用、角色嵌套过深、public角色误授及activate_all_roles_on_login配置失控。

MySQL里没有“权限继承”这个官方概念,所谓“继承”其实是角色(ROLE)授权机制被误用或配置疏漏导致的隐式高权限扩散——真正危险的不是继承本身,而是角色绑定失控、权限叠加未审计、以及WITH ADMIN OPTION被随意授予。
查清哪些角色被谁授予了WITH ADMIN OPTION
拥有WITH ADMIN OPTION的角色,可以把自己拥有的任意角色再授给其他人,形成权限“分发权”。一旦该角色被恶意用户获取,就能绕过账号审批流程批量提权。
- 执行
SELECT * FROM mysql.role_edges WHERE is_grantable = 'Y';,列出所有可转授的角色关系 - 重点关注
FROM_HOST为'%'或'localhost'、TO_USER为非DBA账号的记录 - 检查对应角色的原始权限:
SHOW GRANTS FOR 'role_name'@'%';,确认是否含FILE、GRANT OPTION、SUPER等高危权限
识别角色嵌套过深或循环授权
MySQL允许角色 A 授予角色 B,B 再授予 C,甚至 C 回授 A(虽不常见但语法合法)。这种嵌套会掩盖真实权限来源,让SHOW GRANTS FOR 'user'返回的结果难以人工解读。
- 用递归方式展开用户最终权限:先查
SELECT * FROM mysql.role_edges WHERE TO_USER = 'target_user';,再对每条FROM_ROLE重复查询,直到无新角色出现 - 若发现路径中任一角色含
CREATE ROLE或DROP ROLE,说明攻击者可能已具备动态构造提权链的能力 - 特别注意
public角色——它默认被所有账号隐式持有,若有人向public授予了高权限角色,等于全员提权
验证activate_all_roles_on_login是否开启且失控
当全局变量activate_all_roles_on_login设为ON时,用户登录后会自动激活其所有被授予的角色(包括间接获得的)。这在多角色架构中极易放大配置错误的影响。
- 运行
SELECT @@activate_all_roles_on_login;确认当前值 - 若为
ON,必须配合SET DEFAULT ROLE显式控制默认激活集;否则仅靠GRANT role TO user就可能意外激活高危角色 - 检查每个关键账号的默认角色:
SELECT * FROM mysql.default_roles WHERE HOST = 'host' AND USER = 'user';,确保未包含运维无关的角色
最易被忽略的是角色权限的“静默叠加”:比如app_reader角色有SELECT,log_admin角色有FILE,两者单独看都安全,但若同一用户同时持有,就满足了日志文件提权的全部条件——FILE + 可写路径 + 无secure_file_priv限制。











