紧急修复 PHP 严重漏洞 CVE-2026-109618

橘子 发布于 1 天前 66 次阅读


1. 背景

2026 年 10 月 21 日,PHP 官方发布安全更新,披露其内存耗尽(OOM)错误处理机制中存在堆内存释放后重用(Use-After-Free)漏洞,可能导致远程代码执行。相关报告:阿里云漏洞库 CVE-2026-109618

我尝试将自己的 PHP 升级到官方修复版本 8.3.36,却发现 apt 提示已经是最新版本。经过排查,原因是阿里云 Ubuntu 镜像没有及时同步最新的安全更新。最终通过临时添加 Ubuntu 官方安全源,成功安装了修复版本。

服务器环境:

  • 操作系统:Ubuntu 24.04 LTS
  • Web 环境:Nginx + PHP 8.3-FPM + WordPress
  • 软件源:阿里云镜像 mirrors.cloud.aliyuncs.com
  • PHP 原版本:8.3.6-0ubuntu0.24.04.12
  • PHP 修复版本:8.3.6-0ubuntu0.24.04.13

需要说明的是,Ubuntu LTS 通常采用安全补丁回移(Security Backporting)机制:将上游新版本中的安全修复移植到发行版维护的旧版本中,而不改变上游版本号。因此,即使升级成功,php -v 仍然可能显示 8.3.6。判断是否完成安全更新,应查看 Ubuntu 软件包的完整版本号。

2. 排查软件源

首先刷新软件包索引,检查 PHP 当前安装版本和可升级版本:

sudo apt update
apt-cache policy php8.3-fpm

当时的结果为:

Installed: 8.3.6-0ubuntu0.24.04.12
Candidate: 8.3.6-0ubuntu0.24.04.12

说明当前软件源没有提供更新版本。为了确认是否为阿里云镜像同步延迟,可以直接下载 Ubuntu 官方安全仓库的索引进行检查:

# 下载 Ubuntu 官方安全仓库索引(不修改系统软件源)
mkdir -p ~/php-check
curl -fL https://archive.ubuntu.com/ubuntu/dists/noble-security/universe/binary-amd64/Packages.xz \
  -o ~/php-check/Packages.xz

# 查询 PHP-FPM 的版本
xzcat ~/php-check/Packages.xz | \
  grep -A 15 '^Package: php8.3-fpm$' | grep '^Version:'

查询结果为 8.3.6-0ubuntu0.24.04.13,确认 Ubuntu 官方源已经更新,而阿里云镜像仍然提供 .12。

3. 临时换源并升级

为了避免永久修改原有软件源,可以临时添加 Ubuntu 官方安全源:

# 添加临时官方安全源
echo 'deb http://security.ubuntu.com/ubuntu noble-security main universe' | \
  sudo tee /etc/apt/sources.list.d/ubuntu-security-temp.list

# 刷新索引,确认 Candidate 已变为 .13
sudo apt update
apt-cache policy php8.3-fpm

确认候选版本正确后,升级已安装的 PHP 软件包:

# 先模拟升级,检查是否存在意外安装或删除
sudo apt-get -s upgrade

# 升级已安装且存在新版本的软件包
sudo apt upgrade

注意: 上面的 apt upgrade 会升级其他待更新的软件包,不适合只想更新 PHP 的场景。本次服务器还有大量 Docker、Samba 等软件包等待更新,因此实际操作中应使用 --only-upgrade 指定 PHP 软件包:

sudo apt install --only-upgrade \
  php8.3 php8.3-cli php8.3-fpm php8.3-common \
  php8.3-bz2 php8.3-curl php8.3-gd php8.3-intl \
  php8.3-mbstring php8.3-mysql php8.3-opcache \
  php8.3-readline php8.3-xml php8.3-zip

这里列出的是本次服务器已经安装的 PHP 软件包。其他服务器应根据 dpkg -l | grep '^ii php8.3' 的结果调整。

--only-upgrade 不会主动安装命令中列出的未安装软件包,但仍可能为了满足依赖关系安装其他软件包。执行前可以使用 apt-get -s install --only-upgrade ... 模拟检查,并仔细阅读 APT 的安装、升级和删除清单。

4. 检查升级结果

升级后检查完整版本号、PHP-FPM 状态及相关模块:

# 检查 PHP 核心软件包版本
dpkg-query -W php8.3-cli php8.3-fpm php8.3-common

# 检查所有 PHP 8.3 软件包
dpkg-query -W -f='${Package} ${Version}\n' 'php8.3*'

# 重启 PHP-FPM 并确认服务正常
sudo systemctl restart php8.3-fpm
systemctl is-active php8.3-fpm

# 如有异常,查看服务日志
sudo journalctl -u php8.3-fpm -n 20 --no-pager

本次核心软件包均成功更新至 8.3.6-0ubuntu0.24.04.13,PHP-FPM 状态为 active。

有两个细节需要注意:

  • php8.3-imagick、php8.3-mcrypt 等独立扩展具有自己的版本号,不需要与 PHP 核心版本一致。
  • dpkg-query 输出中部分模块名称没有版本号,可能是虚拟包或由其他软件包提供的模块,并不代表升级失败。可以通过 php -m 检查实际加载的模块。

一般不需要重启整台服务器,也不需要因为 PHP 更新而重启 Nginx。最后应实际访问 WordPress 前台和后台,确认网站运行正常。

5. 清理临时配置

确认 PHP 更新成功、网站正常后,删除临时软件源和下载的索引:

# 恢复原来的软件源配置
sudo rm /etc/apt/sources.list.d/ubuntu-security-temp.list
sudo apt update

# 删除临时下载文件
rm -rf ~/php-check

# 最终检查
dpkg-query -W php8.3-fpm
systemctl is-active php8.3-fpm

删除临时软件源不会回退已经安装的 PHP 版本。

6. 总结

本次 PHP 更新失败并非软件安装问题,而是阿里云镜像同步延迟。通过检查 APT 候选版本、查询 Ubuntu 官方仓库、临时添加官方安全源,最终成功安装安全修复版本。

几个值得记住的经验:

  1. Ubuntu 软件包版本不等于上游软件版本。 应根据发行版安全公告和软件包修订号判断漏洞是否修复。
  2. apt update 成功不代表镜像已经同步最新更新。 必要时应对比 Ubuntu 官方仓库。
  3. 生产服务器应避免无差别升级。 使用 --only-upgrade 限定升级目标,并通过模拟命令检查依赖变化。
  4. 更新完成后需要验证服务和清理临时配置。 对 PHP-FPM 等正在运行的服务,确认重启成功并实际测试网站。

参考资料: