PHP 爆雷,Go 与 Node.js 跟进:后端人的又一个不眠夜
10 月 20 日到 22 日,PHP、Go、Node.js 三个生态非常有默契地选在同一周发难。这行的规律是漏洞从不单独来,它们喜欢组团。
运维圈子里有条不成文的经验:漏洞很少单独登门,一般是组团来的。这周就是典型——48 小时之内,PHP 语言核心爆出免认证远程代码执行,Go 和 Node.js 则被同一起 CA 私钥泄露事件捎带下水。三个生态,三种毛病,凑一块儿正好够一个通宵。
PHP:9.2 分,而且不用登录
10 月 21 日,PHP 安全团队发布紧急更新,修复 CVE-2026-109618 与 CVE-2026-109619。
这两个洞的病灶都在"内存不够用"那一瞬间。PHP 内存耗尽时会提前打断执行,但请求的内部数据结构只初始化了一半,稍后的清理流程却把它当作完整状态来对待;另一个漏洞则让前一个请求的残留状态在内存释放后继续存在,被同一进程处理的下一个请求读到。两个凑起来,是一条不需要任何账号密码就能走完的攻击路径。安全厂商 Wiz 给这套组合起了个名字,叫 php2shell,并在当前版本的 WordPress、Drupal、Joomla 上演示了实际的代码执行。
罕见的不是 9.2 这个分数——这年头 9 分以上的漏洞不算稀缺品。罕见的是响应阵势:新加坡网络安全局、加拿大网络安全中心、欧盟 ENISA 联合 CERT-EU 与欧洲刑警组织、台湾数位发展部资安署,二十四小时内轮番发出警示。这种多国监管同一天喊话的场面,通常只留给真正的地基级组件。理由也不难理解,PHP 支撑着全球约四分之三的网站,WordPress、Magento、Drupal、Laravel 这些熟面孔底下都是它。
受影响的范围是所有对外提供 Web 服务的 PHP,从 5.4 一路到 8.5.11,不管是 PHP-FPM(含 Docker 官方镜像)、Apache 的 mod_php、php-cgi,还是 FrankenPHP 和 LiteSpeed。官方判断 mod_php 风险最高:常驻进程的模式下,"前一个请求投毒、后一个请求吃下"最容易稳定复现,而且触发点位于应用代码执行之前。换句话说,框架选得多现代、代码审得多干净,在这个漏洞面前都不构成防线。
修复版本是 8.5.12、8.4.27、8.3.36 和 8.2.35,8.1 及更早版本已停止维护、上游不再出补丁。有两个容易踩的坑:发行版仓库里的包可能已打上回补丁但版本号未变,不看维护者说明容易误判;以及升级之后必须重启 PHP 进程,否则老 worker 会继续跑老代码,一场辛苦全白费——这个错误每年都有人犯。
至于有没有人在打,各方口径并不一致。加拿大方面称 PoC 已公开但暂未发现活跃利用;Datadog 则表示已接到多起野外利用报告,并观察到大规模无差别扫描;Cloudflare 的说法更直接,已检测到早期攻击并紧急下发 WAF 规则。三家都是可信来源,凑在一起反而说明现阶段没人能看清全貌。把"暂未发现"读成"下周再修也来得及",大概是这轮最贵的误读。
Go 与 Node.js:替同一批密钥收残局
这两家的更新看着不相干,其实共享同一个源头:印度 CA 机构 eMudhra 的 8 张中间证书私钥被泄露,其中 6 张用于 HTTPS,2 张用于代码签名。有人用这 8 个私钥各签了一条消息发给各大根证书项目,内容只有一句 "We have a problem here – Wayne"。没有勒索信,没有公开声明,堪称漏洞披露史上最简洁的一次通报。
后续是标准流程。Chrome 在几小时内拉黑,Firefox 当天跟进,苹果和微软补在随后两天。浏览器这一侧,事情办得干脆利落,算是整个事件里效率最正常的角色。
麻烦在工具链。Go 的证书验证器不做吊销检查,也不读浏览器那份黑名单,一张已被吊销的中间证书,只要对应的根证书还在信任库里,Go 程序就会继续信任它。所以 Go 只能改代码:10 月 19 日发布 1.27.3 和 1.26.10,在 crypto/x509 里内置了一份拒绝名单,走的还是内部的 URGENT 通道——这条通道只为"生态完整性受威胁"的漏洞开启,允许跳过提前公告。
其中最容易被忽略的一点是:装了新编译器,不等于线上服务变了。新的验证行为是编译进二进制的,只有重新构建并真正部署才算修好。容器镜像、静态编译的命令行工具、单文件可执行程序,都得单独核对。而 go version 查的是本机工具链,答不了"线上那个二进制到底是谁编的"这个问题。
Node.js 在同一周的例行安全版本里做了同样的证书清理,顺手修了十个自身漏洞。最重的一个在 Brotli 解码器里,越界写能直接升级为远程代码执行。任何会把不可信压缩数据喂进解码器的服务都在这条线上——反向代理解压、日志消费、上传预处理,这类组件平时极少被点名,出事时却总在第一排。另外三个高危集中在 TLS 主机名校验:全角数字书写的 IP、能宽松解析为地址的主机名,都能绕过证书检查。还有一条相当隐蔽:以打包方式构建的 Node 应用,可能在每个进程里重复产出同一批"随机"值,若 token 或 nonce 依赖它,值得立刻自查。
新版为 22.23.4、24.22.1 和 26.12.1,官方同时提醒,已停止维护的老版本同样受影响。
两类老问题,又一次重演
三件事放一起看,看到的是两个熟悉的面孔。
一是信任根的单点。一个 CA 出事,能让编译器发紧急版、JS 运行时发安全版、四家浏览器同日拉黑,还连累一批 VPN、企业中间盒和物联网设备等着固件更新。浏览器有黑名单与证书透明度机制兜底,但容器镜像和嵌入式设备用的是各自那份陈旧、常年无人打理的根证书包。于是"浏览器早就拦了"和"你的服务仍然信着"可以同时成立,且毫不矛盾。
二是异常路径。PHP 那两个洞与 Node 的 Brotli,根因都不在正常流程里,而在内存不足、解码失败这些平时无人行走的分支上。正常路径写得再漂亮,异常路径没人跑一遍,漏洞就静静长在那里。这类缺陷不会被单元测试抓住,只会被攻击者找到。
如果只留一句给这周:先敲一遍 php -v,再确认线上那个 Go 二进制是用什么版本编出来的。是二进制,不是开发机上的 go version。
最后一句带点牢骚。这轮最危险的或许不是漏洞本身,而是"暂未发现在野利用"这几个字带来的心理松弛。每次看到它,都值得反问一次:这是结论,还是仅仅暂时还没人公开说。
