一个 PHP 漏洞吓停半个欧洲政务网站,重点其实不在 PHP

· 互联网观察 · 阅读 8
摘要

先说结论:这次被称作 PHP2Shell 的漏洞,严重程度评分 9.2,可以无需登录就远程执行代码,受影响版本能一直往回追到 PHP 5.4。官方给出的修复版本是 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35。美国国家

先说结论:这次被称作 PHP2Shell 的漏洞,严重程度评分 9.2,可以无需登录就远程执行代码,受影响版本能一直往回追到 PHP 5.4。官方给出的修复版本是 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35。美国国家安全局建议,如果暂时升不了级,就先把系统下线。

但真正值得琢磨的,是后面发生的事:芬兰政府的公共网上服务、荷兰网络安全机构、荷兰国家公共卫生与环境研究院、荷兰下议院、英国爱丁堡市议会,先后把自己的网站挂上了维护页。多数属于预防性下线,当时并没有确认被攻击。

这不是「PHP 又烂了」的故事

PHP 驱动着全球大约七成的网站,WordPress、Drupal、MediaWiki 都靠在它上面。一个内存层面的漏洞能波及这么大面积,属于「用户多」带来的结果,而不是「质量差」。同类事情在 OpenSSL(心脏滴血)、Log4j(Log4Shell)身上都发生过——那两次,全世界也用了差不多同样的姿势手忙脚乱。

真正拉开差距的,不是谁的语言更安全,而是「发现之后到打上补丁,中间隔了多久」。这次荷兰几家机构的选择很说明问题:在没法立刻确认自己是否安全时,先把服务撤下来。对一个政务网站来说,宁可被用户骂两天,也不愿意赌一个未经验证的可能性。

最刺眼的一行:老版本没补丁

PHP 8.1 及更早版本早已停止支持。这意味着跑在这些版本上的站点,官方不会给补丁,你只能升级到仍受支持的分支。而现实中,大量中小站点的 PHP 版本是主机商装机时定的,五年没人动过。

这就形成了一个很尴尬的结构:漏洞影响最深的,恰恰是最没能力快速响应的一批站点。大型机构有安全团队盯公告、有测试环境跑兼容性;个人站长可能连自己跑的是哪个小版本都说不清。

新闻之外,两件能立刻做的事

第一,去看一眼版本号。不要相信记忆,去看后台的系统信息或主机面板。对照上面那四个修复版本:同分支低于它,就是没修。

第二,如果确实是未修复状态,评估一下升级的代价。主题和插件对高版本 PHP 的兼容性通常比想象中好,但也确实会有老插件在高版本下报 deprecated 警告——这类警告本身不影响安全,只要日志里没有致命错误就还能接受。

至于「先把站关掉」这个选项,我的看法是:对政务、金融、医疗这类持有敏感数据的系统,值得;对一个小博客,成本大于收益,升级更实际。

最后提一句容易被忽略的:这类漏洞真正可怕的地方,是攻击者进来之后能读走密码、会话令牌和 API 密钥。也就是说,即使你打了补丁,如果系统曾经暴露在未修复状态一段时间,这些凭据也该轮换一遍。补丁堵的是门,不代表之前没人进来过。