10 月 21 日,PHP 一口气发布了 8.5.12、8.4.27、8.3.36、8.2.35 四个安全版本。两个 CVE,最高 CVSS 9.2,受影响版本可以追到 PHP 5.4。更不舒服的地方不在编号,而在攻击发生的位置。某些条件下,未经认证的请求甚至能在应用代码运行前触发问题。

你的 WordPress 写得再规矩,你的 Drupal 没有那条危险接口,也不一定能躲开。

这次事件被叫作 PHP2Shell。它真正值得开发团队反复咀嚼的,不是「AI 找到了一个洞」这种适合做标题的句子,而是一条很残酷的时间差。公开资料显示,PHP 团队在 2024 年已经看见 OOM 相关风险的影子。2026 年 8 月,多方研究者陆续证明它能走到 RCE。10 月 21 日补丁才正式落地。

发现能力突然变快了,修复系统却没有跟着一起变快。

我一直觉得,这才是 AI 安全进入工程现场后最需要正视的一笔账。未来让人头疼的,未必是模型会不会替你写出一个 exploit。更常见的情况是,模型已经能把一条原本需要资深研究员几周摸索的路径压到几小时,你的资产清单、升级链路、灰度策略和值班协作,还是老速度。

这不是某个 PHP 框架的锅

先把事实摆清楚。PHP Foundation 的公告给出了两个问题的轮廓。

  • CVE-2026-109618 与 OOM 期间的内部状态损坏有关。在 Apache 的 mod_php 场景,未经认证的请求可在应用代码之前触发。PHP-FPM 场景也确认存在经由应用层路径的 RCE 风险。
  • CVE-2026-109619 属于陈旧全局状态。在一次致命错误后,后续被同一个 worker 处理的请求可能使用已经释放的内存。

Wiz 的技术复盘补上了很关键的一层。问题集中在 PHP 对 fatal error,特别是 out-of-memory 的处理方式上。请求非正常终止后,内部状态没有被彻底收回,后来的请求或 worker 又把这段旧状态当成有效对象使用。研究人员演示了未认证的内存读取和 RCE,目标包括当时最新容器镜像里的 WordPress、Drupal、Joomla。

但不要把那几个 CMS 当成受害名单的边界。漏洞在解释器引擎里,不在业务代码里。一个只输出 Hello World 的 PHP 应用,只要运行在受影响版本和可利用配置上,也可能有风险。

这件事和 Java 团队熟悉的供应链事故有点像。你也许没有直接调用某个包,却把它带进了运行时。差别在于,这次被击穿的不是某个依赖树上的叶子节点,而是运行时本身。业务代码的 code review 再漂亮,也替代不了运行时版本治理。

AI 改变的是可利用性,不只是发现率

很多讨论把 AI 的作用概括成「更快找到漏洞」。这句话没错,但还是太轻了。

内存安全问题难,不只因为找 bug 难。把 bug 变成稳定攻击,需要理解 allocator 的行为,跨请求复用状态,绕开地址不确定性,针对不同版本、不同部署形态持续调试。过去这像一座很高的专业门槛。漏洞在那里,能走到利用链的人不多。

Wiz 的复盘讲得很直白。研究团队用多个前沿模型参与漏洞发现、利用开发、检测与补丁验证。模型能读失败日志、归纳假设、提出下一轮测试,并根据目标的内存布局不断改脚本。它没有把人从链路里抹掉,却把探索和试错的单位成本压低了。

门槛一旦变低,风险模型就变了。

以前安全团队常用「攻击实现复杂」「复现条件苛刻」给漏洞排优先级。这个判断仍有意义,但它不再能独立成立。今天难以稳定复现,不代表下周仍然如此。公开的 PoC、模型能力、自动化测试环境会一起改变它的可利用性。

这话听着有点刺耳,但 CVSS 是漏洞描述,不是你环境的实际风险。真实风险还取决于攻击者能用什么工具、你的暴露面有多大、补丁能否在窗口里送到生产。AI 最先推高的,很可能就是第一项。

两个月卡在哪里

既然发现链条被模型加速,为什么补丁没有跟着飞起来。

答案不浪漫。修复不是写一段代码,它更像一次跨组织的生产变更。

PHP Foundation 公开承认过 OOM 问题的修复困境。团队曾有多个方案,每个都有代价。要么影响向后兼容,要么引入新的拒绝服务风险,要么要求大量第三方 extension 配合改动。核心开发者人数有限,安全决策又长期依赖共识,工作一度反复停滞。

这不是他们独有的毛病。你在 Spring Boot 服务里修一个安全问题也会遇到同样的结构,只是规模小一些。

修一个库版本,可能触发 JDK 兼容性、镜像基线、私服缓存、内部 starter、回归测试和发布窗口。修一个运行时问题,还要考虑 FPM、mod_php、容器基础镜像、托管服务商、CDN 和 WAF 的缓解规则。每一层都有人负责,也都可能成为等待点。

所以呢,AI 能把「这里可能有问题」和「我能重现它」压缩到很短。它很难替代负责人去承担兼容性回归、停机窗口与客户影响。模型可以提出 patch,不能替线上事故背书。

PHP 这次的时间线就是一个不太体面的例子。Foundation 说,2024 年已有对 OOM 风险的理论判断。2026 年 8 月,多份报告把实际影响推到台前,随后 PHP、研究机构、云厂商、CDN 和托管平台开始协调检测、缓解与发布。10 月 20 日 CVE 编号提前流传,原定 22 日的发布被提前到 21 日。泄露和提前出现的修复镜像,又让攻击者可以在完整发布前研究差异。

协调披露不只是法律流程。它是一个赛跑,补丁、软件包、镜像、监控规则和客户升级路径都得同时到场。任何一环掉队,漏洞细节公开的那一刻,防守面就会出现空洞。

Agent 时代,安全响应要按生产流水线来设计

很多团队现在很兴奋地把 Agent 放进代码审查、依赖升级和告警分流。我不反对,反而觉得这是对的方向。但顺着 PHP2Shell 往下想,Agent 不该只做「找更多问题的机器」。它应该成为缩短修复时钟的一段流水线。

我会优先补四件事。

先让资产清单能回答运行时问题

出现高危 CVE 时,最糟的回答不是「正在排查」,而是「我们不知道哪里在用它」。资产库至少要能把服务、镜像 digest、运行时版本、部署环境和负责人连起来。

对 Java 团队,这通常是 JDK、Spring Boot、Netty、Log4j 及基础镜像。对 PHP 团队,则要落到 PHP 发行分支、SAPI、FPM 池、镜像标签和宿主机。不要只记录 pom.xml 或 composer.lock。攻击落在运行时,排查也必须能看到运行时。

Agent 在这里适合做脏活。它可以扫描 SBOM、镜像仓库和集群元数据,生成受影响服务清单,再把不确定项丢回给负责人确认。别让它直接执行大规模升级。清单错了还能改,生产变更错了会把故障扩大。

把补丁验证写成可运行的门禁

安全通告来了以后,很多团队的验证仍是一张手工 checklist。谁拉分支,谁点几下接口,谁在群里说「看起来没问题」。这种流程在低频时尚能凑合,高危漏洞同时袭来就会散架。

更可靠的做法是把验证变成 CI 中可重复执行的门禁。启动受影响版本的最小复现环境,运行供应商给出的检测逻辑,升级到候选版本后再运行同一组测试。业务 smoke test、关键链路回归、镜像扫描和部署前策略检查,都应该留下机器可读的结果。

这里有个容易被忽略的点。验证的目标不是证明「服务启动成功」,而是证明「风险路径不再成立,业务路径也没有被补丁打断」。前者是安全验证,后者是变更验证,缺一个都不行。

像 PHP2Shell 这种跨请求、跨 worker 的问题,单请求单进程测试很可能给你一种虚假的平静。测试环境要尽量保留 worker 复用、内存限制和真实 SAPI 的条件。说实话我也不确定每支业务团队都能自建这样的环境,但至少要知道自己没测到什么。

给临时缓解措施设过期时间

补丁不能立刻上时,WAF 规则、限流、关闭特定入口、收紧上传策略,都是合理的止血办法。Wiz 的建议里也提到了异常 multipart 请求、内存限制错误、反复 500、异常 PHPSESSID cookie 和 worker churn 等调查线索。

但临时措施最容易变永久债务。过两周,没有人记得那条规则为何存在。再过半年,它可能误伤正常流量,也可能早已挡不住新的变种。

我的建议是,缓解措施一进入生产,就同时创建一个带到期时间的恢复任务。任务里写清楚它覆盖的风险、观测指标、正式补丁计划和撤销条件。Agent 可以追踪逾期项、汇总证据、提醒负责人,但是否延期要由真正理解业务影响的人决定。

把演练从「发现漏洞」改成「完成修复」

不少演练止步于扫描出多少 CVE,或者红队拿到一次 shell。那是开场,不是结局。

更有价值的演练要计时。从收到公告到确定影响范围多久,从生成升级 PR 到通过回归多久,从灰度到完成覆盖多久,例外服务为什么卡住。你会很快看到,最慢的地方常常不在代码,而在资产归属不清、测试不可复现、变更没有 owner。

这才是安全响应的真实瓶颈。

人应该留在最难也最重要的位置

PHP Foundation 在公告里有一句很诚实的话。AI 能帮助验证报告、把相同根因的报告归组,但每一个结论和每一个补丁仍由人做判断和处理。

我认同这个边界。不是因为模型不够聪明,而是修复天然包含价值判断。为堵住一条低概率路径,能不能接受性能下降。一个有破坏性的兼容性改动,哪些客户可以承受。因为修复窗口错过 SLA,谁来拍板。这些都不是从日志里推理出来的唯一答案。

人也不该继续做那些重复的搬运工作。模型来读公告、比对版本、归类告警、生成复现环境、补全变更记录,人来确认影响、选择 trade-off、批准上线、复盘流程。这样的分工比较朴素,却比给安全平台贴一个 Agent 标签有用得多。

回到开头那几个版本号。它们提醒我们的不是 PHP 很老,也不是 AI 很可怕。更准确一点,攻击者和防守者的发现能力已经一起提速,而大部分组织的修复链路仍停在过去的节拍。

漏洞发现会越来越像一场短跑。安全响应必须把接力棒提前摆好。

今天能做的三件小事

  1. 如果你的环境运行 PHP,核对当前分支并升级到 PHP Foundation 公告列出的修复版本或发行商提供的等价补丁。不要只看应用依赖文件。
  2. 为生产服务补一张能查询运行时版本、镜像 digest、负责人和暴露面的资产视图。下次高危公告到来时,它比一份漂亮的安全大屏更救命。
  3. 选一个最近的高危依赖升级,完整演练从通告、影响确认、验证、灰度到收尾的链路,记录每个环节的耗时与阻塞。你要优化的不是扫描速度,而是从知道问题到可证明地修好问题的时间。

参考资料