一句话结论:PHP2Shell 是两个藏在 PHP 引擎层的 9.2 分远程代码执行漏洞,影响 PHP 5.4 以来的所有版本,Wiz 团队借助 Gemini 4 Argon 与 GPT-5.6 Sol 在 2026 年 8 月 19 日找到它,两个月后补丁发布时全球约七成网站仍跑在受影响版本上。
2026 年 10 月 21 日,PHP 项目发布紧急安全版本,修复两个被统称为 PHP2Shell 的引擎级内存安全漏洞。编号是 CVE-2026-109618 与 CVE-2026-109619,两者的 CVSS v4.0 评分都是 9.2,PHP 安全团队给出的定级是 Critical。漏洞位于 PHP 解释器本身,与 WordPress、Drupal、Joomla 这些上层应用的代码质量无关。只要站点跑在受影响版本的 PHP 上,一个未登录的请求就可能改写进程内存或读取进程内存。
这件事的分量不来自数字,而来自来源。发现方是 Wiz Research 的研究团队,工具链里同时出现了 Google 的 Gemini 4 Argon 和 OpenAI 的 GPT-5.6 Sol。Wiz 在报告里写下一句话:单个研究者在模型辅助下花一周完成的事,放在十年前需要世界级团队花几个月。
两个 9.2 分漏洞:一个泄内存,一个改内存
PHP2Shell 实际包含四个可利用的实例,被归并到两个 CVE 编号下。四个实例共享同一条错误处理路径:请求在处理过程中遇到致命错误,尤其是内存耗尽时,PHP 会中止请求并销毁请求堆,但某些全局指针没有随之清空。
CVE-2026-109618 的核心是上传进度反序列化路径上的 use-after-free。PHP 解析 RFC1867 multipart 请求发生在正常模块初始化完成之前,会话的上传进度处理在这个早期阶段就可能初始化 Session 状态,并把会话 ID 写入 PS(id)。一旦内存耗尽错误打断了请求,清理流程没跑完,PHP 销毁了请求堆,PS(id) 却仍指向那块已被释放的内存。后续同一个 worker 处理的 multipart 请求会先走到上传进度清理路径,PHP 信任这个陈旧指针,把已经回收的堆内容 URL 编码后塞进 PHPSESSID 响应 cookie 返回。
这个特性让漏洞与应用无关。即便应用代码从不调用 session_start(),漏洞依然成立。Wiz 演示的是未认证状态下读取攻击者指定大小的 worker 内存,里面装着别的请求的密码、令牌和 API 密钥。
CVE-2026-109619 走的是另一条路。PHP 会把最近一次致命错误的调用栈保存在 EG(last_fatal_error_backtrace) 这个执行器全局变量里。内存耗尽错误销毁了请求堆,却没有把这个全局变量置空,worker 存活下来,全局变量继续指向上一个请求的内存。下一个请求如果在执行器重新初始化之前触发了诊断输出,就会先访问这个悬垂指针。
OPcache 类型混淆是第三个实例,属于跨 worker 的问题。OPcache 把编译后的 PHP 结构体持久化在共享内存里,靠每 worker 的运行时指针映射表分配索引。一个分配失败发生在本地前沿指针推进之后、共享前沿发布之前,本地已经推进而共享状态认为槽位仍然可用。另一个 worker 后来复用这个槽位去放不同类型的运行时对象,类型不匹配就构成了跨 worker 类型混淆。Wiz 用这个原语拼出了针对 WordPress 的未认证 RCE 链。
| 编号 | 缺陷类型 | 可达成的影响 | 已演示的利用 |
|---|---|---|---|
| CVE-2026-109618 | 上传进度反序列化 use-after-free | 远程进程内存泄露、内存破坏并执行代码 | WordPress、Drupal、Joomla 上未认证 RCE |
| CVE-2026-109619 | 致命错误回溯 use-after-free | OPcache 类型混乱、共享 PHP 状态破坏并执行代码 | Drupal 与 WordPress 上未认证 RCE |
两个漏洞都在解释器层,因此上层 CMS 只是被选作演示靶标。Wiz 明确写了这一点:利用不依赖这些 CMS 里的任何一个 bug,一个跑在受影响 PHP 版本上的 Hello World 应用同样会中招。
十年老代码为什么拖到今天才爆
这两个缺陷的历史可以追到十多年前。Calif、Wiz 和 Cloudflare 都把受影响范围定在 PHP 5.4 及以后版本,也就是过去十年多的每一个发布版本。Wiz 的报告里提到,内存问题的早期迹象在 2024 年一次由 OSTIF 组织的 Quarkslab 审计中就出现过,但兼容性取舍加上专职人手不足,让完整修复被拖了下来。
拖住修复的不是难度,而是经济性。一个内存漏洞本身往往不致命,真正致命的是把它变成可用的攻击武器。PHP 在处理致命错误时可以调用 longjmp() 跳出当前执行路径,这会绕过常规的初始化与清理逻辑。攻击者要利用这一点,得先理解 PHP 在不同版本、不同配置、不同应用行为下如何分配与复用内存,再把多个原语串成链,然后针对每个部署调整。一个在 A 站点能跑通的利用,换到 B 站点通常需要重新分析和调试。
这类工作有两个特点:一是高度依赖专家直觉,二是不可规模化。几十个漏洞原语、几十种内存布局,每一种都要手工适配,产出极慢。这也是为什么 PHP 官方没有主动修、而漏洞在十年里安然存在的原因之一。行业里类似的长期潜伏漏洞往往不是找不到,而是找到了也造不出能用的武器。
AI 把造武器的时间从几个月压到一周
模型改变的是这一段。Wiz 明确记载了工具链:Wiz Atlas、Gemini 4 Argon、GPT-5.6 Sol。Google DeepMind 的 Gemini 安全负责人 Raluca Ada Popa 的说法是,Gemini 4 Argon 在漏洞发现、利用代码构造、攻击检测和补丁验证四个环节都做出了不可或缺的贡献。
模型在这里干的活儿很具体,不是凭空造漏洞。已知 CVE 可以被摄取,漏洞模式被抽取出来,然后在目标代码库里搜索同类弱点。Wiz 描述了一条流水线:orchestrator 分发任务,Codex 逐问题处理,issue gate 做筛选,两道误报判定检查过滤幻觉,重复检查去重,最后经过 reporting gate 才交给安全工程师人工确认。这套流程把数十年的公开漏洞历史变成了可复用的搜索策略。
真正压缩时间的是利用侧的适配。PHP 不同版本的内存布局不同,利用链要跟着改。模型可以读失败日志、分析崩溃位置、迭代调整参数,把原本几天的手工调试缩到几小时。Wiz 的结论很直接:复杂度不再构成有效屏障,一个缺陷是否算可利用,这个定义本身被改写了。
OpenAI 侧的表述更谨慎一些。安全公司 Calif 在自己的说明里表示,只用了公开可用的模型和常规工具,没有特殊装备,关键是了解 PHP 的历史本身比模型更重要,并写下一句相当克制的判断:没有任何模型能靠简单提示词挖出所有缺陷,至少目前不能。值得注意的是,Wiz 引用了 Heartbleed 与 Log4Shell 作为参照,把 PHP2Shell 定位为 AI 时代的同类转折点。
两个月协调期,与那 48 小时
从发现到补丁落地走了将近两个月,真正压缩到几天的,是披露前的最后阶段。
| 时间 | 事件 |
|---|---|
| 2026 年 8 月 19 日 | Wiz Research 使用 Wiz Atlas、Gemini 4 Argon 与 GPT-5.6 Sol 发现第一个 PHP 漏洞 |
| 2026 年 8 月 20 日 | 确认对 Drupal 的未认证远程代码执行 |
| 2026 年 8 月 21 日 | 确认对 WordPress 的未认证远程代码执行 |
| 2026 年 8 月 24 日 | Wiz Research 向 PHP 安全团队报告漏洞 |
| 2026 年 9 月 21 日 | PHP 确认报告并启动协调修复 |
| 2026 年 10 月 21 日 | 修复版本发布,同日公开披露 |
修复之所以慢,是因为要动解释器底层,改动面大,需要在多个仍受支持的分支上做兼容性验证。PHP 团队最终为 7.4、8.0 和 8.1 这些已经停止支持的分支也回移了补丁,这在常规流程里几乎不会发生。
节奏的最后一轮是泄露推动的。PHP 原定 10 月 22 日发布,提前到 10 月 21 日 14:00 UTC。原因是 Hacker News 上出现了细节泄露,Wall Street Journal 随后报道。Chainguard 在 10 月 21 日 07:41 UTC 提前发布了已含修复的镜像,等于把补丁的二进制差异直接交到了攻击者手里,比原定 embargo 早了六个小时。Calif 在 10 月 20 日 20:00 UTC 前后误发了一段演示视频。PHP Foundation 的说法是,这些泄露的标识符和演示材料打乱了协调披露,才让发布提前了一天。
防护侧的动作同样密集。Cloudflare 在 10 月 21 日 03:02 UTC 为所有客户开启 WAF 规则,免费套餐也包含在内,比公开披露早约九个小时。Cloudflare 观察到攻击者针对规则调整了载荷形态。欧盟 CERT-EU 与英国 NCSC 都建议无法即时打补丁的组织把系统下线。NSA 发布了单独告警。Pinboard、GrapheneOS 论坛和 OBS 主动下线了部分服务,Laravel 暂停了云部署以重建镜像。PHP Foundation 的安全工程师 Volker Dusch 对 Wall Street Journal 表示,这是 PHP 十余年来面临的最严重问题,并把它类比为 2014 年 Heartbleed。
修复版本与运维动作清单
补丁本身没有玄学,最低版本线已经明确。
| PHP 分支 | 需要的版本 | 支持状态 |
|---|---|---|
| 8.5 | 8.5.12 或更高 | 受支持 |
| 8.4 | 8.4.27 或更高 | 受支持 |
| 8.3 | 8.3.36 或更高 | 受支持 |
| 8.2 | 8.2.35 或更高 | 受支持 |
| 8.0 与 8.1 | 官方无补丁版本 | 已停止支持 |
| 5.x 与 7.x | 官方无补丁版本 | 已停止支持 |
几个容易被忽略的实操细节。第一,运行时升级与 CMS、框架的版本发布是两条独立的线,光升 WordPress 不解决 PHP 解释器的问题。第二,要清点的是运行时而不是站点:CLI、PHP-FPM、Apache 模块、定时任务、Serverless 函数和容器镜像可能各加载不同的二进制。第三,存量进程不会自动换掉解释器,PHP-FPM 和 Web 服务器 worker 必须重启才生效。第四,容器环境要用打过补丁的基础镜像重建,改正在跑的容器是不够的。第五,确认线上版本时不要只看 php -v,共享主机上对外服务的 PHP 可能比命令行版本更新,应该通过 phpinfo() 或主机控制台核对。
PHP 官方给的态度是更新是唯一安全的选择,没有任何配置调整能完全替代升级。Cloudflare、AWS、Fastly 与 Imperva 的规则属于纵深防御,只能算缓冲。对无法即时升级的系统,PHP Foundation 与 NCSC 的建议是限制上传大小、关闭不必要的上传功能、移除直接的互联网暴露并做主机网段隔离。
这场事件留下了三个判断
第一个判断:AI 已经在改变漏洞的实际危害,而不只是发现数量。PHP2Shell 的两个缺陷客观存在了十多年,转成可用攻击武器需要极高的人工成本。模型把成本压下来之后,一个此前被判定为不可利用的缺陷就变成了可利用资产。评估一条漏洞的风险,不能再只问难不难发现,还要问造不造得出武器。
第二个判断:防守侧第一次和攻击侧拿到同一套工具。OpenAI 与 Wiz 用的是同一批模型,OpenAI 明确表示这类流程可以复制成通用框架,并预期未来几个月内同等量级的成果会明显增加,同时也提醒发现漏洞的能力同样可能被攻击者利用。防守方把补丁打出去的速度,决定了这段窗口是给防守方还是给攻击方。
第三个判断:披露流程本身成了瓶颈。这次两个月里,真正的危机出现在最后 48 小时,泄露和 embargo 破坏把补丁提前推到了攻击者面前。PHP 团队对漏洞历史的说法被 Wiz 和 Cloudflare 修正到 5.4 起点,官方公告甚至没有给出最老受影响版本。对防守方而言,知道影响范围本身就是这次事件最难补的一课。
常见问题
PHP2Shell 影响哪些版本,需要升级到哪一版?
影响 PHP 5.4 以来发布的每一个版本,覆盖 PHP-FPM、Apache mod_php、php-cgi、FrankenPHP 与 LiteSpeed 等所有处理网页请求的部署方式,其中 mod_php 风险最高。修复版本是 8.5.12、8.4.27、8.3.36 与 8.2.35,8.1 及更早的分支已停止支持,没有官方补丁,只能迁移或做严格隔离。
用 AI 找漏洞,会不会让攻击者也更容易发起攻击?
会,两者是同一件事的两面。OpenAI 自己在公告里就提醒,发现漏洞的能力同样可能被攻击者利用。这次模型的直接作用是把利用代码从目标适配到不同 PHP 版本和内存布局的时间从数天压到数小时,攻击者拿到的是同款能力。防守方能拿到的对冲手段是提前发现和提前打补丁,补丁落地速度比模型能力差距更能决定最终损失。
只升级 WordPress 或 Drupal 版本够不够?
不够。漏洞位于 PHP 解释器核心,与上层应用代码无关,WordPress 官方也明确指出 8.2 之前不再获得安全修复。正确做法是清点所有实际提供服务的 PHP 运行时,升级受支持的分支,用打过补丁的基础镜像重建容器,重启常驻进程以替换掉仍在运行的旧解释器,并核对线上真实版本而不是命令行里显示的版本。
小结
PHP2Shell 会被记进安全史,不是因为它用了两个新 CVE 编号,而是因为它标出了一条清晰的分界线。在这条线之前,复杂内存漏洞的杀伤力取决于少数专家的手工投入;在这条线之后,模型让这类漏洞的规模化利用成为可能。
对站点运维者来说,需要做的动作非常具体:查版本、升版本、重启进程、重建镜像。对安全团队来说,需要重新审视的是漏洞评估方法,把可利用性纳入模型能力一起计算。至于模型会先被用来防守还是先被用来攻击,这次的答案已经偏向后者。
相关阅读
漏洞报告的质量门槛决定了修复能否落地,华为发布AI漏洞报告新规:PoC必须可执行,攻击链必须完整 这一篇讨论了可执行 PoC 的意义,与本次由模型自动构造利用链的做法互为参照。
软件供应链上的密钥泄露与本次的进程内存泄露属于同一类问题,OpenCode Console 爆发安全漏洞:1.4% 用户 API 密钥泄露 复盘了凭据被窃后的处置路径。
让模型参与漏洞检出已经进入工程实践,Claude管理智能体新增动态工作流:1000路并发,漏洞检出率从27%升至94.3% 给出了另一条并发检出率提升的路线。
延伸阅读
- 《纽约时报》揭OpenAI安全黑洞:员工预警被无视,GPT-6.1 Astra被迫取消发布3 周前
- Claude 30分钟破译26年NSA椭圆曲线悬案:种子源自1997年Unix时间戳5 天前
- 406位科学家联名呼吁:立即切断AI模型与互联网连接1 周前
- OpenAI首次公开点名:Kimi相关账户窃取16000次模型推理背后3 周前
继续读
同一批更新里这几篇值得一看:
- Claude 30分钟破译26年NSA椭圆曲线悬案:种子源自1997年Unix时间戳2026-10-17
- Anthropic向美国国会递交AI监管法案:超10亿美元损失方可叫停模型(深度)2026-10-17
- AI安全哲学的正面碰撞:黄仁勋零容忍 vs 奥特曼风险管理2026-10-16
想快速查定义?对应的词条在这里:
- AI Agent词条 · AI 自学笔记
