我的 Laravel 应用受 PHP2Shell 影响吗?
如果应用运行的 PHP 低于所在分支的修复版本,或者是 PHP 8.1 及更早、又没有发行版补丁,就受影响。PHP2Shell 是 PHP 本身的两个漏洞(CVE-2026-109618 和 CVE-2026-109619)。Laravel 官方在处理进展文章里也说,这是影响网上所有 PHP 应用的极其严重的漏洞。框架本身写得再安全也没用,因为问题出在框架下面的运行环境。
升级 Laravel 或执行 composer update 能修好吗?
不能。Laravel 框架和 vendor 里的依赖都是 PHP 代码,改变不了服务器上的 PHP。Laravel 在 10 月 21 日发布了各产品的处理说明(以当天 23:26 UTC 的更新为准):
- Laravel Cloud:已就地为所有运行中的应用打补丁,无需重新部署,PHP 已是 8.5.12、8.4.27、8.3.36 或 8.2.35。
- Forge:PHP 8.2 到 8.5 的服务器,逐台点击“Update PHP”;失败就通过 SSH 升级。Ubuntu 20.04 及更早的服务器无法升级,Laravel 建议迁到新服务器,迁移前先关掉旧服务器。
- Vapor:修复后的运行时已上线。PHP 8.2 及以上的原生运行时需重新部署,自定义或 Docker 镜像运行时需新部署。
- PHP 8.0、8.1:没有补丁,请尽快升到 8.2 或更高。
Forge 的安全公告还提醒:自动安全更新不会升级 PHP;服务器上装的每个 PHP 版本都要升级,包括没有网站在用的版本。
怎么查 Laravel 用的是哪个 PHP 版本?
- 命令行:
php artisan about的 Environment 部分会显示 PHP 版本(这是命令行 PHP)。 - 网页端(PHP-FPM):Forge 在服务器的 PHP 标签页里列出已装版本;SSH 下按 Forge 公告同时查看
php8.4 -v和php-fpm8.4 -v(把 8.4 换成你的分支)。 - Vapor:
vapor.yml的runtime决定分支,是否已修复取决于最近一次部署。
把版本填进 PHP2Shell 检测即可判断。更多查法见 查看 PHP 版本。
该升到哪个 PHP 版本?
选 Laravel 支持的分支里的修复版本。Laravel 支持策略如下:
| Laravel | 支持的 PHP | 状态 | 可选修复版本 |
|---|---|---|---|
| 13 | 8.3–8.5 | 支持中 | 8.3.36、8.4.27、8.5.12 |
| 12 | 8.2–8.5 | 仅安全修复(至 2027 年 2 月 24 日) | 8.2.35 至 8.5.12 |
| 11 | 8.2–8.4 | 已停止维护(2026 年 3 月) | 8.2.35、8.3.36、8.4.27 |
| 10 | 8.1–8.3 | 已停止维护 | 8.2.35、8.3.36 |
| 分支 | 首个修复版本 |
|---|---|
| PHP 8.2 | 8.2.35 |
| PHP 8.3 | 8.3.36 |
| PHP 8.4 | 8.4.27 |
| PHP 8.5 | 8.5.12 |
| 8.1 及更早 | 无新发行版(7.4、8.0、8.1 有官方源码补丁) |
最快的做法是升到当前分支的修复版本。跑在 PHP 8.1 上的 Laravel 10 没有官方新版本可装,请换到 8.2 或 8.3,并计划升级 Laravel(见 PHP 停止维护版本)。
Laravel 的 PHP 该由谁来升级?
| 部署方式 | 谁来升级 PHP | 怎么做 |
|---|---|---|
| Laravel Cloud | Laravel(已完成) | 确认版本 |
| Forge | 你自己,逐台服务器 | 升级已装的每个 PHP 版本 |
| Vapor | 你自己 | 重新部署,或用新镜像部署 |
| 宝塔面板 | 你自己(软件商店更新) | 宝塔 PHP |
| 自己管理的 Ubuntu | 你自己 | Ubuntu 升级 PHP |
| Docker、Sail、FrankenPHP | 你自己(重建镜像) | Docker PHP 镜像 |
用宝塔的话,宝塔已发布修复,在“软件商店 → 已安装”里先更新软件列表,再更新网站在用的 PHP;8.1 也有宝塔打包的 8.1.35。用 1Panel 的话,PHP 运行环境来自官方的 1panel/php 镜像,截至本站核实时标签列表里还没有修复版本,处理思路同 Docker。不管哪种方式,升级后都要用上面的方法再查一次版本。
别忘了重启常驻进程。 升级软件包会重启 PHP-FPM,但队列 worker、Horizon、Octane、Reverb 在重启前仍跑旧 PHP(queue:restart、horizon:terminate、octane:reload)。
怎么判断 Laravel 应用是不是已经被入侵?
升级 PHP 只能挡住以后的攻击。重点检查:
public目录:除index.php外的.php文件。storage目录:不是应用生成的 PHP 文件。- 定时任务:不是你加的任务,以及
.env的改动。 - 应用用户:新出现的管理员或权限变更。
发现可疑情况,按 入侵自查清单 处理,再更换 .env 里的密钥。更换 APP_KEY 会让用户掉线,用旧密钥加密的数据也会读不出来,请把旧密钥放进 APP_PREVIOUS_KEYS。
WAF 或修改 PHP 配置能保护 Laravel 吗?
都不是修复。Cloudflare 表示其 WAF 能拦截已知攻击模式,但也看到攻击者在变换请求绕过拦截。Laravel 中间件在 PHP 解析完请求之后才运行,而 PHP 官方确认过至少一条在应用代码执行之前就能触达的攻击路径。临时办法和局限见 CVE-2026-109618 临时缓解,升级步骤见 PHP2Shell 修复。
Forge 的自动安全更新会装上 PHP2Shell 的修复吗?
不会。Laravel 的 Forge 公告说,Forge 从单独的软件源安装 PHP,自动安全更新不会升级 PHP。请在每台服务器上对已安装的每个 PHP 版本执行“Update PHP”。
Vapor 已经重新部署了,够了吗?
PHP 8.2 及以上的原生运行时,Laravel 说重新部署即可用上修复后的 PHP。自定义运行时或 Docker 镜像运行时需要重建镜像、发起新部署,只重新部署不够。
来源
本页的核心事实(修复版本、CVE 详情、发行版软件包、官方机构的提醒)都来自官方来源;研究报告、新闻和社区讨论已分别标注。
- Security advisory: Critical remote code execution vulnerabilities, update now官方 The PHP Group
- RCE via OOM corruption官方 The PHP Group
- RCE via stale global state官方 The PHP Group
- Cloudflare deploys protections against php2shell vulnerabilityCDN 厂商 Cloudflare
- PHP 与 Node.js 紧急安全更新公告厂商 宝塔
- 1panel/php tags厂商 1Panel (Docker Hub)
- PHP critical vulnerability response updates官方 Laravel
- PHP security advisory (CVE-2026-109618, CVE-2026-109619)官方 Laravel (Forge docs)
- Release Notes (Laravel 13.x), Support Policy官方 Laravel