PHP2Shell 有能代替升级的临时办法吗?
没有。PHP 官方明确说临时设置不能完全消除风险。下面这些办法的作用是在你排期升级的几小时、几天里降低风险,不能当作“已经修复”,本站的 PHP 版本检测 也不会因为做了缓解就判定为安全。
CVE-2026-109618 的 memory_limit 和 post_max_size 怎么设?
这两项是 PHP 官方专门针对 CVE-2026-109618(内存不足路径)给出的临时设置:
memory_limit = -1:去掉 PHP 自己的内存上限,避开“超过上限”这条触发路径。注意三点:底层内存分配失败仍可能触发漏洞,所以它不是修复;要设在应用代码改不回去的地方(主配置),否则程序里一句ini_set就能把上限改回来;单个请求可能吃掉大量内存,要盯住服务器内存。官方还提醒,不要用系统层面的进程内存限制(RLIMIT_AS、RLIMIT_DATA)来代替。- 调低
post_max_size:不需要上传的网站设为 8M,需要上传的设为 32M,减少内存不足路径的暴露面。代价是比这更大的上传会直接失败。
两项都要写进网站实际使用的那套 PHP 的主配置,并重启所有 PHP worker。
关闭 session.upload_progress 怎么做才有效?
这一项针对的是 PHP2Shell 的另一个漏洞 CVE-2026-109619,能挡住已确认的一部分 session 相关路径。两个漏洞的修复版本相同,升级前通常要一起防,所以也放在这里。要真正生效,必须满足:
- 写进主配置:在网站实际使用的那套 PHP 的
php.ini(或 PHP-FPM 进程池的主配置)里设置session.upload_progress.enabled = 0。 - 在请求解析之前生效:代码里用
ini_set()改、或者写在 FPM 的.user.ini里,都来不及,等于没设。 - 重启所有 PHP worker:重启 PHP-FPM 或 Apache,旧进程不退出,新配置不生效。
宝塔用户注意:要改的是网站绑定的那个 PHP 版本的配置,改完重启该 PHP 服务。
代价:依赖“上传进度”显示的功能(比如某些大文件上传进度条)可能失效。
PHP 8.5 还要额外做什么?
PHP 8.5 有一项额外的临时设置(同样针对 CVE-2026-109619):把 fatal_error_backtraces 设为 0。它只针对一条已确认的 fatal backtrace 路径,挡不住其他变体,而且会减少报错时的诊断信息。同样需要写进主配置并重启。
Cloudflare、腾讯云 WAF 能挡住吗?
能挡一部分。Cloudflare 表示补丁发布前就观察到了攻击流量和不断变换的攻击请求,已为启用 WAF 的免费和付费套餐部署默认防护;腾讯云称其 Web 应用防火墙、云防火墙支持防护。但要注意:
- 攻击者如果能绕过 CDN 直接访问你的源站 IP,WAF 就不起作用。
- 攻击请求会变形,规则不一定都能识别。
- 服务器上的 PHP 仍然有漏洞。
用 WAF 的同时,尽量让源站只接受 CDN 回源的流量。
维护模式插件能挡住吗?
不能指望。WordPress 之类的维护模式插件是在 PHP 已经开始处理请求之后才显示维护页,而 PHP2Shell 的部分攻击路径发生在应用代码运行之前。要“暂停网站”,应该在 Nginx、Apache 或 CDN 层面直接返回维护页,不让请求进入 PHP。
什么时候应该直接暂停网站?
日本、英国、美国的官方机构都建议:无法立即更新时,考虑暂时让网站下线。以下情况尤其应该考虑:
- 网站用 Apache mod_php(官方认为风险最高);
- 网站有用户账号、个人信息、支付;
- 是停止维护的老 PHP,短期内升级不了。
暂停方式:在 Web 服务器或 CDN 层返回维护页,或只允许公司内网、固定 IP 访问。
做完缓解之后还要做什么?
- 把升级排进日程,按 PHP2Shell 修复 尽快完成。
- 升级完成后,可以按需恢复
session.upload_progress等设置。 - 做一次 网站被黑检测,尤其是缓解措施生效前已经暴露过一段时间的网站。
想先确认自己是否在受影响范围,回到 PHP2Shell 检测。
依据哪些来源?
- The PHP Group:PHP 安全公告
- PHP 官方安全公告:RCE via stale global state
- Cloudflare:php2shell 防护说明
- 腾讯云:PHP “php2shell” 远程代码执行漏洞风险通告
来源
本页的核心事实(修复版本、CVE 详情、发行版软件包、官方机构的提醒)都来自官方来源;研究报告、新闻和社区讨论已分别标注。