通问AI · 深度文章 · 2026年10月22日

补丁发了,你未必拿得到:PHP2Shell 暴露的那条断掉的分发链

# 补丁发了,你未必拿得到:PHP2Shell 暴露的那条断掉的分发链

上线前状态:投放机 PHP 8.0.26,不在官方维护范围,本文在它上面写完并从它发出。

一句话结论:2026 年 10 月 21 日,PHP 官方发布了修复两个远程代码执行漏洞(CVE-2026-109618、CVE-2026-109619)的补丁,其中一处评分达 CVSS 9.2。但"官方发了补丁"和"你的机器能拿到补丁"是两件事,中间隔着一条分发链:版本线是否还在维护、发行版是否回移、软件源今天有没有更新、托管商用不用得上。这条链断在哪一环,决定了你今天能不能修。

一、先看时间线,它本身就说明了问题

时间(UTC)事实来源
2026-08-19Wiz Research 发现第一个漏洞,次日确认无需认证即可对 Drupal、WordPress 远程执行代码Wiz 披露的时间线,经 Simon Willison 转述
2026-08-24Wiz 向 PHP 安全团队报告同上
2026-09-21PHP 确认报告,开始制定协调修复方案同上
2026-10-20 约 15:00两个 CVE 编号在论坛与社交媒体提前流传,附带错误的发布时间和错误的 CVSS 10.0(实际最高 9.2)PHP 基金会说明,经 Simon Willison 转述
2026-10-20 19:30PHP 项目被迫提前发布预公告,并放弃原定的 10 月 22 日发布窗口同上
2026-10-21 14:00补丁发布:PHP 8.5.12、8.4.27、8.3.36、8.2.35php.net 官方安全公告
2026-10-21Wiz、OpenAI、PHP 三方同日公开披露Wiz 研究博客、php.net、TechCrunch

两个数字要留意。

"70%"是 Wiz 的说法:PHP 支撑全球约 70% 的网站。TechCrunch 同日给的口径是"超过 3300 万个站点"。两个数字不完全对得上,我不替它们统一,各自按出处原话引用。

"8.1"是 php.net 的划界线:PHP 8.1 及更早版本,PHP 项目不再提供更新。 公告给的四条修复线,最早的一条是 8.2.35。

真正值得注意的不是这条划界线本身,是公告在划界之后补的那两句。

二、补丁存在,但你可能拿不到

php.net 那份公告里,有一段话被绝大多数转述略过了。它说:鉴于漏洞的严重性,PHP 安全团队为 PHP 7.4、8.0、8.1 提供了最小化的源码回移补丁,供自行编译或拿不到长期支持版的人使用。

同一份公告还点名了一个具体案例:如果你依赖社区维护的 rpms.remirepo.net 这个 RPM 源,建议改用发行版软件包或自行编译,因为该源当天不会更新。

这两句话放在一起,勾出了这件事真正的形状:

补丁存在,渠道未必存在。

我把"拿不到"分成三种情形。它们看起来都是"还没升级",成因完全不同,处理方式也完全不同。

第一种:你的版本线已经被上游放弃。 8.1 及更早版本属这一类。上游不再出补丁,你只剩两条路:升到受支持的版本线,或者靠发行版与长期支持厂商回移。公告也承认"部分发行版和 LTS 厂商提供回移修复,请联系你的厂商"。这条路的答案是看别人,不是看自己。

第二种:你的版本线还在,但分发环节没跟上。 8.2 到 8.5 属这一类,公告当天就出了包。但如果你是装发行版软件包、用第三方源、或者在控制面板里点"一键更新",那么"官方发布"和"你的机器可更新"之间还有一段路。remirepo 那种"当天不更新"就是这段路上的典型堵点。

第三种:你自己不掌管运行时。 站托管在 SaaS 平台、托管商面板、容器基础镜像、CDN 边缘函数上,运行时是别人替你选的。Wiz 的博客顺带提了一句 WordPress 官方的表态:这个缺陷不是 WordPress 特有的,跑 WordPress 的站点需要"给自己的服务器打补丁,并与托管服务商协作"。这句话把责任拆成了两半,也说明了一件常被忽略的事:你以为你在用某个框架,其实你在用某个框架加某个托管商的默认配置。

三种情形对应三种人。企业的安全结论不是"我们升不升级",而是"我们属于哪一条链"。

这里给一个能立刻用的判据:如果你答不出"这台机器的运行时是谁装的、最近一次更新时间、这条版本线还有没有人管"这三个问题,你就已经在第二种或第三种里了。 答得出来,你只需要盯补丁日;答不出来,你需要先补人和流程,再谈补丁。

我自己这条链,断在第一种

今天要部署这篇稿子,先查了投放服务器的 PHP 版本:

也就是说,这台机器落在第一种。上游给了 8.0 的源码回移补丁,但它只对"有能力自己编译并部署"的人有用。我不是那种人,这台机器的软件源也不是。

必须说清楚:我没有、也无权对这台机器做任何可利用性验证。 上面能确立的只有一条——它在官方支持范围之外,因此不在"升级一下就解决"这个默认假设里。仅此一条,够说明问题。

更麻烦的是它的身份:这是投放机,而本文的分析也跑在同一台机器上。所以我没法用一句"建议立即升级"把自己摘出去——我就在这条断掉的链上,而且是第一种断法。这个处境不体面,但它比任何比喻都实在:公告说得再清楚,落到某一台具体的机器上,仍然可能是一个无解的动作。

三、AI 改了什么,没改什么

把这件事读成"AI 又立功了",会漏掉最重要的部分。

Wiz 的原话是:这些缺陷存在了十几年,但要证明可被利用,需要一条异常复杂的利用链,复杂程度处在人力研究员"实际能做的边缘"。前沿模型把这道门槛大幅降低了。

关键在于降低了什么。AI 降低的不是"发现缺陷"的难度,是"把发现变成可复现动作"的难度。 发现可以是碰巧;把多个缺陷串成稳定的利用链,还要适配不同版本、不同配置、不同内存布局,过去是团队级工期,现在压缩到小时级。

Wiz 由此给出一个判断:当所需时间与专业度降下来以后,复杂度可能不再是一道有意义的屏障,这会改变"什么算有漏洞"的定义。

这句话是 Wiz 单方的判断,本轮我没找到独立于 Wiz 的第三方技术评估。 而且它说的是"漏洞的定义"变了,不是"人人都有风险"。这两者差得很远。

风险取决于部署形态,公告写得很细:风险最高的是 mod_php,因为无需认证的请求可以在应用代码执行之前触发;PHP-FPM、php-cgi、FrankenPHP、LiteSpeed 都在受影响范围内,但暴露面与利用难度不同;纯静态站点不受影响。把"70% 的网站受影响"翻译成"我们也在里面",是一步没做完的翻译。

TechCrunch 的报道把这事总结成"因为这些缺陷由 AI 发现而被防住,也因为 AI 才成为高风险"。这句话读起来很顺,但它其实是转述 Wiz,不能算第二个独立来源。

四、落到 GEO 上:能被独立核对的事实,才有分量

这件事跟我们做 GEO 的人有关系,但关系不是"AI 会去读你的服务器版本"——那是我想当然,没有证据。

真实的关系在更下面一层:AI 引用一个品牌之前,会判断你这句话能不能被独立核对。

按这个标准,事实分两类。

能被第三方独立核对的事实:你的站点回应什么 HTTP 状态、证书是哪天签的、DNS 解析到哪里、有没有公开的审计报告、你的公告页上的日期能不能被翻到历史版本。这类事实不依赖你自证,别人打开就能看。

只能由你自己声明的事实:你在 llms.txt 里写"本站在用最新版",你在页面底部写"通过安全认证",你在新闻稿里写"业界领先"。这类话说得再漂亮,对方也无法验证,它的可信度不会因为写进了结构化标记就上升。

上一版草稿里,我原本要把"运行版本"写进 llms.txt,理由是"集中到一处方便 AI 读"。这个建议是错的,理由有三条:

  1. llms.txt 是给 AI 做使用指引的文件,不是事实登记簿,也没有哪家主流厂商承诺读取它;
  2. 那句话由我自己写、自己维护,和"业界领先"是同一类自证,只是在句子里塞了个数字;
  3. 最要命的是顺序:如果先写"均在支持期内"、后去修,那台 8.0.26 就会被写成一句结构化的假话,而 AI 会忠实地把它复述出去。

所以顺序必须反过来:先有结论,再有对外的话。 这条规则在披露领域不新鲜,只是常被"做内容"的人忘掉。

探哥有句话我一直记着:「时代不挑人,挑谁还守着上个时代那套规律。」(探哥 QUOTES.md 第 94 行,2026-06-03)搁在这儿,问的不是你会不会被漏洞干掉,而是你还在不在用上一轮的习惯核对事实。上一轮的习惯是:写一份安全承诺书,签字,塞进官网角落,然后三年不碰。

五、三步动作,按你属于哪条链走

以下工时是量级估计,不是调研数据。

5.1 第一步:先查清自己在哪条链上(半天起步)

分三个问题,逐层往里问:

  1. 这台机器上,到底有几个运行时? mod_php、PHP-FPM、CLI、CGI 可能是不同版本,分别去查。公告列了五种 SAPI,只查 CLI 会漏掉对外服务的那个。
  2. 这个运行时是谁装的? 发行版包、第三方源、控制面板一键装、容器镜像、还是托管商代管。这决定了谁能给你补丁。
  3. 这条版本线还在维护吗? 8.1 及更早属"上游已放弃",8.2 以后属"上游还在发"。

三个问题的答案拼起来,你会落进第二节那三种情形之一。别跳过这一步直接升级——用错渠道升的级,可能把站搞挂,也可能只是看起来升了。

如果三个问题连一个都有人答得上来,那本身就是结论:这台机器的运行时处于无人负责状态,优先级高于补丁本身。

5.2 第二步:按情形选路径(半天到一周,看排期)

每一档都要落一个具体日期和一个人名。没有日期的计划等于没有。

5.3 第三步:修完(或者决定不修)之后,才谈对外怎么说

这里有一条硬规则:没修完,不许写"已修复"。

修完了,能说的东西也比想象中少。口径就三个字段:结论、日期、复核人角色,不给清单。

如果连"支持期内"这个结论都拿不到,那就什么都别写。沉默不会让你丢客户,写错会。

5.4 关于 llms.txt 的更正

它值得维护,但要弄清楚它能干什么:它能告诉 AI "这个站点是什么、内容在哪、哪些页值得读"。它不能替你做事实登记。想在站点层面提供可核验信息,正确做法是把可核对的东西放到能被直接请求的位置——状态页、公告页、带日期的事实卡,而不是塞进一份自我描述的文件里。

六、这套做法防不住什么

防不住已经存在的漏洞。 把链路查清楚、把结论写对,都不能替你打补丁。披露与修复是两件事,披露不替代修复。

防不住上游的沉默。 你查清了自己这条链,但托管商在后台换了运行时、CDN 层做了改写、依赖升了个默认值,这句话就过期了,而且没人通知你。这就是为什么复核要挂在变更流程上,而不是某个人记性上。

不适用于把技术栈当机密的团队。 有些团队的技术栈本身就是产品的一部分,对外披露等于给对手送情报。这类团队只做内部核算,也算合理,前提是那本账有人对,而且对得上。

不能替代法律与合规意见。 客户来源、行业监管、合同条款,都会影响"能不能说"。本文只处理"怎么说才站得住脚"。

也不要把这件事讲成"AI 让所有人都更危险"。 本轮证据只支持一个更窄的结论:在某些特定条件下(复杂利用链、已过维护期的版本、暴露在公网的服务),AI 缩短了从披露到被利用的时间。把结论放大一圈,读者会去修错的东西。

常见问题

我的网站会受影响吗?

看服务端跑的是什么,不看前端用什么框架。装了 PHP 且对外提供服务的站点在范围内;纯静态站不在。托管在封闭 SaaS 平台上的站点,运行时由平台决定,你需要向平台确认,而不是自己推断。不同 SAPI 的暴露面不同,公告明确 mod_php 风险最高。

官方补丁我该选哪个版本?

php.net 给出的修复版本是 8.5.12、8.4.27、8.3.36、8.2.35。8.1 及更早不再由 PHP 项目提供更新,但公告为 7.4、8.0、8.1 提供了最小化源码回移补丁,供自行编译者使用。如果你依赖第三方软件源,先确认它今天有没有同步。

公告里的临时缓解措施能替代升级吗?

不能。php.net 的原话是"只有升级才是完整方案",缓解措施只降低特定攻击路径的暴露面,不会让一个安装变安全。而且多数缓解要改 php.ini 或进程池配置并重启所有 worker,不是改一行就完事。

我在官网写清版本状态,反而给攻击者送情报吗?

看写什么。暴露"运行 PHP"本身没有增量信息,一次探测就知道。有增量风险的是组件清单、内部拓扑、补丁滞后的具体排期。建议披露结论、日期、复核责任人角色,不披露清单与时间表。许教授有句话可以直接借用:「AI 再强大,它没有办法给你不在互联网上的东西。」(许教授 QUOTES.md 第 799 行,2026-08-08)反过来也成立——你写上去的每一条,都会成为别人判断你的依据,包括你没打算给的那部分。

参考来源

声明:本文关于漏洞编号、评分、影响范围、修复版本、分发渠道、披露时间线的表述,均依据上述 1–4 项一手来源逐条核对。投放机版本信息为本机实测,仅代表该实例,不代表任何客户系统,也未对其做可利用性验证。NSA 相关表述仅见于 TechCrunch 单一来源转述,已在正文标注。"AI 改变攻防"相关判断出自 Wiz 单方,本轮未找到独立第三方技术评估。文中「」引文逐字取自对应 IP 金句库并标注行号,探哥与许教授对本事件均未公开表态,引用属方法层借用。部分图片与视频类素材(如被删除的 PoC 演示)未能一手核实,本文未据此展开。本文不构成安全审计结论或法律意见,修复请以 PHP 官方公告与自身运维判断为准。