PHP 与 Node.js 紧急安全更新(2026 年 10 月)
2026 年 10 月 21 日,PHP 与 Node.js 官方先后发布紧急安全更新,两组漏洞都可以直接影响线上服务,请尽快安排升级:
| 组件 | 受影响版本 | 修复版本 |
|---|---|---|
| PHP 8.5 | < 8.5.12 | 8.5.12 |
| PHP 8.4 | < 8.4.27 | 8.4.27 |
| PHP 8.3 | < 8.3.36 | 8.3.36 |
| PHP 8.2 | < 8.2.35 | 8.2.35 |
| Node.js 22.x | < v22.23.4 | v22.23.4 |
| Node.js 24.x | < v24.22.1 | v24.22.1 |
| Node.js 26.x | < v26.12.1 | v26.12.1 |
PHP 8.1 及更早、Node.js 20.x 及更早已 EOL,官方不再提供修复,请尽快迁移到受支持版本。
PHP:PHP2Shell 远程代码执行漏洞
PHP 官方于 2026 年 10 月 21 日发布紧急安全更新(外界称之为 PHP2Shell),修复两个可导致**未认证远程代码执行(RCE)**的严重漏洞,CVSS 评分均为 9.2:
| CVE 编号 | 漏洞名称 | 简要原理 |
|---|---|---|
| CVE-2026-109618 | OOM 内存损坏 RCE | 请求超出 memory_limit 时,PHP 通过 longjmp() 直接中止请求,可能打断内部数据的初始化;请求清理阶段把无效数据当作有效数据处理,造成内存损坏 |
| CVE-2026-109619 | 陈旧全局状态 RCE | 致命错误等场景下,请求私有的内部状态在内存被释放后未重置,同一 worker 处理的下一个请求可能复用已释放的内存(use-after-free) |
两个漏洞都位于几乎所有请求都要经过的内存管理和错误处理路径,无需登录、无需特定应用代码即可触发。PHP-FPM、Apache mod_php、php-cgi、FrankenPHP、LiteSpeed 等所有以 Web 方式运行 PHP 的环境均受影响(mod_php 风险最高)。漏洞细节与 PoC 已公开,唯一完整的修复方式是升级 PHP 并重启进程。
升级步骤
以 REMI 源安装的 PHP(Rocky Linux / CentOS 等 EL 系列)为例,直接用 dnf 升级到最新补丁版本即可:
sudo dnf -y update "php84*" # 升级 PHP 8.4 及其全部扩展到最新版本
sudo systemctl restart php84-php-fpm # 重启 PHP-FPM,让运行中的进程加载修复后的新版本
php -v # 确认版本号 >= 8.4.27
sudo dnf -y update "php83*" # 升级 PHP 8.3 及其全部扩展到最新版本
sudo systemctl restart php83-php-fpm # 重启 PHP 8.3 对应的 PHP-FPM
php83 -v # 确认版本号 >= 8.3.36
- 更新后必须重启对应的 PHP-FPM 服务,驻留在内存中的旧进程不会自动加载修复
- 同一台服务器安装了多个 PHP 版本时,每个版本都要分别升级并重启对应服务
- 如使用 Apache + mod_php,升级后需重启
httpd服务 - REMI 源的安装与管理详见《Rocky Linux 上安装和管理 PHP》
镜像源尚未同步怎么办
REMI 官方源(rpms.remirepo.net)在安全发布当天即提供了修复包(8.4.27 等),但第三方镜像同步存在延迟:截至 2026-10-22,阿里云镜像的 PHP 8.4 最高仍为 8.4.26。若执行上面的升级命令后版本没有变化,先确认仓库中实际可用的版本:
dnf --showduplicates list available "php84-php-common*" # 查看仓库中可用的版本
grep -RE "^(baseurl|mirrorlist|metalink)" /etc/yum.repos.d/remi*.repo # 查看 remi 源使用的地址
方案一:临时切换到官方源升级
若 baseurl 指向的是第三方镜像(如阿里云),可临时改回官方源,升级完成后再切回:
; /etc/yum.repos.d/remi.repo(节选)
[remi]
baseurl=https://rpms.remirepo.net/enterprise/8/remi/$basearch/
sudo dnf clean all && sudo dnf makecache # 刷新缓存
sudo dnf -y update "php84*" # 再次升级,升级后记得重启 php-fpm
国内访问
rpms.remirepo.net 速度可能较慢,若无法访问,可等待镜像同步(通常数天内完成),期间先按下一节缓解风险。方案二:等待镜像同步,期间先缓解风险
无法立即升级时的缓解措施
以下配置来自 PHP 官方建议,只能降低部分攻击路径的风险,不能替代升级,修改后必须重启对应的 PHP-FPM 服务:
; FPM 池配置(如 /etc/opt/remi/php84/php-fpm.d/www.conf),用 php_admin_value 强制设置,应用无法覆盖
php_admin_value[memory_limit] = -1 ; 移除可预测的内存超限触发点(CVE-2026-109618 的主要缓解,代价是应用失去 memory_limit 保护)
; php.ini(如 /etc/opt/remi/php84/php.ini)
session.upload_progress.enabled = 0 ; 关闭 session upload progress,封堵已确认的 session 攻击路径(CVE-2026-109619)
post_max_size = 8M ; 无上传需求时尽量调低;需要上传时也不宜过大,且 upload_max_filesize 必须小于 post_max_size
其他建议:
- 清理会在 PHP 初始化阶段产生弃用/警告诊断的 INI 配置(如
mbstring.http_input等遗留编码设置、非默认的filter.default等);该攻击路径与error_reporting、display_errors无关,隐藏报错不能防御 - 使用容器/cgroup 内存限制作为可用性兜底,不要用
RLIMIT_AS/RLIMIT_DATA代替,它们反而可能触发相同的漏洞路径 - PHP 8.5 用户还可设置
fatal_error_backtraces=0 - 8.2 / 8.3 等其他版本操作相同,把路径中的
php84替换为对应版本目录即可(如php83),对应修复版本见上文表格
Node.js:2026 年 10 月安全发布
2026 年 10 月 21 日,Node.js 官方针对 22.x、24.x、26.x 三条支持线发布安全更新,共修复 10 个漏洞。其中影响 22.x 的主要有:
| CVE 编号 | 严重程度 | 漏洞说明 |
|---|---|---|
| CVE-2026-111497 | 高 | 内置 Brotli 解码器越界写入:应用处理攻击者可控的 Brotli 数据(如请求体、fetch() 拿到的响应)时,可导致内存泄露甚至远程代码执行 |
| CVE-2026-106069 | 高 | 主机名解析为非规范形式的 IP 地址时,TLS 证书主机名校验被绕过 |
| CVE-2026-105482 | 高 | dns.resolve 会把包含 NUL 字符的主机名截断,可被用于绕过校验 |
| CVE-2026-106072 | 中 | 非规范 IPv4 主机名的证书校验缺陷,证书中的 DNS 名称可冒充 IP 端点 |
| CVE-2026-105481 | 中 | keep-alive 连接可能处理在请求发出前就已写入的响应 |
| CVE-2026-106074 | 中 | 使用 startup snapshot / 单可执行应用(SEA)时,crypto.randomUUID()、randomInt() 的熵缓存被固化,所有进程产生相同的随机值 |
| CVE-2026-106073 | 低 | 权限模型可被 fs.realpathSync 绕过 |
其中最严重的 Brotli 越界写入(CVE-2026-111497)无需特殊配置,外部输入即可触达,且官方没有提供临时缓解措施,升级是唯一修复方式。
升级步骤
- 通过包管理器或 Node.js 官网安装的用户:升级到对应修复版本即可
- nvm 用户:
nvm install 22.23.4 && nvm alias default 22.23.4 - 升级后必须重启 pm2、systemd 等托管的服务,驻留在内存中的旧进程不会自动更新
CentOS 7(glibc 2.17)的原地升级
CentOS 7 默认 glibc 版本为 2.17,必须使用 unofficial-builds 提供的 glibc-217 兼容包,安装方式详见《CentOS 7 中安全安装 Node.js 22.x》。已按该文安装旧版本的,按以下步骤原地升级到 v22.23.4:
1. 下载并解压新版本
cd /opt/node
# 下载修复了安全漏洞的 v22.23.4
wget https://unofficial-builds.nodejs.org/download/release/v22.23.4/node-v22.23.4-linux-x64-glibc-217.tar.gz
# 解压到新版本目录
mkdir -p /opt/node/22.23.4
sudo tar -xzf node-v22.23.4-linux-x64-glibc-217.tar.gz -C /opt/node/22.23.4 --strip-components=1
# 验证新版本
/opt/node/22.23.4/bin/node -v
# 输出:v22.23.4
2. 切换环境变量与 npm 配置
# 更新 ~/.bashrc 中的 PATH(zsh 用户请修改 ~/.zshrc)
sed -i 's|/opt/node/22.22.0|/opt/node/22.23.4|g' ~/.bashrc
source ~/.bashrc
# npm 全局路径指向新版本目录
mkdir -p /opt/node/22.23.4/.npm-global
/opt/node/22.23.4/bin/npm config set prefix '/opt/node/22.23.4/.npm-global'
- 旧版本目录下已安装的 npm 全局包不会自动迁移,需要在新版本下重新
npm install -g安装 - pm2、systemd 等托管的 Node 进程仍在内存中运行旧版本二进制,必须重启服务才真正完成升级,例如
systemctl restart <服务名>或pm2 restart all - 确认业务运行正常后,再删除旧版本目录:
sudo rm -rf /opt/node/22.22.0
写在最后
两组漏洞再次说明:即便是受支持的版本,也需要及时跟进官方的安全补丁;而 EOL 版本(PHP 8.1 及更早、Node.js 20.x 及更早)在重大漏洞面前没有任何修复可用,应尽快迁移。