本文主要记录折腾过程,部分内容由 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 服务,除了尽快安装补丁,还应留意此前是否存在异常请求或入侵迹象。
参考:
- Ubuntu 官方安全公告:USN-8948-1
- Google Cloud:Responding to core PHP vulnerabilities
- AWS:Amazon Threat Intelligence identifies PHP2Shell exploitation prior to public disclosure
PHP 官方修复版本与 Ubuntu 软件包版本
PHP 官方针对受支持的分支发布了安全更新。上游修复版本如下:
| PHP 分支 | 上游修复版本 |
|---|---|
| PHP 8.5 | 8.5.12 |
| PHP 8.4 | 8.4.27 |
| PHP 8.3 | 8.3.36 |
| PHP 8.2 | 8.2.35 |
官方公告:PHP 2026 年安全更新记录。
不过,使用 Ubuntu APT 软件包安装 PHP 时,不应直接拿上游版本号判断是否修复。Ubuntu 可以将安全补丁回移到发行版原有的软件包版本中,因此 phpinfo() 仍可能显示原来的 PHP 版本号。
根据 Ubuntu 安全公告 USN-8948-1,各发行版对应的修复包版本如下:
| Ubuntu 发行版 | 默认 PHP 分支 | 修复软件包版本 |
|---|---|---|
| Ubuntu 22.04 LTS | PHP 8.1 | 8.1.2-1ubuntu2.28 |
| Ubuntu 24.04 LTS | PHP 8.3 | 8.3.6-0ubuntu0.24.04.13 |
| Ubuntu 26.04 LTS | PHP 8.5 | 8.5.4-0ubuntu1.5 |
| Ubuntu 26.10 | PHP 8.5 | 8.5.9-0ubuntu2.1 |
具体版本和后续更新应以 Ubuntu 官方安全公告 为准。上表中的版本是对应公告给出的修复基线,不代表之后不会再有更新版本。
Node.js 也发布了安全更新
同一时间,Node.js 项目于 2026 年 10 月 21 日发布了新一轮安全更新,修复了包括 Brotli 解码器越界写入在内的多项安全问题。其中,CVE-2026-111497 涉及 Brotli 解码过程,官方将其评定为 High 级别,并指出该问题可能导致远程代码执行。
官方发布的修复版本包括:
| Node.js 分支 | 修复版本 |
|---|---|
| Node.js 22.x | 22.23.4 |
| Node.js 24.x | 24.22.1 |
| Node.js 26.x | 26.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 updateBe 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.0pm2 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 服务器环境》上,大版本更新之后每个依赖软件包的配置都有可能变化,但这边尽可能以新版为准,主要作为自己的重装清单来维护,逐步挖掘出更好用的运维管理方法。
没有评论