AI挖出PHP「致命漏洞」!欧洲政府连夜关站,日本首相紧急喊话
全世界差不多七成的网站,都是用同一个编程语言搭建的。
这一回,它出大事了。
它叫 PHP,一个免费、开源的服务器端脚本语言。10 月 21 日,PHP 官方发布紧急修复版,起因是 PHP 本身被查出了两个严重的安全问题。严重到什么程度?日本首相当天专门发帖,催促网站管理员连夜处理;荷兰那边更干脆,政府的数字身份系统、政务入口、议会网站,连同一批医院的官网,全都主动下线了。
听上去天塌了。
补丁已经发布,但攻击也已经开始。真正需要担心的,是那些还没升级的网站。
01 | 一个影响半个互联网的编程语言
你可以把 PHP 理解成很多网站的地基。
根据第三方统计,在能看出用了什么技术的网站里,差不多七成都在用它。你每天登录的论坛、买东西的商城、浏览的新闻站点,背后用的很可能就是它。
这次的问题,就出在这块地基上。
攻击者不用登录,只要给网站发送一个特制的请求,就可能接管整台服务器,就算不接管,也能从内存里读走密码、密钥这类敏感信息。即使你网站的代码写得再干净也躲不开,哪怕页面上只有一行「Hello World」,照样可能中招。
研究人员已经在多个最常见的建站系统上演示过攻击,WordPress、Drupal、Joomla 全都在影响范围内。
02 | 这一天,全世界的网站连夜更新
荷兰大概率是反应最激烈的。
安全事故当天,荷兰的数字身份系统和政务入口先后下线,议会网站也关闭了。给上百个市镇提供会议系统的服务商也关停了服务,好几家医院的官网也打不开了。隔壁比利时的弗拉芒大区政府,干脆把旗下所有官网临时下线,法国和芬兰也紧接着纷纷效仿。PHP 修复补丁发布后,荷兰的数字身份系统和政务入口才得以重新上线。
主动关站的不止政府。维基百科背后的维基媒体基金会,特意把一批配套服务关停;开源路由器系统 OpenWrt,也把官网和维基站点暂时关闭了。
日本首相当天发帖,「请大家今晚紧急处理,先确认自己的公开网站有没有用 PHP,等今晚补丁一出来就尽快更新,实在来不及的,暂时把网站关掉也是个办法。」
网友调侃,「没想到有生之年,会被国家元首喊着去打补丁。」
03 | 一个被忽视多年的「坑」
早在 2020 年,就有人给 PHP 提报过一个看起来人畜无害的小问题。2024 年,PHP 基金会组织了多年来第一次外部安全审计,当时也发现了这个隐患的苗头,但没找到能利用它攻击服务器的方法。后来安全团队想修复时才发现,几套优化方案各有优劣,懂 PHP 内核的人又少,还必须全票通过才能决定,于是这事断断续续拖延了几个月。
PHP 基金会在复盘中提到,「这次拖延是结构性的失败。」
今年 8 月,几家安全团队各自借助 AI 模型,把这个隐患变成了能真正拿来攻击的漏洞,先后上报给了 PHP 官方,OpenAI 团队也在其中。从 8 月 11 日上报,到补丁公开,前后 71 天,各方全程保密,PHP 安全团队一边偷偷修复,一边和各家约好统一公开的日子。
没想到原定公开日前两天,消息泄露,一位网友在技术论坛发帖,「据可靠消息源,PHP 要出大事,信我。」于是,PHP 官方被迫提前一天发布补丁。
04 | 第一件事,先看看你的网站中招了吗
先搞清楚你网站的 PHP 版本。
很多人习惯用 php -v 命令查看版本,但命令行里的 PHP,和实际在后台给网站处理请求的那个,很可能不是同一个。一台服务器上同时安装多个 PHP、面板里多版本共存,都很常见。所以 别只看命令行,要看实际运行中的那个。
如果网站是托管的,或者用的是虚拟主机,就去主机商后台看一眼 PHP 版本,或者问客服有没有更新。
OpenAI 官方还开源了一个 PHP 检测小工具。
OpenAI 官方检测工具传送门: https://github.com/openai/php2shell-checker
安装 Node.js,运行 node phpcheck.js "https://你的网址" 就能检查你网站用的 PHP 版本是否安全,加上 --local 命令检查本机。
但有三点要注意。
结果显示 UNKNOWN ,不代表安全,很可能只是版本号被隐藏了或者没连上;显示 OK ,也只是和内置的版本号比对了一下,没有真的验证安全补丁有没有安装;最容易误伤的是第三种,很多 Linux 发行版会把补丁「回迁」到老版本,版本号看着没变、其实已经修复了,检查器反而会误报 VULNERABLE 。
05 | 检查出来有问题,怎么修复
确认受到影响后,最简单粗暴的解决方案是升级 PHP。
升级前,记得先备份数据。
然后把 PHP 升级到官方修复版, 8.5.12 、 8.4.27 、 8.3.36 、 8.2.35 这四个版本或者更高,这两个漏洞就修复了。
升级完别忘了重启,把 Apache、PHP 的服务进程,还有那些一直挂在后台的 PHP 程序统统重启一遍,补丁才会生效。用 Docker 官方 php 镜像的,则需要拉取新镜像、重新构建,再重启容器。
划重点,仅更新网站程序、主题、插件,是不起作用的。因为问题出在 PHP 这块地基上,不在你的网站代码里。
最稳妥的方案是先把站点下线,等补丁安装好了再重新上线。
06 | 后话
补丁搞定,不代表这事就翻篇了。
先把你所有用到 PHP 的地方都彻底检查一遍,包括捆绑在别的软件里或者藏在控制面板里的。
别再用已经停止支持的版本。 PHP 8.2 的安全支持今年年底到期, 8.1 和更老的版本,PHP 官方已经不再发布更新。根据第三方统计,使用 PHP 的网站里有三成以上还停留在 PHP 5 和 PHP 7 ,这些版本这次都没有正式的修复版,升级要趁早。
所以,真正需要担心的,是那些十年没人登录、却还在网上默默运行的老站。