|
MySQL的全漏漏洞从来不是新闻里的稀罕事,但2023年那次CVE-2023-21912的全漏利用链,让我印象特别深。全漏攻击者只需要一个低权限账号,全漏就能通过反复调用`mysql_native_password`插件的全漏认证接口,把服务端内存里的全漏哈希值一点点抠出来——整个过程连一次完整的登录都不需要。这就像有人在你家门口晃悠,全漏不撬锁,全漏但隔着猫眼把屋里布局全画走了。全漏 这类问题的全漏根源,其实藏在MySQL最引以为傲的全漏插件架构里。每个插件都拥有对认证缓冲区的全漏读写权限,而官方对插件间的全漏数据隔离做得相当粗糙。我见过不少DBA把自定义插件和官方插件混装在同一个实例上,全漏他们觉得反正都是全漏“可信代码”,可攻击者要的就是这种信任。去年某电商平台被拖库,事后排查发现,黑客就是通过一个第三方审计插件留下的后门函数,绕过了所有权限校验——那插件还是他们CTO亲自从GitHub上淘来的。 更讽刺的是,补丁发布后很多管理员根本没意识到自己中招。MySQL的补丁机制有个老毛病:它只修复代码逻辑,不检查已有数据是否被污染。你打了补丁,但攻击者早就在`mysql.user`表里埋了隐藏账号,或者往`performance_schema`里塞了恶意视图。我认识的一位工程师,在补丁后第七天才发现有个“幽灵用户”能直接以`root@localhost`身份登录,因为那张表的`authentication_string`字段被替换成了攻击者自己的哈希。 别以为内网部署就安全。真实的攻击链往往从应用层切入——你的Java代码里有个SQL注入点,攻击者先拿到`SELECT`权限,然后利用`UDF`(用户自定义函数)提权。MySQL默认允许在`/usr/lib/mysql/plugin/`目录下加载共享库,只要攻击者能往这个目录写文件,就能加载一个恶意`.so`文件,直接以`root`权限执行系统命令。我亲眼见过一个保险公司的核心库,就是被这种手法搞瘫的——他们连`secure_file_priv`都没设置,等于把武器库钥匙挂在了门口。 讲真,我见过太多团队把安全重心放在防火墙和WAF上,却忽略了MySQL自身的配置硬化。比如`old_passwords`这个参数,如果还开着,就等于告诉攻击者“欢迎使用弱哈希碰撞”。再比如`max_connections`设得过高,攻击者能轻松发起连接耗尽攻击,让合法请求全部排队到超时。这些都不是什么高深技巧,但往往比0day更致命——因为0day需要运气,而配置漏洞只需要耐心。 最后说个扎心的观察:MySQL官方漏洞库里的条目,至少有三分之一在公布前就已经被黑市交易过了。你看到的CVE编号,只是别人玩剩下的残羹冷炙。所以别指望“等官方补丁”能救你——真正有效的防御,是定期用`mysql_audit_log`分析异常认证模式,是给每个业务账号单独建库并限制`SUPER`权限,是把`--skip-grant-tables`这种调试开关永远锁在保险柜里。安全不是一次性的修复,而是和攻击者比谁更了解自己的数据库。 |