一段精心构造的压缩数据,就可能让攻击者在你服务器的内存里随意涂抹,甚至直接接管整台机器——这不是电影桥段,而是眼下正在上演的真实安全事件。10 月 26 日,PHP 官方紧急发布了四款重新构建的 Windows 版本安装包,矛头直指一个被称作 HTTP2Shell 的严重漏洞。如果你的网站跑在 Windows 服务器的 PHP 环境下,这几天的每一个小时都弥足珍贵。

五天两次告急,PHP Windows 包连夜重建
这次放出的新版本号分别是 PHP 8.5.12-1、8.4.27-1、8.3.36-1 和 8.2.35-1。眼尖的朋友可能注意到了版本号末尾多出来的"-1"后缀,这恰恰是关键所在:PHP 运行时本身的代码没有变动,变的是安装包里捆绑的组件。新构建的每一个版本都内置了 Brotli 1.2.1,这是修复 CVE-2026-111497 的指定版本,而此前 10 月 21 日构建的包中带的是存在缺陷的 Brotli 1.2.0。
值得一提的是,这距离 PHP 上次安全更新仅仅过去五天。10 月 21 日那次更新修复的是另外两个严重漏洞 CVE-2026-109618 和 CVE-2026-109619,外界将其统称为 PHP2Shell,同样允许攻击者在无需登录的情况下执行远程代码。由于本次重建基于同一份源码,上一轮的修复在新版本中依然有效,算是一个让人稍感宽慰的消息。
HTTP2Shell 到底是什么来头
追根溯源,问题出在谷歌的 Brotli 压缩库里。Brotli 是如今大量程序用来解压缩数据的通用工具,而这次暴露的是一个典型的越界写入漏洞——解码器本该拒绝的畸形数据流被继续接收,多余的字节溢出到缓冲区之外,写进了不该触碰的内存区域。谷歌给出的 CVSS v4.0 评分高达 9.2 分(满分 10 分),根据触发环境的不同,它可以让程序崩溃、泄露内存中的敏感内容,最坏的情况是允许攻击者在目标机器上远程执行任意代码,全程无需任何凭证。
这个漏洞最早由 Node.js 在 10 月 21 日的安全更新中披露,研究人员起初给它起名 Node2Shell。可随着波及面像涟漪一样扩散到越来越多的软件,它有了更贴切的新名字 HTTP2Shell——因为借助 HTTP 流量,恶意服务端能攻陷未打补丁的客户端,恶意客户端同样能反过来攻陷服务端,两个方向都通吃。
PHP 是怎么被卷入的
PHP 官方的说明很直白:当启用自动 HTTP 响应解压缩时,攻击路径可以通过 cURL 扩展触达那个有缺陷的 Brotli 解码器。按照 libcurl 的文档,这个选项默认是关闭的,理论上说风险可控。可现实是,许多应用程序和 HTTP 客户端库会主动把它打开。换句话说,一旦你的 PHP 系统需要去解码来自不可信来源的 Brotli 数据——比如抓取第三方接口、处理外部回调——危险就悄无声息地潜伏在了数据管道里。

受影响的远不止是 PHP
如果以为这只是 PHP 和 Node.js 两个人的事,那就低估了这波冲击的广度。研究人员已经在 Python 包、.NET、FFmpeg、ClickHouse、Apache Arrow、Bun、Envoy、Istio 等一长串名单里确认了同一缺陷的存在。微软在 10 月 25 日也火速发布了 .NET 8.0.33、9.0.22、10.0.14 等修复版本,连 Visual Studio 和 PowerShell 都跟着打了补丁。
这里还有一个容易踩的坑:很多产品都内嵌了 Brotli,单凭版本号判断安不安全可能得出错误结论。一些厂商会把修复代码回移植到旧版本分支里,你看到的版本号虽旧,构建却可能已经安全;反过来,某些看起来版本号不低的构建也可能藏着未修复的解码器。上游的修复版本散落在 1.0.10、1.1.1 和 1.2.1 三个分支上,逐一核对构建来源才是稳妥做法。
现在该做什么
运维和安全团队此刻最优先的任务,是确认所有运行 PHP 的 Windows 主机都换上了带"-1"后缀的新包。与此同时,把环境里所有捆绑了 Brotli 的组件都清点一遍,对照上游修复版本逐一验证。暂时无法完成修复的团队,权宜之计是让生产系统拒绝处理来自不可信来源的 Brotli 输入——在反向代理层拦截 Content-Encoding 为 br 的请求、移除出站请求 Accept-Encoding 中的 br,都能在短时间内压缩暴露面,但要记住这只是止血,不是根治。
另外别忘了,PHP 8.2 分支将在 2026 年 12 月 31 日正式结束维护。还在使用这个版本做业务的团队,即便这次顺利打了补丁,也该把升级列入近期计划了——过期分支不会再收到任何安全更新,留在原地等于把大门敞开。
五天之内连发两轮安全更新,这样的节奏在 PHP 的历史上并不多见。HTTP2Shell 的波及面仍在扩大,今天确认安全的软件清单,明天可能就要重新核对。对个人开发者而言,最朴素也最管用的建议是:把自动更新打开,把依赖清点当成日常,别等攻击者替你"测试"系统的防御能力。



