PHP 远程代码执行漏洞:紧急自查与防护实战

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.09.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 / Debianapt 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_basedirRCE 落地后的横向移动
边界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,正确节奏是“先止血(关功能)、再根治(升级)、最后做纵深防御”。把今天的检查清单固化成每月一次的安全巡检,比临时救火从容得多。

上一篇 Python 异步编程实战:用 asyncio 写出高并发 IO 应用
下一篇 SQL 注入防护实战:从预编译到纵深防御
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]