本文主要记录折腾过程,部分内容由 AI 整理创作。

背景

2026 年 10 月 21 日,PHP 官方公开了两项严重安全漏洞,分别编号为 CVE-2026-109618 和 CVE-2026-109619,社区将其称为 PHP2Shell。两项漏洞的 CVSS v4.0 评分均为 9.2,属于严重级别。攻击者可能通过构造特定的网络请求,在未经过身份验证的情况下触发远程代码执行(RCE),进而以 PHP 进程的权限执行任意代码。

这次漏洞涉及 PHP 解释器自身,而不是某个特定的 CMS 或框架。因此,使用 WordPress、Typecho、Laravel 等程序并不能规避风险。只要底层 PHP 运行环境受影响,并且存在可被攻击者访问的请求入口,就需要检查和更新对应的运行环境。

两项漏洞的根因与 PHP 请求处理过程中的内存管理有关:

  • CVE-2026-109618:PHP 在处理内存耗尽等异常情况时,可能继续处理尚未完整初始化的内部请求数据。
  • CVE-2026-109619:PHP 在复用工作进程处理后续请求时,可能使用已经释放的内部状态,导致释放后使用(Use-After-Free)问题。

值得注意的是,亚马逊安全团队披露,其蜜罐系统在 2026 年 10 月 17 日 就已观测到疑似利用 PHP2Shell 的攻击尝试,早于漏洞公开披露日期。这意味着不能简单地认为漏洞公开之后才开始出现攻击活动。对于直接暴露在公网的 PHP 服务,除了尽快安装补丁,还应留意此前是否存在异常请求或入侵迹象。

参考:

PHP 官方修复版本与 Ubuntu 软件包版本

PHP 官方针对受支持的分支发布了安全更新。上游修复版本如下:

PHP 分支上游修复版本
PHP 8.58.5.12
PHP 8.48.4.27
PHP 8.38.3.36
PHP 8.28.2.35

官方公告:PHP 2026 年安全更新记录。

不过,使用 Ubuntu APT 软件包安装 PHP 时,不应直接拿上游版本号判断是否修复。Ubuntu 可以将安全补丁回移到发行版原有的软件包版本中,因此 phpinfo() 仍可能显示原来的 PHP 版本号。

根据 Ubuntu 安全公告 USN-8948-1,各发行版对应的修复包版本如下:

Ubuntu 发行版默认 PHP 分支修复软件包版本
Ubuntu 22.04 LTSPHP 8.18.1.2-1ubuntu2.28
Ubuntu 24.04 LTSPHP 8.38.3.6-0ubuntu0.24.04.13
Ubuntu 26.04 LTSPHP 8.58.5.4-0ubuntu1.5
Ubuntu 26.10PHP 8.58.5.9-0ubuntu2.1

具体版本和后续更新应以 Ubuntu 官方安全公告 为准。上表中的版本是对应公告给出的修复基线,不代表之后不会再有更新版本。

Node.js 也发布了安全更新

同一时间,Node.js 项目于 2026 年 10 月 21 日发布了新一轮安全更新,修复了包括 Brotli 解码器越界写入在内的多项安全问题。其中,CVE-2026-111497 涉及 Brotli 解码过程,官方将其评定为 High 级别,并指出该问题可能导致远程代码执行。

官方发布的修复版本包括:

Node.js 分支修复版本
Node.js 22.x22.23.4
Node.js 24.x24.22.1
Node.js 26.x26.12.1

官方公告:Node.js — Wednesday, October 21, 2026 Security Releases。

因此,这次维护不仅涉及 PHP,也有必要检查服务器上的 Node.js 运行时及其相关进程。本文主要记录我在不同 Ubuntu 服务器上进行版本检查、软件包更新和服务重启的过程。

参考资料

Ubuntu 24 服务器

更新 fnm

虽说可能没多大用,但还是更新一轮吧。

curl -fsSL https://fnm.vercel.app/install | bash -s -- --skip-shell

参考:https://github.com/schniz/fnm

更新 NodeJS

fnm install --lts --use

理论上是 24.22.1 也是修复过本次 Brotli 解码器漏洞的版本

npm install -g pnpm pm2

npm config set allow-scripts=pnpm --location=user

之后补全全局依赖,重启 PM2 进程,如无意外可直接重启服务器验证

pm2 update
Be sure to have the latest version by doing `npm install pm2@latest -g` before doing this procedure.

>>>> In-memory PM2 is out-of-date, do:
>>>> $ pm2 update
In memory PM2 version: 7.0.3
Local PM2 version: 7.1.0
pm2 save

fnm uninstall v24.19.0
fnm default lts-latest

reboot

重启后尝试恢复进程失败,大概率还是版本问题。

pm2 resurrect

只好将所有项目依次重启一次,本次升级完成。

更新 PHP

理论上直接执行 apt 的升级然后重启即可。

# 刷新软件包索引
sudo apt update

# 检查更新候选版本
sudo apt-cache policy php8.3-cli php8.3-common php8.3-curl php8.3-fpm php8.3-mbst    ring php8.3-mysql php8.3-opcache php8.3-readline php8.3-xml

# 升级
sudo apt install --only-upgrade php8.3-cli php8.3-common php8.3-curl php8.3-fpm php8.3-mbstring php8.3-mysql php8.3-opcache php8.3-readline php8.3-xml

# 或者这样也行
# sudo apt install --only-upgrade '?name(^php[0-9.]+$)'

# 重启
sudo systemctl restart php8.3-fpm

使用 php -v 没法完整确定当前版本是否是修复版本,建议通过 apt 命令核查,上方表格有提供。

apt list '?installed ?name(^php)'
Listing... Done
php-common/noble,now 2:93ubuntu2 all [installed,automatic]
php8.3-cli/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed,automatic]
php8.3-common/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed,automatic]
php8.3-curl/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed]
php8.3-fpm/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed]
php8.3-igbinary/noble,now 3.2.13-1ubuntu3 amd64 [installed,automatic]
php8.3-mbstring/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed]
php8.3-mysql/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed]
php8.3-opcache/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed,automatic]
php8.3-readline/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed,automatic]
php8.3-redis/noble,now 5.3.7+4.3.0-3ubuntu1 amd64 [installed]
php8.3-xml/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed]

php8.3-redis、php8.3-igbinary 等扩展,版本号和 PHP 核心软件包不同是正常的,不需要强行要求它们也变成 8.3.6-0ubuntu0.24.04.13。

Ubuntu 26 服务器

另外一台服务器此前升级过一次,从 22.04 手动升级到了 24.04,期间有一些维护债务,目前决定更换为 26.04 镜像重新配置环境,不得不说重装的确能解决各种奇怪的问题,直接装最新版的 PHP 包,杜绝后患。

相较于之前的版本,主要是 MariaDB 发生了变化,以及 NodeJS 和 Composer 我改用了单独的 deploy 用户管理,和 root 用户做区分,并且核心服务依旧是 root 下安装,一些功能比如 git 和 composer 也能正常在 deploy 下使用。

具体内容我也更新到了此前的文章《从零开始部署 Ubuntu 服务器环境》上,大版本更新之后每个依赖软件包的配置都有可能变化,但这边尽可能以新版为准,主要作为自己的重装清单来维护,逐步挖掘出更好用的运维管理方法。