2026 年 10 月 21 日,CERT-EU 就 PHP 中两个严重漏洞 CVE-2026-109618、CVE-2026-109619 发布警报,CVSS 4.0 评分高达 9.2,属于高危远程代码执行(RCE)。攻击者一旦成功,即可在服务器上以 PHP 进程权限执行任意代码,导致网站失陷、页面被篡改、数据泄露,并可能以该节点为跳板横向渗透。本文带你用 10 分钟自查 PHP 版本与风险点,并给出可落地的临时止血与根治升级方案。
一、漏洞速览:这是什么、危害有多大
这两个漏洞被归类为远程代码执行,技术成因指向代码注入(CWE-94)与越界写(CWE-787),公开研究初步怀疑其攻击面位于 PHP 的会话上传进度(session upload progress)处理路径,并可能涉及释放后使用(use-after-free)类内存破坏。由于该技术细节尚未被 PHP 官方完全确认、POC 也未公开,我们更应把精力放在“已知事实 + 防御动作”上。
| 项目 | 内容 |
|---|---|
| 漏洞编号 | CVE-2026-109618、CVE-2026-109619 |
| CVSS 4.0 | 9.2(高危) |
| 漏洞类型 | 远程代码执行(RCE)/ 代码注入 / 越界写 |
| 影响范围 | PHP 5 至 PHP 8.5 多个历史分支 |
| 公开时间 | 2026-10-21(CERT-EU 警报) |
| 利用条件 | 需能访问运行受影响 PHP 的 Web 服务 |
| POC / EXP | 均未公开,官方仍在确认细节 |
影响量级被评估为“千万级”,原因是会话上传进度功能自 PHP 5.4 引入以来默认开启,其处理发生在应用脚本执行之前,意味着大量默认配置的 PHP 部署环境都可能暴露在同一攻击面上。如果你的站点跑在 PHP 上(WordPress、各类框架、自研后台),现在就该行动。
二、为什么影响这么广:session.upload_progress 的来龙去脉
很多站长从没主动用过“上传进度条”,但它其实一直开着。PHP 的 session.upload_progress.enabled 默认值为 On,当一个 multipart 表单上传正在进行时,PHP 会自动在会话里写入进度信息,相关回调落在 php_session_rfc1867_callback 这一路径。问题在于:这段逻辑在用户脚本真正执行之前就已运行,一旦其中存在内存破坏类缺陷,攻击者就可能绕过应用层校验直接触达危险区域。
这正是本次漏洞最让人紧张的地方:你不需要写任何“危险代码”,只要你的 PHP 版本在受影响区间、且该功能默认开启,攻击面就已经存在。这也解释了为什么官方给出的影响范围横跨了如此多的 PHP 历史分支。
三、第一步:10 分钟自查你的 PHP 是否中招
3.1 确认 PHP 版本
先在服务器上确认实际运行的 PHP 版本(注意:命令行 php -v 与 Web 使用的 PHP 可能是不同 SAPI,最好两边都查)。
# 命令行 PHP 版本
php -v
# Web 端实际版本(把下面一行丢进 phpinfo 页面或临时探针)
php -r 'echo phpversion();'
# 若用宝塔 / 多版本,确认站点绑定的 PHP 版本
# 宝塔面板 → 软件商店 → 已安装 → 查看对应 PHP 版本号
3.2 检查会话上传进度是否开启
确认 session.upload_progress.enabled 的当前值,以及 php.ini 的真实路径。
# 查看上传进度开关当前值
php -i | grep -i upload_progress
# 期望看到(已关闭才安全):
# session.upload_progress.enabled => Off => Off
# 找到实际生效的 php.ini 路径
php --ini
# 命令行查 Web 端 ini(部分环境 CLI 与 FPM 配置分离)
php-fpm -i 2>/dev/null | grep -i upload_progress
只要 session.upload_progress.enabled => On,且版本落在受影响区间,就应当视为“需要处置”的状态,进入下一步止血。
四、临时止血:关闭会话上传进度(无需等官方补丁)
在官方补丁或你完成升级之前,最稳妥的临时措施是直接关闭该功能。它只是“进度条”能力,绝大多数业务并不依赖它,关闭后不影响正常上传。
# 1) 编辑 php.ini,把下面这行设为 Off(没有就新增)
session.upload_progress.enabled = Off
# 2) 容器 / 无权限改全局 ini 时,可用 .user.ini(仅对该目录及子目录生效)
# 在站点根目录新建或追加:
session.upload_progress.enabled = Off
# 3) 修改后重载服务(按你的实际 SAPI 选一条)
# PHP-FPM:
systemctl reload php-fpm
# 或宝塔的一键重载;Apache mod_php:
systemctl reload apache2
# Docker 环境改完需重建/重启容器使其生效
⚠️ 这是缓解(mitigation)而非根治。关闭该功能封堵了本次已知攻击面,但同版本的其他潜在缺陷仍在,请务必把它和“升级”结合起来做,不要只停在止血这一步。
五、根治之道:升级到官方已修复版本
临时止血后,下一步是把 PHP 升级到官方在 2026 年 10 月安全公告中给出的已修复补丁版本。升级前请务必先在预发或备份环境验证插件/主题兼容性,尤其是 WordPress 站点。
| 环境 | 升级动作 | 注意 |
|---|---|---|
| Ubuntu / Debian | apt update && apt upgrade php* | 确认仓库已提供补丁版;升级后重载 FPM |
| 宝塔面板 | 软件商店 → 对应 PHP → 一键升级到最新补丁 | 先备份站点与数据库再升级 |
| Docker 部署 | 更新基础镜像 tag 到含补丁的版本后重建 | 见 Docker 编排实战 的镜像管理思路 |
| 编译安装 | 拉取官方源码重新编译并替换 | 保留原 configure 参数,避免功能回退 |
# Debian/Ubuntu 一条龙(升级 + 确认版本 + 重载)
sudo apt update
sudo apt upgrade php-fpm php-common php-cli -y
php -v # 确认版本已进入已修复区间
sudo systemctl reload php-fpm
# 升级后再次核对攻击面已关闭或版本已安全
php -i | grep -i upload_progress
六、纵深防御:WAF 与边界收敛
单点补丁不够,给 PHP 站点加几层“安全带”能显著降低未来类似漏洞的暴露面。
6.1 收紧 PHP 危险函数与权限
# 在 php.ini 中禁用一批常被 RCE 链利用的函数(按需裁剪,避免误伤业务)
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,proc_nice
# 让 PHP 进程以低权限用户运行,并限制可写目录
# 同时开启 open_basedir 约束文件访问范围(多站点强烈建议)
6.2 用 Nginx 收敛上传入口
在反向代理层面对异常大的上传请求做限制,并配合已有的限流/防暴破能力形成边界防护。
# 在 Nginx 的 server/location 中限制上传体积与速率
client_max_body_size 20m;
client_body_timeout 30s;
# 配合 fail2ban 与限流,参考:
# 入侵防御:https://fsdata.site/2026/10/fail2ban-practical-intrusion-prevention/
# Nginx 反代与限流:https://fsdata.site/2026/08/nginx-%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86%e5%ae%8c%e6%95%b4%e9%85%8d%e7%bd%ae%ef%bc%9a%e8%b4%9f%e8%bd%bd%e5%9d%87%e8%a1%a1-https-%e7%bc%93%e5%ad%98%e4%bc%98%e5%8c%96/
6.3 把漏洞扫描放进 CI
若使用容器化交付,可在流水线里加入镜像与依赖扫描,做到“发布前就拦住已知 CVE”,相关实践可参考 GitHub Actions 实战 与容器安全扫描。顺便复习另一类解析型漏洞的防御思路:ReDoS 灾难性回溯。
| 防御层 | 动作 | 拦住什么 |
|---|---|---|
| 应用层 | 关闭 session.upload_progress / 升级 PHP | 本次直接攻击面 |
| 运行时 | disable_functions、降权、open_basedir | RCE 落地后的横向移动 |
| 边界 | Nginx 限流、fail2ban、WAF 规则 | 异常流量与暴破 |
| 供应链 | CI 镜像/依赖扫描、定期升级 | 未来类似 CVE |
七、给 WordPress 站长的特别提醒(本站场景)
本站本身即运行在 PHP 之上的 WordPress,因此这次漏洞与我们直接相关。请按以下顺序操作:①先用本节命令确认当前 PHP 版本与开关;②在宝塔/面板把 PHP 升级到已修复补丁版(升级前务必对站点与数据库做一次备份);③升级后清除 OPcache/对象缓存并验证后台与前端正常;④检查近期是否有异常主题/插件被写入、是否有不明 PHP 文件落盘。编辑配置文件时也可以用 VS Code 远程连接服务器安全修改。
八、落地检查清单(Checklist)
| ✅ 步骤 | 命令 / 动作 |
|---|---|
| 查版本 | php -v 与 Web 端探针各查一次 |
| 查开关 | php -i | grep upload_progress 应为 Off |
| 临时止血 | 设 session.upload_progress.enabled = Off 并重载 |
| 根治升级 | 升级到官方 2026-10 已修复补丁版 |
| 收紧运行 | 配置 disable_functions、降权、open_basedir |
| 边界防护 | Nginx 限流 + fail2ban + WAF 规则 |
| 持续监控 | CI 扫描 + 文件变更监控 + 定期升级 |
九、小结
CVE-2026-109618 / CVE-2026-109619 用“默认开启的功能 + 内存破坏”提醒我们:真正危险的往往不是你写出的代码,而是你没关掉的默认能力。面对这类 CVSS 9.2 级 RCE,正确节奏是“先止血(关功能)、再根治(升级)、最后做纵深防御”。把今天的检查清单固化成每月一次的安全巡检,比临时救火从容得多。




