属于大家的
VPS知识分享站

PHP、Node.js、Go、Java 同月爆出高危漏洞:今晚先补哪个、升到哪版、怎么查

先说结论:2026 年 10 月这半个月,PHP、Node.js、Go、Java 四个运行时先后发了安全更新,凑齐了一轮高危漏洞。PHP 的两个洞 CVSS 9.2,未认证请求就能打,PoC 已经在传;Node.js 修了一个 Brotli 越界写,能到远程代码执行;Go 一次补了 15 个,最狠的是恶意客户端能把 HTTP/2 服务打崩;Java 这边 Oracle 十月 CPU 给 Java SE 发了 55 个补丁,生态里 Spring 还有一个 9.8 的 SSRF/RCE。

如果你手上跑着 PHP 站点、Node 接口、Go 服务或者 Java 应用,今天先别研究原理,把版本对一遍。下面这份清单可以直接拿去核对:

  • PHP:升到 8.5.12、8.4.27、8.3.36、8.2.35(CVE-2026-109618、CVE-2026-109619)
  • Node.js:升到 26.12.1、24.22.1、22.23.4(CVE-2026-111497 等)
  • Go:升到 1.27.2、1.26.9,然后重新编译(CVE-2026-97032 等 15 项)
  • Java:升到 8u503、11.0.32.1、17.0.20.1、21.0.12.1、25.0.4.1、26.0.2、27(Oracle 十月 CPU)

这篇把 PHP Node.js Go Java 漏洞的来龙去脉、影响面、自查命令和 24 小时处理顺序整理成一份能直接照做的清单。版本号都核对过官方公告,截止 2026 年 10 月 23 日。

日历上四个红色标记与警告图标,代表同月集中披露的四个漏洞
四个生态在同一时间窗口发补丁,先按外网可触发性排序,而不是按 CVSS 分数。

这次为什么值得连夜处理

四个生态同时出问题不稀奇,稀奇的是这次每一个都能被外部请求直接触发。

PHP 的两个洞在核心层,不在某个函数或扩展里。官方公告写得很直白:所有处理 Web 请求的 PHP 安装都受影响,包括 PHP-FPM、Apache mod_php、php-cgi、FrankenPHP 和 LiteSpeed;mod_php 的风险最高,因为未认证请求可以在任何应用代码执行之前触发攻击。WordPress、Drupal、Joomla、Laravel 这些跑在 PHP 上的东西,一个都躲不开。

Node.js 这次最高级别是 HIGH,不是 CRITICAL,但 Brotli 那个洞是越界写,理论终点是远程代码执行。Go 的问题更偏可用性:一个恶意客户端就能让 HTTP/2 服务崩溃或内存耗尽,对网关和反代是致命的。Java 自己的 CPU 这季没有 9 分级单点,可生态里的 Spring 和 Tomcat 都是实打实的 RCE 路径。

补丁窗口最常见的翻车不是“不知道怎么升”,而是“以为自己已经升了”:容器镜像里还是旧运行时,Go 二进制里编的还是旧工具链,Java 换了 JRE 却没换应用里的 Spring。下面按生态拆开讲,每个都给出确认方法。

四个生态的漏洞清单

生态 披露时间与关键漏洞 修复版本
PHP 10 月 21 日披露;CVE-2026-109618 / 109619,核心层 RCE,CVSS v4.0 9.2 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35
Node.js 10 月 21 日披露;CVE-2026-111497,Brotli 越界写可 RCE,另有 TLS 证书校验绕过等 26.12.1 / 24.22.1 / 22.23.4
Go 10 月 8 日披露;CVE-2026-97032,HTTP/2 服务崩溃,共 15 项 1.27.2 / 1.26.9
Java 10 月 20 日披露;Oracle CPU 中 Java SE 55 项,生态 CVE-2026-47884(9.8) 8u503 / 11.0.32.1 / 17.0.20.1 / 21.0.12.1 / 25.0.4.1 / 26.0.2 / 27

看表的时候注意两件事。第一,CVSS 分数只能当排序参考:PHP 的 9.2 是 CVSS v4.0,Spring 的 9.8 是 v3.1,两套算法不能直接横比。第二,修复版本要精确到构建号,尤其是 Java 的 8u503 和 11.0.32.1,只写“Java 8”或“Java 11”没法判断。

PHP2Shell:最急的一个

10 月 21 日,PHP 官方发布了 8.5.12、8.4.27、8.3.36、8.2.35,修两个高危 RCE。国内 CNCERT 在 10 月 22 日发了风险提示,编号 CNTA-2026-0006,明确说技术细节和 PoC 已广泛传播,业界还在研究完整的 RCE 利用链。

两个洞的成因不一样,但都出在请求生命周期管理上:

  • CVE-2026-109618:内存耗尽(OOM)处理会打断 PHP,此时内部请求数据只初始化了一部分;请求清理阶段却把这些无效数据当成有效数据处理。
  • CVE-2026-109619:请求持有的内部状态在底层内存释放后仍然存活;同一个 worker 处理的下一个请求,可能在正常初始化重置之前用到这份残留状态。

这两个都不是“某个参数没过滤”那种应用层漏洞,WAF 拦不住,代码审计也审不出来。官方说得很清楚:没有完整的缓解方案,升级是唯一安全的选择。

电路板上破裂的玻璃存储单元漏出橙色光,象征内存破坏漏洞
PHP 和 Node.js 这次都是内存层面的问题,配置缓解只能降低概率,升级才能修掉。

升级路径不复杂,难的是别漏掉边角:

  • 用发行版包管理器的,等厂商的补丁包(Debian/Ubuntu 的安全源、Red Hat 的 RHSA),别自己下源码覆盖包管理器的文件。
  • 用 Docker 的,改基础镜像 tag,重新构建应用镜像。只在宿主机上升级 PHP 对容器没用。
  • PHP 8.1 及更早版本官方已停止更新。官方为 7.4、8.0、8.1 提供了最小化源码 backport 分支,但那是给“有能力自己编译”的人准备的;能迁移就迁移。
  • PHP 8.2 会在 2026 年 12 月 31 日 EOL。现在还在 8.2 的,这次顺手评估 8.3 或 8.4,别等到 12 月再赶。

如果今晚实在升不了,官方给了两组临时缓解,注意它们只是降低特定攻击路径的成功率,不等于安全:

; php.ini 或 FPM pool 配置,不要用 ini_set()
memory_limit = -1
post_max_size = 8M
session.upload_progress.enabled = 0
; PHP 8.5 额外加一行
fatal_error_backtraces = 0

对应的要求是:把内存上限交给容器或 cgroup 兜底,只杀受影响的 worker,不要用 RLIMIT_AS 或 RLIMIT_DATA,那会反过来触发漏洞路径;限制请求体大小、字段数、multipart 分片数和头部数量;改完必须重启所有 worker,FPM 的 .user.ini 和 ini_set() 不生效。

Node.js:Brotli 越界写,别只盯着版本号

10 月 21 日,Node.js 为 26.x、24.x、22.x 三个发布线发了安全版本:26.12.1、24.22.1、22.23.4。最严重的是 CVE-2026-111497,Brotli 解码器越界写,可以导致远程代码执行。

这里有个容易误判的地方:Node 的 HTTP 服务不会自动解压请求体,所以“我只写了个接口”不一定暴露。真正危险的是那些对不可信数据调用 Brotli 解压的代码路径,比如反代或网关做内容转码、上传服务解压、缓存服务预解压。只要你的代码里出现过 brotliDecompress 或 createBrotliDecompress,并且输入来自外部,就按最高优先级处理。

grep -rn "brotliDecompress\|createBrotliDecompress" /path/to/app --include=*.js --include=*.ts

同一批更新里还有几个不那么起眼、但对业务影响很直接的问题:TLS 证书主机名校验可以被全角数字、松散解析的 IP、非规范 IPv4 主机名绕过;dns.resolve 会截断含 NUL 字符的域名;crypto.randomUUID() 和 randomInt() 的熵缓存会被写进用户态启动快照,导致每个进程重复同一批随机值。最后这个对做邀请码、重置令牌、临时密码的服务是实打实的风险。

另外,这轮还更新了 CA 证书包,原因是 eMudhra 的中间 CA 被攻破。证书信任链的事没有“下个版本再说”的余地,跟着升。

版本确认:

node -v
# 容器里别只看宿主机
docker run --rm your-image:tag node -v

22.x 已经进入维护 LTS,24.x 是当前活跃 LTS,26.x 是 Current。跨大版本升级要跑一遍测试,但同一发布线内的小版本安全更新,兼容性风险很低,没有理由拖。

Go:15 个安全修复,HTTP/2 和 CONNECT 最要命

10 月 8 日,Go 发布了 1.27.2 和 1.26.9,一次带 15 个安全修复。对跑 Go 网关、反代、API 的团队来说,这一批的含金量很高:

  • CVE-2026-97032:HTTP/2 服务端在 HPACK 编码器上存在竞态。一个 goroutine 在编码响应头,另一个在处理客户端发来的 SETTINGS_HEADER_TABLE_SIZE 并修改编码器表大小,恶意客户端反复发请求、反复改表大小,就能把服务打崩。
  • CVE-2026-78659:HTTP/2 的 Trailer 头可以让服务端分配不成比例的内存,绕过 MaxHeaderValueCount 和 MaxHeaderBytes 限制。
  • CVE-2026-56866 / CVE-2026-94439:HTTP/1 的 CONNECT 请求处理不当,连接会失步,在反向代理场景下可能造成请求走私和跨用户响应污染。
  • CVE-2026-78669:大量 SETTINGS_INITIAL_WINDOW_SIZE 小帧可以把 CPU 打满。
  • CVE-2026-97031:crypto/tls 的 ECH 外层扩展引用可以造成内存耗尽。
  • CVE-2026-94440:multipart 解析在特定边界下绕过内存限制。
  • CVE-2026-94448 / CVE-2026-97030:html/template 的转义问题,可能引入 XSS。
  • CVE-2026-94444 / CVE-2026-94447:cmd/go 在恶意项目加恶意 GOPROXY 的组合下可以绕过校验和,属于供应链风险。

Go 的特殊之处在于标准库是编译进二进制的。换一台新机器、升级系统里的 golang 包,都不会改变已经编好的程序。必须用新工具链重新构建,再替换线上二进制。

go version
go version -m /opt/app/server | head -8
GOTOOLCHAIN=go1.27.2 go build -trimpath -o server ./cmd/server

如果项目里有一堆服务,先跑一遍 govulncheck,按“能走到漏洞代码”的调用链排优先级,别只看依赖列表里有没有 CVE:

go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...

Java:十月 CPU 与生态里的两个 RCE

Oracle 在 10 月 20 日发布了十月 CPU,全部产品线合计 1295 个补丁,其中 Java SE 占 55 个,49 个可以远程无认证触发。这一季 Java SE 的最高分是 7.5,没有 9 分级别的单点,受影响组件集中在 Networking、JGSS、JAXP、ImageIO、JSSE、Libraries、2D、Compiler 这些地方。

受影响版本和修复版本一一对应:8u503、11.0.32.1、17.0.20.1、21.0.12.1、25.0.4.1、26.0.2、27,GraalVM for JDK 和 GraalVM Enterprise Edition 也跟着更新。用 Temurin、Corretto、Zulu、毕昇这些发行版的,等对应厂商的同版本号构建,时间通常在同一天或次日,别只盯着 Oracle 的下载页。

Java SE 本身的分数不算炸裂,但生态里这两个洞要单独拎出来:

  • Spring Framework CVE-2026-47884(8 月披露,CVSS 9.8):应用里用了 XsltView,同时存在 “/**” 这种会导致视图渲染的映射,且视图名没有显式指定时,可以造成 SSRF 和 RCE。影响 7.0.0-7.0.8、6.2.0-6.2.19、6.1.0-6.1.28、6.0.0-6.0.30、5.3.0-5.3.49。开源线只有 7.0.9 拿到修复,6.2.20、6.1.29、6.0.31、5.3.50 走的是企业支持渠道。还在 6.2.x 开源版上的团队,这次要么升 7.0.9,要么认真评估企业支持,别指望发行版补丁。
  • Apache Tomcat CVE-2026-34486(5 月披露,CVSS 7.5):集群部署下,Tribes 通道的 EncryptInterceptor 在解密失败后仍然继续处理消息,配合 classpath 上的反序列化链可以未认证 RCE。PoC 已经公开,利用条件是集群开启、Tribes 接收端口(默认 4000)网络可达、用了 EncryptInterceptor、classpath 里有可用的反序列化库。修复版本是 9.0.117、10.1.54、11.0.21。
围墙内的服务器集群,一扇小门向外射出红色光束
Tomcat 集群的 Tribes 端口一旦对公网开放,就等于把反序列化入口摆在门口。

自查命令:

java -version
# Tomcat 版本
unzip -p $CATALINA_HOME/lib/catalina.jar META-INF/MANIFEST.MF | grep -i version
# 集群端口有没有对外
ss -lntp | grep 4000

如果 Tomcat 根本没开集群,4000 端口就不该存在;如果开了但只在内网,至少确认安全组和主机防火墙没有把它放出去。用不到集群的,直接关掉,比打补丁更彻底。

30 分钟摸清家底:四条命令

补丁之前先做一次版本快照,别凭印象。把下面几条命令的输出存到一个文件里,作为今晚的基线:

php -v
node -v
go version
java -version 2>&1

容器环境再加两条,很多人就是在这里漏掉的:

docker ps --format '{{.Image}}' | sort -u
docker images --format '{{.Repository}}:{{.Tag}}' | sort -u

PHP 还要看配置,因为缓解措施和攻击面都跟它有关:

php -i | grep -E 'memory_limit|post_max_size|session.upload_progress.enabled'
php-fpm -tt 2>&1 | grep -E 'memory_limit|post_max_size'

Go 服务要看到二进制里编进去的版本,而不是构建机上装的版本:

go version -m /path/to/binary | head -8

Java 应用除了 java -version,还要确认应用依赖里的 Spring 和 Tomcat 版本。Maven 项目直接看依赖树:

mvn dependency:tree | grep -E 'spring-webmvc|spring-core|tomcat-embed'

24 小时内的处理顺序

服务器图标经过漏斗汇聚成带绿色对勾的受保护服务器
补丁流程要收敛成一条可验证的流水线:版本快照、升级、重启、复查。

如果只能挤出一天,按下面这个顺序做,先处理“外部可触发、且已经有公开利用”的:

  1. 0-1 小时,列外网入口。把 80/443、API 网关、反代、管理后台、集群端口全列出来,标注每个入口后面跑的是哪个运行时。没有外部入口的服务排后面。
  2. 1-3 小时,先打 PHP。PoC 已经在传,这是唯一一个“攻击者比你快”的洞。升级后重启 PHP-FPM 和 Web 服务器,确认 worker 全部换新。
  3. 3-5 小时,再打 Node.js。重点检查容器基础镜像和自建的反代、转码、上传服务。有 Brotli 解压入口的先摘掉入口再升级。
  4. 5-8 小时,重编 Go 服务。统一 GOTOOLCHAIN,走一遍 CI,确认产物里的版本号,再灰度替换。反代和网关优先。
  5. 8-12 小时,处理 Java。先上 Oracle CPU 或发行版构建,再处理 Spring 和 Tomcat。Tomcat 集群用不上的直接关,4000 端口从安全组里删掉。
  6. 12-24 小时,验证和观察。看 5xx、worker 重启、OOM、异常子进程、异常出站连接。升级前给机器打快照,留好回滚路径。

不要做的事也说清楚:不要在生产上直接 docker pull latest 然后重启;不要只升宿主机不管容器;不要用 memory_limit 这类缓解措施代替升级;不要一次把所有服务同时换掉,出问题会分不清是哪个改动导致的。

不能马上升级时,先做这四件事

有些系统确实没法当天升,那就先把攻击面收窄,争取时间:

  • PHP:按官方建议设置 memory_limit=-1、post_max_size=8M(有上传就 32M)、session.upload_progress.enabled=0,用 cgroup 限制内存,把不同站点拆到不同 FPM pool,别让一个 pool 被打了带着全站一起挂。
  • Node.js:如果业务不需要 Brotli 请求体,在反代层直接拒绝 Content-Encoding: br,或者把解压逻辑从边缘服务里挪走;限制请求体大小和并发。
  • Go:在负载均衡层终止 HTTP/2、回源用 HTTP/1.1,能挡掉 HPACK 竞态和 Trailer 内存放大;对 CONNECT 方法直接返回 405;限制头部数量和大小。
  • Java:关掉 Tomcat 集群,封掉 4000 端口;排查 XsltView 和 “/**” 映射,能不用就不用;给反序列化加白名单(JEP 290 的过滤器)。

这些手段的共同点是“降低被打中的概率”,不是“修好了”。只要版本没变,洞还在。

补丁之后:把“下次”变成例行工作

这次四个生态撞在一起,暴露的其实是同一个问题:大多数团队没有一份能查的运行时清单。补完这次,建议顺手做三件事。

第一,把版本信息纳入监控。每台机器、每个镜像、每个二进制的运行时版本,定期采集,和官方最新安全版本比对。不用一开始就做得很复杂,一个每天跑的脚本加一张表就够。

第二,订阅一手来源,别等二手新闻。PHP 的 releases 页面、Node.js 的 vulnerability 博客、Go 的 vulndb 和 release notes、Oracle 的 CPU 日历、Spring 的 security 公告,这五个源覆盖了大部分情况。

第三,把扫描工具接进 CI。Go 用 govulncheck,容器用 Trivy 或 Grype,依赖用 Dependabot/Renovate/osv-scanner。工具不能替代判断,但能保证“有新漏洞时,你知道哪些服务受影响”。

还有一条经验:补丁窗口要固定。每月留一个两小时的低峰窗口,专门处理安全更新,比每次出事临时拉人靠谱得多。真到了 RCE 已经在野利用的时候,你拼的不是技术,是清单全不全、回滚快不快。

常见问题 FAQ

Q1:我只跑 Nginx 静态站,需要跟着升吗?

不需要。这四个洞分别影响 PHP、Node.js、Go、Java 运行时。纯静态站没有这些运行时,除非你还有反代到后端的接口服务。

Q2:PHP 8.2 还能用到什么时候?

官方支持到 2026 年 12 月 31 日,之后不再有安全更新。这次 8.2.35 是安全版本,但两个月后就会断供,建议这次一并评估升级到 8.3 或 8.4。

Q3:Docker 里怎么确认 PHP 版本?

进容器执行 php -v,或者 docker run –rm 你的镜像 php -v。只看宿主机没用,容器用的是镜像里的运行时。

Q4:Go 程序把服务器上的 Go 升级了,为什么还报漏洞?

因为 Go 把标准库静态编进了二进制。升级构建环境只影响以后的新构建,已经编好的程序必须重新编译、重新部署才会带上修复。

Q5:Java 用 OpenJDK 发行版,需要等 Oracle 吗?

不需要等 Oracle 的安装包,但需要等你的发行版厂商发布同版本号的构建。Temurin、Corretto、Zulu、毕昇通常跟得很紧,关注厂商的安全公告即可。

Q6:升级 PHP 小版本会不会把站点搞挂?

同一分支的安全更新兼容性很高,风险主要来自扩展和 opcache 配置。先在预发环境跑一遍,重点看上传、session、图片处理这些路径,再上生产。

参考来源

总结

这次四个生态的更新,本质上考的是同一件事:你能不能在一天内说清楚“我有哪些服务、跑的什么版本、哪个能从外面打到”。PHP 的洞最急,因为有公开 PoC;Go 的最容易被漏,因为要重新编译;Java 的最容易被误判,因为分数不高但生态里的 RCE 是真的;Node.js 的最容易只升一半,因为容器镜像和宿主机是两套东西。

今晚能做的,就是先把版本快照打出来,按外网入口排序,一个一个升级、重启、验证。别追求一次全做完,先把能被未认证请求打到的那些处理掉。

升级验证需要一台能随时重装、随时回滚的机器。比较稳妥的做法是开一台按小时计费的海外 VPS 做预发,验证完再动生产;萤光云香港 CN2 VPS 1 核 1G 体验型就能跑 PHP、Node 和轻量 Java 服务,用来做补丁验证够用。需要多节点对比测试的,也可以直接开按小时计费的实例,测完释放。

相关推荐

赞(0)
未经允许不得转载:VPS知识分享站 » PHP、Node.js、Go、Java 同月爆出高危漏洞:今晚先补哪个、升到哪版、怎么查