笑PHP漏洞的先别笑了:Node.js同日爆出10项漏洞含Brotli远程代码执行,附服务器自检与升级指南

前言:PHP刚修复两项CVSS 9.2的严重漏洞,Node.js又在同一天发布安全更新,10项漏洞中Brotli解压缺陷可导致远程代码执行,连后端主动抓取的数据都可能成为攻击面。本文梳理服务器版本自检命令、容器与CI排查、EOL版本迁移及升级注意事项,帮你避开侥幸心理,尽快打上补丁。

大周三的晚上,我本来正乐呵呵地刷着 PHP 漏洞的瓜。

刷着刷着,刷到一条 Node.js 的安全公告。

我愣了三秒,默默把瓜放下了。

吃瓜吃到自己头上,说的就是这种场面。

笑 PHP 的先别笑了
笑 PHP 的先别笑了

先给不冲浪的朋友补一下 PHP 这边的情况。

10 月 21 日,PHP 发布安全更新,修复了两项严重漏洞,CVSS 评分都是 9.2。满分 10 分,9.2 是什么概念呢,就是官方自己都觉得必须连夜发版的级别。攻击者不需要登录,就可能在受影响的服务器上直接执行代码。

更骚的是漏洞的位置。出在 PHP 处理内存不足和请求状态的底层代码里,官方认为 Apache 的 mod_php 部署风险最高,而且已经有攻击演示,能在网站业务代码运行之前就把漏洞触发。

翻译成人话,你的登录校验、你的权限判断、你辛辛苦苦写的所有业务逻辑,都还没轮到上场,攻击就已经结束了。

这瓜大到什么程度呢,大到惊动了日本首相。

10 月 21 日晚,高市早苗在 X 上提醒网站运营者,赶紧检查 PHP 的使用情况,尽快应用补丁,一时修不了的,可以考虑暂时停站。

第二天,她自己的官网就停了。办公室先联系管理员暂停访问,处理完再恢复,前前后后发了两条帖子。她还特意提醒了一句,网站负责人未必能及时看到深夜的安全警报,负责维护的人也得留意。

一个国家的首相,为自己的个人官网连发两条帖子处理 PHP 漏洞。说实话,我看到这个画面的时候愣了好几秒。

CERT-EU 也跟着催各机构立即修补,来不及更新的,先把对外服务跟公网隔离起来。PHP 那边给出了 8.2.35、8.3.36、8.4.27、8.5.12 四个修复版本,同时维护着 PHP 服务的,可以顺手核对一下。

到这里为止,还是一个经典的安全吃瓜故事。大家转发,大家调侃,X 上有个叫 KENOUGH 的还在说反话,说自己用 PHP 就是因为那边根本不会出这种事。

然后,同一天,Node.js 也发了安全更新。

10 项漏洞,4 项高危,3 项中危,3 项低危。

同一天,两边都有补丁要打
同一天,两边都有补丁要打

吃瓜群众,当场变成了瓜本身。

我看到这个消息的时候,第一反应不是震惊,是心虚。因为我太清楚自己是个什么状态了,服务器上跑着一堆 Node 服务,版本基本处于「能跑就坚决不动它」的玄学状态。

于是那天晚上,我把手上的东西翻出来查了一遍。过程还挺有意思的,我按顺序说。

第一步,查本机。官方给了一条命令,能直接看到版本和二进制路径。

node -p "JSON.stringify({node:process.version,bin:process.execPath})"

我本机是 24.x,但不是最新的 24.22.1。心里咯噔了一下,还好,属于要升但不致命。

第二步,翻服务器上的容器。这一翻就出事了,有个老服务,还跑在 Node 20 上。

Node 20 是什么概念呢,已经停止支持了。官方这次压根没给 18 和 20 发布修复版,公告里还专门提醒了 EOL 版本的风险,翻译一下就是,老版本的用户我们救不了,请自行迁移。

尼玛。

第三步,查 CI。本机升好了就完事了吗,没有。CI Runner 里可能带着另一套 Node,容器镜像里可能还冻着一个旧版本。你本机升到天上去,部署出来的东西该旧还是旧。

第四步,我寻思跑个 npm audit fix 图个安心 = =

然后想起来,npm audit 查的是项目依赖包。这次修的洞,在 Node.js 本身和它的内置组件里,你把 package-lock.json 刷出花来也没用。

这一套查下来,我人已经麻了。本来是想吃个瓜,结果发现瓜田里每一株藤都跟我有关系。

说到这,就得聊聊这批漏洞里最值得展开的一个,Brotli。

编号 CVE-2026-111497,可能导致远程代码执行,是这次 4 项高危里最扎眼的一个。

Brotli 是一种压缩格式,网页传输里常见的 Content-Encoding: br,说的就是它。服务器为了省流量,会把响应压缩了再发,客户端收到之后再解压。整个互联网每天都在做这个动作,多到你都意识不到它的存在。

这次出问题的,就是解压环节。受影响的解码器,遇到攻击者精心构造的数据,可能越界写入内存,再往下走,就是远程代码执行。

有意思的地方来了。你问问自己,你的业务代码里,出现过 Brotli 这个词吗。

大概率没有。

但你只要用过 Node.js 里的 fetch,Undici 的实现在处理响应的时候,遇到 br 编码就会自动调用 zlib 的 Brotli 解压。也就是说,解压这个动作,在你完全不知情的情况下,已经在底层发生了。

你主动抓回来的数据,也是攻击面
你主动抓回来的数据,也是攻击面

拿链接预览来举例。用户在输入框里填一个网址,后端去抓这个页面、提取标题,很常见的功能对吧。这个过程里,外站返回的内容,会原原本本进入你的 Node.js 进程。

以前大家默认,对公网开放的接口才是攻击面,我后台定时跑的抓取任务不对外,应该没事吧。

Vercel 的安全说明把这个幻想戳破了。他们部署了 WAF 规则去拦相关攻击请求,但写得很清楚,函数从其他服务器主动抓回来的响应,不在这层入站防护的覆盖范围里。

也就是说,哪怕你的服务没有任何对外的接口,只要它会出门抓数据,恶意数据就可能跟着回来。研究人员已经在未修补的 Node 22、24、26 上,演示了内存泄露和命令执行。

做链接预览的、做远程图片抓取的、做任何「去外面拿点东西回来」的功能的,这块需要注意一下,重点查的方向不是装没装 Node,而是恶意数据会不会被送进受影响的解码路径,中间件和 HTTP 客户端都得连着看一遍。

这批补丁里还有一项挺邪门的,跟 crypto.randomUUID() 和 randomInt() 有关。

用自定义启动快照或者 SEA 打包的团队多看一眼,按官方说法,随机数缓存可能被一起保存进快照和单文件可执行应用里,导致不同进程取到相同的值。随机数这玩意儿,一旦不随机,token、凭证什么的,想想就头皮发麻。而且这类项目升级完还没完,快照和可执行文件得重新生成,旧包也得换掉。

那到底该升到哪,我直接说结论。

用 22 的,升到 22.23.4。用 24 的,升到 24.22.1。用 26 的,升到 26.12.1。前两个是 LTS,生产环境优先 LTS,老规矩。

还在用 18 和 20 的,这次没有补丁,别抱幻想,安排迁移吧。

X 上有个叫 Sambo 的吐槽说,PHP 和 Node 偏偏赶在同一个周三打补丁,这天值班的人可有得忙了。

我完全能想象那个画面。周三下午,一个运维老哥一边啃着外卖一边刷到新闻,然后看着手上一排服务器,深深地叹了一口气。

真的就是一声叹息。

顺着上面的再聊聊,升级的时候有几个容易漏的地方,都是我自己查的时候踩出来的。

那条查询命令,查到的是当前终端启动的 Node。已经在跑的服务,可能用的是另一个路径的二进制,得另行确认。容器要更新镜像重新部署,CI Runner 也要查。部署完之后,在应用的启动日志里把 process.version 和 process.execPath 记下来,确认每个实例都用上了修复版本,再把业务里用到的请求、解压、TLS 功能测一遍。

别嫌麻烦。这次连后端主动抓回来的数据都可能带来麻烦,你今天省下的十分钟,可能就是以后某天通宵排查的十个小时。

写到这,我突然想起了 1988 年。

那年,康奈尔大学一个叫罗伯特·莫里斯的学生写了一个蠕虫,初衷据他自己说,是想测一测当时的互联网到底有多大。结果蠕虫的繁殖逻辑写得太猛,感染了当时全网大约 10% 的机器。那年头全世界的互联网也就几万台机器,10% 已经是塌方级别的灾难了。他也因此成为第一个依据《计算机欺诈与滥用法》被定罪的人。

后来这哥们成了 MIT 的教授。而 37 年过去,互联网变了天翻地覆的样子,出事的剧本却几乎一模一样。一段没人注意的底层代码,一个被所有人在不知情的情况下共享的环节,然后全世界在同一周里一起打补丁。

安全圈有句流传很久的老话,世界上只有两种公司,一种已经被黑了,另一种还不知道自己被黑了。

这话听着有点刺耳,但我有时候觉得,他说的确实就是事实。你以为你在吃瓜,其实瓜田里每一株藤,都可能长在你家院子里。

所以,笑 PHP 的先别笑了。

回头看看自己的 Node.js,打开终端,跑一下那条命令,一分钟的事。

坦率的讲,我以前也总觉得安全这种事离自己很远,那是大厂运维该操心的。这次自己翻了一遍才发现,所谓攻击面,从来不是什么遥远的宏大叙事,就是你后台那个定时抓取任务,就是你容器里那个三年没动过的镜像,就是你以为 npm audit fix 一跑就能高枕无忧的侥幸。

瓜,吃完了。

该打补丁了。

能看到这里的兄弟,今晚就动手吧,别拖到下周三。

磨平一点点信息差,哪怕只是很小很小的一点。

/ 注意,本项目仅在 SyncMein 的500人小群分享。
/ 谢谢你看完了我的文章,我们下次再见吧。
/ 作者:明察
/ 投稿或爆料,请联系邮箱:mingcha@gqmg.com

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容