grant option 会绕过权限校验直接转授,仅检查用户当前是否持有权限而非“本应拥有”,导致权限不可控扩散、历史授权无法回收、库名泄露等风险。

GRANT OPTION 会让用户绕过 DBA 控制链直接授予权限
MySQL 不校验用户“本应拥有”什么权限,只检查当前是否持有。比如你只给了 SELECT ON app_db.*,但加了 WITH GRANT OPTION,该用户就能执行 GRANT SELECT ON *.* TO 'attacker'@'%',把整个实例的读权限送出去。
常见错误现象包括:安全审计时发现一堆非 DBA 创建的账号、SHOW GRANTS FOR 'u'@'h' 看不到下游账号(MySQL 不记录转授权)、回收 GRANT OPTION 后已转授的权限依然有效(MySQL 8.0.16+ 才支持 REVOKE GRANT OPTION,但仍不回滚历史授权)。
- 不要给监控账号、健康检查账号配
WITH GRANT OPTION,它们通常只需USAGE - 测试环境若需代理授权,必须限定库名和权限组合,避免用
USAGE ON `file`.*+WITH GRANT OPTION(这会导致库名泄露) -
GRANT OPTION是账户级委托,绑定在'user'@'host'上;它和角色级的WITH ADMIN OPTION完全不同,后者只能再授同一个角色
如何快速揪出正在滥用 GRANT OPTION 的账号
别等被攻破才查。直接查 mysql.user 表中哪些账号开启了授权能力:
SELECT User, Host FROM mysql.user WHERE Grant_priv = 'Y';
对每个返回结果,执行 SHOW GRANTS FOR 'username'@'host';,重点看是否含 WITH GRANT OPTION 和 ON *.* 或 ON database.* 这类宽泛范围。
- 生产环境里,只有 DBA 主账号(如
'dba'@'192.168.10.0/24')才应保留Grant_priv = 'Y' - 如果看到
'dev'@'%'或'backup'@'10.%'这类宽 host +Grant_priv = 'Y',立刻收敛 - 注意
'root'@'localhost'和'root'@'192.168.1.100'是两个独立账号,Grant_priv可能只开在一个上
回收 GRANT OPTION 时最容易忽略的三个事实
REVOKE 不能单独回收 GRANT OPTION,必须连同其他权限一起撤销。比如你只想去掉转授权,却忘了原权限本身也会消失:
错误写法:REVOKE GRANT OPTION ON *.* FROM 'u'@'h'; → 语法报错
正确写法:REVOKE SELECT ON app_db.* FROM 'u'@'h'; → 这会同时收回 SELECT 和其附带的 WITH GRANT OPTION
- 已转授的权限不会自动失效,哪怕你
DROP USER 'u'@'h',下游账号仍能继续用 -
USAGE + WITH GRANT OPTION会暴露库名:即使用户对`log`.*完全没操作权,也能在SHOW DATABASES里看到log,这对枚举备份库、配置库极其危险 - MySQL 8.0.16+ 支持
REVOKE GRANT OPTION ON *.* FROM 'u'@'h';,但仅阻止后续转授,不清理已有链条
替代方案:用角色(ROLE)代替 GRANT OPTION 做权限分发
MySQL 8.0+ 支持角色,可以打包权限后统一授予,且 WITH ADMIN OPTION 只能再授同一角色,无法越界:
CREATE ROLE 'app_reader'; GRANT SELECT ON app.orders TO 'app_reader'; GRANT 'app_reader' TO 'webuser'@'10.20.30.%' WITH ADMIN OPTION;
这样 webuser 只能再把 app_reader 角色授给别人,不能擅自加 INSERT 或换到 sys 库。
- 角色必须显式激活:
SET DEFAULT ROLE 'app_reader' TO 'webuser'@'10.20.30.%';,否则权限不生效 - MySQL 5.7 及更早版本不支持角色,强行执行会报
ERROR 1396 (HY000): Operation CREATE ROLE failed - 角色不能嵌套(即不能让角色 A 拥有角色 B),这是有意设计,避免权限树失控
真实线上环境里,最常被忽略的是 USAGE + WITH GRANT OPTION 导致的库名泄露,以及误以为 REVOKE 能一键切断所有下游权限。这两点往往在渗透测试或合规审计时才暴露。











