紧急安全预警:PHP 曝两个 CVSS 9.2 远程代码执行漏洞(CVE-2026-109618 / CVE-2026-109619),宝塔面板 PHP 8.2 / 8.3 / 8.4 / 8.5 一键平滑修补与升级教程

评论字数 11630阅读38分46秒阅读模式
⚠️ 核心安全通告(2026-10-21):
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 曝两个 CVSS 9.2 远程代码执行漏洞(CVE-2026-109618 / CVE-2026-109619),宝塔面板 PHP 8.2 / 8.3 / 8.4 / 8.5 一键平滑修补与升级教程

PHP 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 CVSS 9.2 安全补丁升级教程

一、 漏洞详情与技术成因解析

本次安全更新同时修复了两个在底层执行流上高度关联的严重漏洞,影响所有正在维护的 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 即代表应急免疫已生效。

四、 第二阶段:宝塔面板各版本一键源码平滑升级教程

✅ 升级脚本安全保障说明:

  1. 100% 保留现有扩展与配置:同小版本分支(如 8.3.x → 8.3.36)的 Zend 模块 API 完全一致,脚本通过 php-config --configure-options 自动复用你当前环境的完整编译参数,升级后原有的 redis、memcached、opcache、SG11、ionCube 等扩展及 php.ini 配置全部原封不动保留。
  2. 编译期间零停机:拉取源码与多核编译全程在 /tmp 临时目录后台进行,网站正常访问,仅在最后替换二进制并重启 FPM 时切换 1 秒。
  3. 强制校验官方 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 严重级远程代码执行漏洞已彻底修复!

本站QQ群:779684887,点击加入 ,电报群:点击加入 , 广告合作点我
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定