AI挖出PHP顶级漏洞,全球70%网站都处于“裸奔”之中

AI 生成的题图:PHP 漏洞导致大量网站受影响
题图由 AI 生成

2026年10月21日,一份安全通告在运维群里炸开了。

两个编号为 CVE-2026-109618 和 CVE-2026-109619 的漏洞被公开,代号”php2shell”。它们藏在 PHP 的内核里——不是某个插件、某个框架,而是这门语言最底层的地方。WordPress、Drupal、Joomla、Laravel,凡是用 PHP 撑起来的网站,全部在射程之内。

更让人后背发凉的是攻击门槛:不需要账号,不需要密码,一个精心构造的 HTTP 请求就够。在 Apache 的 mod_php 环境下,官方已经验证了未认证远程代码执行——攻击代码在业务程序运行之前就已经执行完毕。相当于大楼的门禁还没通电,后门已经开了。

而挖出这个漏洞的,是 AI。

两个漏洞,同一类病

安全机构给出的 CVSS 评分是 9.8,属于”严重”级别。虽然两个 CVE 编号不同,但病因是同一类:请求内存的生命周期管理出了错。

CVE-2026-109618 的问题出在内存耗尽(OOM)的处理路径上。PHP 在内存分配失败时会用 longjmp() 中断执行,但在某些条件下,这个中断会让内部请求数据处于”只初始化了一半”的残缺状态。等到请求清理阶段,PHP 又去访问这块不合法的内存——内存破坏就此发生。攻击者可以通过构造请求耗尽内存来主动触发它,包括利用 multipart/form-data 的解析过程。

CVE-2026-109619 则是另一种经典病灶:Use-After-Free(释放后使用)。PHP 在请求结束后本该清干净全局状态,但部分错误处理、会话管理和请求处理的路径会留下指向”已释放内存”的指针。当同一个工作进程处理下一个请求时,如果这块陈旧状态还没被正确重置,就会读到已经还给系统的内存。攻击者可以借此操控那块内存,最终拿到代码执行权限。

这两个漏洞的共同点很关键:它们都依赖同一个进程内的请求状态复用。这意味着 PHP-FPM、mod_php 这类长驻运行方式风险最高。官方特别指出,mod_php 的危险程度最高,因为漏洞可以在应用层代码执行之前就被触发。

一个细节值得记住:调整工作进程数量并不能消除风险。只有让每个进程处理完一个请求就重建(如 pm.max_requests=1),才能收窄触发面——但这只是缓解,不能替代打补丁。

AI 是怎么把它挖出来的

OpenAI 在公告中确认,安全公司 Calif 使用 GPT-5.6 Sol 发现了 PHP 的关键漏洞。安全厂商 Wiz 的研究团队也独立发现并报告了同类问题,他们用上了自家的 Wiz Atlas,以及 Gemini 4 Argon 和 GPT-5.6 Sol。

具体过程并不玄乎。在研究员引导下,AI 通读了 PHP 的底层代码,注意到一条异常路径:数据只写了一半,却被后续流程当成完整数据使用。研究人员把这条线索整理成可复用的审计规则,再让 AI 顺着规则继续扫描,第二个漏洞随之浮出水面。

这件事的意义,其实不在”AI 找到了一个 bug”。

PHP 已经运行了二十多年,无数安全研究员反复审计过它的代码。很多当年写的逻辑,在当年的标准下是够用的,只是用今天的眼光重新审视,才显出裂缝。AI 做的,是把这种”沉睡的风险”以远超人类的速度翻了出来。

但硬币的另一面也摆在眼前:如果 AI 能帮防御方更快找到漏洞,它同样能帮攻击方更快找到入口。这次事件里最讽刺的一点是——攻击者跑到了补丁前面。

OpenAI 官方发帖:AI 在 PHP 中发现关键安全漏洞
图|源自 OpenAI 官方发帖

本该保密两个月的抢修,在最后 48 小时崩了

按正常流程,这种级别的漏洞应该由厂商和核心团队秘密修复,等补丁铺开后再公开。这次的计划本来也是这样,保密期约两个月。

然后,防线在最后 48 小时接连失守。

先是网上出现匿名帖子,直接放出了漏洞的 CVE 编号,随后被 PHP 官方确认。接着,安全公司 Calif 误发了一段攻击演示视频——视频虽然很快删除,但副本已经在全网扩散开。最后,软件供应链安全公司 Chainguard 提前发布了包含修复的构建镜像,这等于把漏洞的具体位置,提前递到了攻击者手里。

补丁还没正式落地,第一波攻击已经上路。PHP 基金会事后的说法很直接:CVE-2026-109618 的线索最早出现在 2024 年的一次外部安全审计中,当时就有核心开发者注意到了相关隐患,但“迟迟没有修复,是一次结构性失败”。

服务器机房
数据中心机房

影响到底有多大

公开数据显示,仅已确认暴露的受影响服务器就超过百万台,其中大量主机跑的是已经结束官方支持的 PHP 版本。

事件曝光后,荷兰、芬兰、日本等多国的政府机构和企业网站采取了临时关站的方式紧急避险。对一个国家的政务系统来说,关站是代价极高的选择——但比起被远程接管,这已经是更小的代价。

日本首相高市早苗在 X 上要求全国紧急应对 PHP 漏洞
图|日本首相高市早苗在 X 上要求全国紧急应对:请确认您公开的网站是否使用 PHP,并为当晚发布的修复补丁做好准备。该推文转发 7.5 万次,查看 3371 万次

日本首相亲自发文动员全国运维,这条推文的查看量达到 3371 万次。对一个技术漏洞来说,这样的关注度相当罕见——它说明这次事件的量级,已经远远超出了安全圈的日常讨论范畴。

受影响版本与修复版本如下:

PHP 8.5.x(低于 8.5.12)→ 升级到 8.5.12
PHP 8.4.x(低于 8.4.27)→ 升级到 8.4.27
PHP 8.3.x(低于 8.3.36)→ 升级到 8.3.36
PHP 8.2.x(低于 8.2.35)→ 升级到 8.2.35
PHP 8.1 及更早 → 已结束生命周期,官方不再提供更新

最尴尬的恰恰是最后一行。大量老站点跑在 PHP 7.4 或 8.1 上,官方早已停止支持。PHP 安全团队虽然为 7.4、8.0、8.1 发布了最小化的源码回移植补丁,但这需要自己从源码编译——对绝大多数站长来说,这不是”想不想做”的问题,而是”做不做得到”的问题。

另外还有一类容易被忽略的风险:打包了 PHP 的设备、容器和第三方产品。很多设备的 PHP 版本对管理员是不可见的,你可能根本不知道自己正在受影响。

自查:三步确认你有没有中招

如果你在运维站点,建议按下面的顺序过一遍,十分钟能有个结论。

第一步,确认版本。在服务器上执行 php -v,或者建一个临时文件写入 <?php phpinfo(); ?> 访问查看(看完立刻删掉,这个文件本身是信息泄露源)。也可以直接用命令行:php -r "echo PHP_VERSION;"。

第二步,判断是否在受影响区间。对照上面的版本表。注意 8.2.35 之前的 8.2 系列、8.3.36 之前的 8.3 系列,都算受影响。

第三步,确认运行方式。用 php_sapi_name() 或查看 phpinfo 的 Server API 字段。显示 apache2handler(mod_php)的风险最高,fpm-fcgi(PHP-FPM)同样在影响范围内。

确认受影响后,处理优先级建议是:对外网暴露的系统 > 处理不可信输入的应用 > 内网系统。

如果暂时没法立刻升级,官方和各国 CERT 给的临时缓解措施包括:把对外应用与公网隔离、限制 PHP 进程的请求复用(pm.max_requests=1)、重点监控 Web 日志里的异常请求模式。同时要盯住那些”打包了 PHP”的第三方组件——很多漏洞不是从你自己的代码进来的。

比漏洞更值得琢磨的事

把这件事只当成一次安全事件,其实是低估了它。

PHP 基金会自己说过,这个漏洞难修,是因为每种修复方案都有代价:有的可能破坏向后兼容,有的可能引入新的拒绝服务风险,还有的需要协调大量第三方扩展。修复工作因此停了又启、启了又停,最终被搁置。对程序员来说,找出漏洞往往比修好它更简单——这句话在这次事件里体现得淋漓尽致。

更深一层的问题是钱和人。全球大量商业巨头和创业公司,都在免费享用 PHP 这类开源软件打下的地基,但地基的维护,长期压在一小批志愿者和捉襟见肘的资金上。PHP 基金会曾多次公开呼吁:靠开源赚得盆满钵满的公司,有没有拿出与依赖程度相匹配的投入?

去年 9 月,Java、Python、PHP、Rust、Eclipse 等基金会联合 OpenSSF 发过一份声明,话讲得很直白:开源基础设施并非免费,长期免费使用不可持续,商业用户应该为基础设施付费。

所以真正的问题从来不是”没人看见漏洞”,而是——看见之后,谁来付钱、谁来承担兼容风险、谁来为那些早已无人维护的系统兜底?

AI 把”发现漏洞”这件事变得前所未有的便宜,却没有让”修复漏洞”变便宜哪怕一点。补丁要不要打、打了会不会出事、谁来审、老系统迁不迁移——每一步都要人和组织来拍板。

这次是 PHP。下一个会是什么,没人知道。但可以确定的是:当发现漏洞的速度被 AI 拉满,整个互联网真正的短板,不在检测能力,而在修复的决心和预算。

如果你手上还有跑着 PHP 8.1 甚至 7.4 的站点,今天就去看看版本号吧。

评论

写下你的想法

邮箱不会被公开。带 * 的为必填项。