PHP 官方安全团队刚刚发布了紧急安全更新(PHP 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12),修复了两个无需身份认证即可触发的远程代码执行(RCE)高危漏洞,CVSS v4.0 评分均高达 9.2(Critical 严重级)。由于宝塔面板官方软件源同步新版本通常存在数小时至数天的延迟,本文提供3 秒配置级应急封堵方案与基于 php.net 官方源码的一键平滑编译升级脚本(支持秒级回退)。
一、 漏洞详情与技术成因解析
本次安全更新同时修复了两个在底层执行流上高度关联的严重漏洞,影响所有正在维护的 PHP 分支(8.2、8.3、8.4、8.5):
1. CVE-2026-109618(GHSA-w8hw-w9fx-j79w):OOM 内存损坏导致远程代码执行 CVSS 9.2
- 漏洞原理:PHP 在触发单请求内存耗尽(Out-Of-Memory, OOM)时使用
longjmp()直接跳出当前上下文并中止请求。在部分尚未完成完整初始化的上下文中,如果内存分配失败触发跳出,PHP 未能正确清理早期中断状态,导致请求内存残留非法指针;随后在请求关闭(request shutdown)阶段读取或跳转该非法内存,从而触发远程代码执行(RCE)。 - 攻击向量:攻击者可构造畸形的
multipart/form-data请求(例如不声明有效Content-Length绕过初始post_max_size校验、在单个分片中填充海量 Header、或利用不计入max_file_uploads上限的空文件控件配合多维嵌套数组放大内存开销),精准耗尽memory_limit触发可控 OOM。
2. CVE-2026-109619(GHSA-6wmf-4rv5-p3rp):跨请求残留全局状态导致 UAF 远程代码执行 CVSS 9.2
- 漏洞原理:常驻内存的 Web Worker 进程(如
PHP-FPM或Apache mod_php)内部保留了指向单次请求堆内存的全局状态(如错误状态、Session 上传进度状态、对象及扩展状态)。当前一个请求因 Fatal Error、执行超时或 OOM 异常中断时,部分全局状态未能完成重置,但请求堆内存已被释放(形成悬垂指针)。当同一个 Worker 进程接收下一个 HTTP 请求时,在正常请求初始化(php_request_startup)完成之前运行的早期逻辑会直接访问该残留指针,引发堆 Use-After-Free (UAF) 并实现完整 RCE。 - 高危触发点:官方公告明确确认,Session 上传进度(
session.upload_progress.enabled,PHP 默认开启!)在普通初始化之前就会介入并消费残留的全局状态,已在 Apache mod_php 和 PHP-FPM 环境下完成完整 RCE 利用验证,且无需业务代码调用session_start()!此外,PHP 8.5 默认开启的fatal_error_backtraces也是已确认的 RCE 触发源。
二、 官方修复版本与源码包 SHA-256 指纹核对表
| PHP 分支 | 安全修复版本 | 宝塔默认安装路径 | 官方源码包文件名 | 官方 SHA-256 校验值 |
|---|---|---|---|---|
| PHP 8.2 | 8.2.35 |
/www/server/php/82 |
php-8.2.35.tar.gz |
9db4204f0a2d1911277ae832185e07bb4c3b3559772753a70d2968ca346d6910 |
| PHP 8.3 | 8.3.36 |
/www/server/php/83 |
php-8.3.36.tar.gz |
c93f3441f87f6ab156bef4432db215d7e61ca2c0183bb3a2aa28d9886ab59f53 |
| PHP 8.4 | 8.4.27 |
/www/server/php/84 |
php-8.4.27.tar.gz |
5bafed9994c1a49796b25b5f61c22c9183bfe046b6acc7b363842d03c77f972f |
| PHP 8.5 | 8.5.12 |
/www/server/php/85 |
php-8.5.12.tar.gz |
81a0f450349e84b08eb43faa85f8a4c835684f3cc1c50471775d1317a046c525 |
三、 第一阶段:3 秒配置级应急封堵(全版本通用,零停机立即生效)
编译升级 PHP 需要 3~6 分钟。在开始编译前,先通过一条命令将机器上所有已安装 PHP 版本的
session.upload_progress.enabled 设为 0(并针对 PHP 8.5 额外关闭 fatal_error_backtraces = 0),仅需 3 秒即可立即切断 PHP-FPM 环境下已被验证的跨请求 Session UAF RCE 利用链。官方安全公告也明确建议即使升级补丁后也保持关闭该选项。请登录宝塔 SSH 终端(root 权限),直接复制执行以下通用加固命令(自动扫描并加固宝塔面板下已安装的 PHP 8.2 / 8.3 / 8.4 / 8.5):
for ver in 82 83 84 85; do
if [ -d "/www/server/php/${ver}/etc" ]; then
echo "=== 正在加固 PHP ${ver} 配置文件 ==="
for ini in "/www/server/php/${ver}/etc/php.ini" "/www/server/php/${ver}/etc/php-cli.ini"; do
if [ -f "$ini" ]; then
cp -a "$ini" "${ini}.bak_cve2026"
sed -i 's/^;\?\s*session\.upload_progress\.enabled\s*=.*/session.upload_progress.enabled = 0/' "$ini"
grep -q "^session\.upload_progress\.enabled" "$ini" || echo "session.upload_progress.enabled = 0" >> "$ini"
if [ "$ver" = "85" ]; then
sed -i 's/^;\?\s*fatal_error_backtraces\s*=.*/fatal_error_backtraces = 0/' "$ini"
grep -q "^fatal_error_backtraces" "$ini" || echo "fatal_error_backtraces = 0" >> "$ini"
fi
fi
done
/etc/init.d/php-fpm-${ver} reload
/www/server/php/${ver}/bin/php -c "/www/server/php/${ver}/etc/php.ini" -i | grep -E "session.upload_progress.enabled|fatal_error_backtraces"
fi
done
看到终端输出 session.upload_progress.enabled => Off => Off 即代表应急免疫已生效。
四、 第二阶段:宝塔面板各版本一键源码平滑升级教程
✅ 升级脚本安全保障说明:
- 100% 保留现有扩展与配置:同小版本分支(如
8.3.x → 8.3.36)的 Zend 模块 API 完全一致,脚本通过php-config --configure-options自动复用你当前环境的完整编译参数,升级后原有的redis、memcached、opcache、SG11、ionCube等扩展及php.ini配置全部原封不动保留。 - 编译期间零停机:拉取源码与多核编译全程在
/tmp临时目录后台进行,网站正常访问,仅在最后替换二进制并重启 FPM 时切换 1 秒。 - 强制校验官方 SHA-256 + 自动备份旧二进制:内置官方 SHA-256 指纹校验,并在覆盖前自动将旧版本二进制备份至
/root/backup_php_bin_{版本}/,支持随时 1 秒无损回退。
方案 A:宝塔 PHP 8.2 一键升级至 PHP 8.2.35
适用于宝塔面板已安装 PHP 8.2(路径 /www/server/php/82)的服务器,复制以下命令到终端执行:
cat << 'EOF' > /tmp/upgrade_php_8235.sh
#!/bin/bash
set -e
VER="8.2.35"
SHA256="9db4204f0a2d1911277ae832185e07bb4c3b3559772753a70d2968ca346d6910"
PHP_PATH="/www/server/php/82"
BAK_DIR="/root/backup_php_bin_82"
WORK_DIR="/tmp/php_upgrade_${VER}"
if [ ! -x "$PHP_PATH/bin/php-config" ]; then
echo "❌ 未检测到 $PHP_PATH,请确认当前服务器已安装宝塔 PHP 8.2"
exit 1
fi
echo "=== [1/5] 备份当前 PHP 8.2 二进制文件至 $BAK_DIR ==="
mkdir -p "$WORK_DIR" "$BAK_DIR"
cp -a "$PHP_PATH/bin/php" "$PHP_PATH/bin/php-cgi" "$PHP_PATH/sbin/php-fpm" "$BAK_DIR/"
echo "=== [2/5] 下载官方 php-${VER}.tar.gz 并校验 SHA-256 ==="
cd "$WORK_DIR"
if [ ! -f "php-${VER}.tar.gz" ]; then
wget -O "php-${VER}.tar.gz" "https://www.php.net/distributions/php-${VER}.tar.gz"
fi
echo "${SHA256} php-${VER}.tar.gz" | sha256sum -c -
echo "=== [3/5] 解压并加载现有 PHP 8.2 编译参数 ==="
rm -rf "php-${VER}"
tar -zxf "php-${VER}.tar.gz"
cd "php-${VER}"
CONF_OPTS=$("$PHP_PATH/bin/php-config" --configure-options)
eval "./configure $CONF_OPTS"
echo "=== [4/5] 多核编译 PHP ${VER} (编译期间网站正常访问) ==="
make -j$(nproc)
echo "=== [5/5] 平滑安装并重启 PHP-FPM 8.2 ==="
/etc/init.d/php-fpm-82 stop || true
make install
/etc/init.d/php-fpm-82 start
rm -rf "$WORK_DIR" /tmp/upgrade_php_8235.sh
echo "=========================================="
"$PHP_PATH/bin/php" -v
echo "🎉 PHP ${VER} 安全补丁升级成功!"
EOF
chmod +x /tmp/upgrade_php_8235.sh && /tmp/upgrade_php_8235.sh
PHP 8.2 一键回退命令(如需回退至升级前的二进制版本):
/etc/init.d/php-fpm-82 stop && cp -a /root/backup_php_bin_82/php /root/backup_php_bin_82/php-cgi /www/server/php/82/bin/ && cp -a /root/backup_php_bin_82/php-fpm /www/server/php/82/sbin/ && /etc/init.d/php-fpm-82 start
方案 B:宝塔 PHP 8.3 一键升级至 PHP 8.3.36
适用于宝塔面板已安装 PHP 8.3(路径 /www/server/php/83)的服务器,复制以下命令到终端执行:
cat << 'EOF' > /tmp/upgrade_php_8336.sh
#!/bin/bash
set -e
VER="8.3.36"
SHA256="c93f3441f87f6ab156bef4432db215d7e61ca2c0183bb3a2aa28d9886ab59f53"
PHP_PATH="/www/server/php/83"
BAK_DIR="/root/backup_php_bin_83"
WORK_DIR="/tmp/php_upgrade_${VER}"
if [ ! -x "$PHP_PATH/bin/php-config" ]; then
echo "❌ 未检测到 $PHP_PATH,请确认当前服务器已安装宝塔 PHP 8.3"
exit 1
fi
echo "=== [1/5] 备份当前 PHP 8.3 二进制文件至 $BAK_DIR ==="
mkdir -p "$WORK_DIR" "$BAK_DIR"
cp -a "$PHP_PATH/bin/php" "$PHP_PATH/bin/php-cgi" "$PHP_PATH/sbin/php-fpm" "$BAK_DIR/"
echo "=== [2/5] 下载官方 php-${VER}.tar.gz 并校验 SHA-256 ==="
cd "$WORK_DIR"
if [ ! -f "php-${VER}.tar.gz" ]; then
wget -O "php-${VER}.tar.gz" "https://www.php.net/distributions/php-${VER}.tar.gz"
fi
echo "${SHA256} php-${VER}.tar.gz" | sha256sum -c -
echo "=== [3/5] 解压并加载现有 PHP 8.3 编译参数 ==="
rm -rf "php-${VER}"
tar -zxf "php-${VER}.tar.gz"
cd "php-${VER}"
CONF_OPTS=$("$PHP_PATH/bin/php-config" --configure-options)
eval "./configure $CONF_OPTS"
echo "=== [4/5] 多核编译 PHP ${VER} (编译期间网站正常访问) ==="
make -j$(nproc)
echo "=== [5/5] 平滑安装并重启 PHP-FPM 8.3 ==="
/etc/init.d/php-fpm-83 stop || true
make install
/etc/init.d/php-fpm-83 start
rm -rf "$WORK_DIR" /tmp/upgrade_php_8336.sh
echo "=========================================="
"$PHP_PATH/bin/php" -v
echo "🎉 PHP ${VER} 安全补丁升级成功!"
EOF
chmod +x /tmp/upgrade_php_8336.sh && /tmp/upgrade_php_8336.sh
PHP 8.3 一键回退命令(如需回退至升级前的二进制版本):
/etc/init.d/php-fpm-83 stop && cp -a /root/backup_php_bin_83/php /root/backup_php_bin_83/php-cgi /www/server/php/83/bin/ && cp -a /root/backup_php_bin_83/php-fpm /www/server/php/83/sbin/ && /etc/init.d/php-fpm-83 start
方案 C:宝塔 PHP 8.4 一键升级至 PHP 8.4.27
适用于宝塔面板已安装 PHP 8.4(路径 /www/server/php/84)的服务器,复制以下命令到终端执行:
cat << 'EOF' > /tmp/upgrade_php_8427.sh
#!/bin/bash
set -e
VER="8.4.27"
SHA256="5bafed9994c1a49796b25b5f61c22c9183bfe046b6acc7b363842d03c77f972f"
PHP_PATH="/www/server/php/84"
BAK_DIR="/root/backup_php_bin_84"
WORK_DIR="/tmp/php_upgrade_${VER}"
if [ ! -x "$PHP_PATH/bin/php-config" ]; then
echo "❌ 未检测到 $PHP_PATH,请确认当前服务器已安装宝塔 PHP 8.4"
exit 1
fi
echo "=== [1/5] 备份当前 PHP 8.4 二进制文件至 $BAK_DIR ==="
mkdir -p "$WORK_DIR" "$BAK_DIR"
cp -a "$PHP_PATH/bin/php" "$PHP_PATH/bin/php-cgi" "$PHP_PATH/sbin/php-fpm" "$BAK_DIR/"
echo "=== [2/5] 下载官方 php-${VER}.tar.gz 并校验 SHA-256 ==="
cd "$WORK_DIR"
if [ ! -f "php-${VER}.tar.gz" ]; then
wget -O "php-${VER}.tar.gz" "https://www.php.net/distributions/php-${VER}.tar.gz"
fi
echo "${SHA256} php-${VER}.tar.gz" | sha256sum -c -
echo "=== [3/5] 解压并加载现有 PHP 8.4 编译参数 ==="
rm -rf "php-${VER}"
tar -zxf "php-${VER}.tar.gz"
cd "php-${VER}"
CONF_OPTS=$("$PHP_PATH/bin/php-config" --configure-options)
eval "./configure $CONF_OPTS"
echo "=== [4/5] 多核编译 PHP ${VER} (编译期间网站正常访问) ==="
make -j$(nproc)
echo "=== [5/5] 平滑安装并重启 PHP-FPM 8.4 ==="
/etc/init.d/php-fpm-84 stop || true
make install
/etc/init.d/php-fpm-84 start
rm -rf "$WORK_DIR" /tmp/upgrade_php_8427.sh
echo "=========================================="
"$PHP_PATH/bin/php" -v
echo "🎉 PHP ${VER} 安全补丁升级成功!"
EOF
chmod +x /tmp/upgrade_php_8427.sh && /tmp/upgrade_php_8427.sh
PHP 8.4 一键回退命令(如需回退至升级前的二进制版本):
/etc/init.d/php-fpm-84 stop && cp -a /root/backup_php_bin_84/php /root/backup_php_bin_84/php-cgi /www/server/php/84/bin/ && cp -a /root/backup_php_bin_84/php-fpm /www/server/php/84/sbin/ && /etc/init.d/php-fpm-84 start
方案 D:宝塔 PHP 8.5 一键升级至 PHP 8.5.12
适用于宝塔面板已安装 PHP 8.5(路径 /www/server/php/85)的服务器,复制以下命令到终端执行:
cat << 'EOF' > /tmp/upgrade_php_8512.sh
#!/bin/bash
set -e
VER="8.5.12"
SHA256="81a0f450349e84b08eb43faa85f8a4c835684f3cc1c50471775d1317a046c525"
PHP_PATH="/www/server/php/85"
BAK_DIR="/root/backup_php_bin_85"
WORK_DIR="/tmp/php_upgrade_${VER}"
if [ ! -x "$PHP_PATH/bin/php-config" ]; then
echo "❌ 未检测到 $PHP_PATH,请确认当前服务器已安装宝塔 PHP 8.5"
exit 1
fi
echo "=== [1/5] 备份当前 PHP 8.5 二进制文件至 $BAK_DIR ==="
mkdir -p "$WORK_DIR" "$BAK_DIR"
cp -a "$PHP_PATH/bin/php" "$PHP_PATH/bin/php-cgi" "$PHP_PATH/sbin/php-fpm" "$BAK_DIR/"
echo "=== [2/5] 下载官方 php-${VER}.tar.gz 并校验 SHA-256 ==="
cd "$WORK_DIR"
if [ ! -f "php-${VER}.tar.gz" ]; then
wget -O "php-${VER}.tar.gz" "https://www.php.net/distributions/php-${VER}.tar.gz"
fi
echo "${SHA256} php-${VER}.tar.gz" | sha256sum -c -
echo "=== [3/5] 解压并加载现有 PHP 8.5 编译参数 ==="
rm -rf "php-${VER}"
tar -zxf "php-${VER}.tar.gz"
cd "php-${VER}"
CONF_OPTS=$("$PHP_PATH/bin/php-config" --configure-options)
eval "./configure $CONF_OPTS"
echo "=== [4/5] 多核编译 PHP ${VER} (编译期间网站正常访问) ==="
make -j$(nproc)
echo "=== [5/5] 平滑安装并重启 PHP-FPM 8.5 ==="
/etc/init.d/php-fpm-85 stop || true
make install
/etc/init.d/php-fpm-85 start
rm -rf "$WORK_DIR" /tmp/upgrade_php_8512.sh
echo "=========================================="
"$PHP_PATH/bin/php" -v
echo "🎉 PHP ${VER} 安全补丁升级成功!"
EOF
chmod +x /tmp/upgrade_php_8512.sh && /tmp/upgrade_php_8512.sh
PHP 8.5 一键回退命令(如需回退至升级前的二进制版本):
/etc/init.d/php-fpm-85 stop && cp -a /root/backup_php_bin_85/php /root/backup_php_bin_85/php-cgi /www/server/php/85/bin/ && cp -a /root/backup_php_bin_85/php-fpm /www/server/php/85/sbin/ && /etc/init.d/php-fpm-85 start
五、 升级后安全验证命令
升级完成后,可执行以下命令一键核验当前服务器上所有 PHP 版本的内核版本号、扩展加载情况及安全参数状态:
for ver in 82 83 84 85; do
if [ -x "/www/server/php/${ver}/bin/php" ]; then
echo "================ PHP ${ver} 状态核验 ================"
/www/server/php/${ver}/bin/php -v | head -n 1
/www/server/php/${ver}/bin/php -c "/www/server/php/${ver}/etc/php.ini" -i | grep -E "Loaded Configuration File|session.upload_progress.enabled|fatal_error_backtraces"
fi
done
确认输出版本号已更新为 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 且 session.upload_progress.enabled => Off => Off,即代表本次两个 CVSS 9.2 严重级远程代码执行漏洞已彻底修复!

