直接收回PROCESS权限即可彻底阻断普通用户查看他人进程的能力,这是唯一可靠、即时生效、不影响业务读写的手段;因PROCESS是全局权限,仅支持ON .语法,必须匹配原授权host并执行FLUSH PRIVILEGES后验证。

直接收回 PROCESS 权限就能彻底阻止普通用户看到他人进程,这是唯一有效、即时生效、不影响业务读写的办法;其他任何绕行方式(比如查 performance_schema.threads 或 sys.session)在未同步封堵时仍可能泄露信息。
为什么只 revoke PROCESS ON *.* 才算真正生效
PROCESS 是 MySQL 的全局权限,不支持库级或表级写法。只要用户拥有它,SHOW PROCESSLIST 和 SELECT * FROM information_schema.PROCESSLIST 就会返回所有连接的 User、Host、Info 字段——包括明文 SQL(如 WHERE token = 'abc123')。
- 写成
REVOKE PROCESS ON app_db.*会报错:ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES - 必须严格匹配当初授权的
host,比如原先是'user'@'%',就不能只对'user'@'localhost'操作 - 执行完
REVOKE后,不运行FLUSH PRIVILEGES,权限缓存不会更新,行为不变
容易被忽略的间接泄露路径
即使 PROCESS 被收回,用户仍可能通过以下视图拿到部分上下文,因为它们默认不受 PROCESS 控制,而是依赖 SELECT 权限:
MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。
-
SELECT PROCESSLIST_INFO FROM performance_schema.threads→ 需额外执行REVOKE SELECT ON performance_schema.* FROM 'user'@'host' -
SELECT * FROM sys.session→ 需额外执行REVOKE SELECT ON sys.* FROM 'user'@'host' - 这些
REVOKE也必须配FLUSH PRIVILEGES,否则无效
怎么验证权限确实被清干净了
别只看 SHOW GRANTS,要切到目标用户实际验证:
- 用该用户登录后执行
SHOW PROCESSLIST:应只返回自己的一两行,且Info字段仅含当前语句前 100 字符 - 执行
SELECT * FROM information_schema.PROCESSLIST:应直接报错ERROR 1227 (42501): Access denied - 查底层字段:
SELECT User, Host, Process_priv FROM mysql.user WHERE User = 'user',确认Process_priv列值为'N'
最常出问题的是监控账号——它往往被误授 PROCESS 权限用于采集指标,一旦凭证泄露,攻击者能立刻看到所有活跃连接和明文 SQL。这类账号的权限清理优先级,应该高于应用账号。

















