ARTICLE · 1234265
AI 挖出藏在 PHP 里十年的两个洞:荷兰关了港口网站,芬兰关了政府门户
2026 年 8 月:网络安全公司 Calif 和谷歌旗下的 Wiz Research 各自在 PHP 解释器里发现了严重漏洞。10月20日:PHP 团队预告将发布安全更新,同一天漏洞细节在社交媒体上泄露。10月21日 14:00 UTC:PHP 紧急放出补丁,中国国家信息安全漏洞共享平台(CNVD)当天收录了这两条漏洞。10月22日:国家互联网应急中心、工信部网络安全威胁和漏洞信息共享平台、香港网络安全事故协调中心先后发布安全公告,全球同步进入应急补丁状态。
所以它不是"今天刚被发现的漏洞",是"藏了十几年、刚被迫提前公开、刚刚打上补丁"的漏洞。
先说漏洞本身,两个,编号要记清。
CVE-2026-109618:PHP 在处理上传进度时的反序列化器存在释放后重放(use-after-free)。一次致命的内存分配失败会中断这条路径,把请求堆销毁掉,而反序列化器的全局状态还挂在外面。下一个由同一个 worker 处理的请求,就会把攻击者已经抢回来的内存当成正常状态来用。
CVE-2026-109619:致命错误回溯机制和 OPcache 的类型混淆,属于"陈旧全局状态"类问题。前一个请求的信息在内存被释放后仍被引用,后续请求会照着这些失效引用继续执行。
两者都是 CVSS v4.0 的 9.2 分。CNVD 收录时的编号是 CNVD-2026-41674 和 CNVD-2026-41675,综合评级"高危";工信部网络安全威胁和漏洞信息共享平台的表述是"超危";香港网络安全事故协调中心把它定为"极高度风险",并且直接警告这两个漏洞正在被广泛利用。
为什么 PHP 出事等于大半互联网出事。
PHP 是服务端脚本语言,动态生成网页再发到你的浏览器。行业普遍估计它支撑着全球 70% 到 80% 的网站。VirusTotal 的统计给出的是 510 万台暴露在公网上的 PHP 主机,其中约 380 万台至少开放了一个端口。
关键在于,漏洞在 PHP 本身,不在某个应用。Wiz 用一个基础的 "Hello World" 就能触发:意思是,即使你网站代码写得毫无破绽,照样中招。他们的演示跑在当时最新的 WordPress、Drupal、Joomla 官方容器镜像上,全部实现了未认证远程代码执行。
CNVD 的公告把受影响的下游列了一长串:Magento、WordPress、Drupal、Joomla、MediaWiki、Roundcube、phpMyAdmin、Nextcloud、Laravel、Symfony、WHMCS、OpenCart。
修复版本和排查动作,这一节可以直接照着做。
PHP 官方给的修复版本是 8.5.12、8.4.27、8.3.36、8.2.35。影响范围是:8.5 系列小于 8.5.12、8.4 系列小于 8.4.27、8.3 系列小于 8.3.36、8.2 系列小于 8.2.35,以及 8.1 及更早的所有版本。
8.1 及更早已经过了官方支持期,PHP 团队额外提供了针对 PHP 7.4、8.0、8.1 的最小源码补丁,给那些自己在源码上构建、拿不到 LTS 厂商支持的人。Linux 发行版和长期支持厂商提前拿到了补丁,用包管理器安装的应该去查对应的安全公告。
受影响的运行方式包括 PHP-FPM、Apache 的 mod_php、php-cgi、FrankenPHP 和 LiteSpeed。PHP 团队明确指出 mod_php 风险最高,因为演示出来的攻击在任何应用代码开始执行之前就已经完成了。
排查时有一条容易踩坑:命令行和网页底下的 PHP 可能不是同一个版本。查版本要用 php -v,但给网站提供服务的那个要看 php-fpm -v 或类似的具体命令。
临时缓解能做什么,不能做什么。
来不及打补丁的,可以按 CVE 分开处理。
对 CVE-2026-109618:把 memory_limit 设为 -1,最好用不可被应用覆盖的方式,比如 FPM 池配置或 Apache 里的 php_admin_value;把 post_max_size 调低,不需要上传的设 8M,需要的设 32M;用容器或 cgroup 限制作为可用性边界,最好配上只杀掉受影响 worker 的策略。
对 CVE-2026-109619:把 session.upload_progress.enabled 设为 0,然后重启每一个 worker;PHP 8.5 上再设 fatal_error_backtraces=0 同样重启。这只挡住已确认的回溯路径。另外要清掉那些每次请求才生效、会在初始化前抛出诊断信息的无效或废弃配置。
这里有一条反直觉的坑,一定要记住:不要试图用 RLIMIT_AS 或 RLIMIT_DATA 来缓解。PHP 官方警告说,这两个限制会让内存分配以一种恰好触发漏洞路径的方式失败,等于自己把路铺平。用 error_reporting、display_errors 或者 @ 把错误信息藏起来也完全没用。
还有一个认知纠正:更新 WordPress、插件、主题都不能替代更新服务器的 PHP 运行环境。托管主机的用户要去找服务商确认,很多站长其实控制不了自己的 PHP 版本。
Web 应用防火墙和入侵防御规则只能当临时措施。PHP 核心开发者 Gina Peter Banyard 说得很直接:没有一种 PHP2Shell 缓解措施能真正挡住攻击,装官方补丁才是唯一的永久解法。Cloudflare CTO Dane Knecht 也表示,他们部署的 WAF 规则已经开始拦到针对这两个漏洞的早期攻击,但这些保护是暂时的。
AI 在这里到底起了什么作用。
这是整个事件最值得琢磨的部分。
参与发现的有两方:Calif 通过 OpenAI 的 Patch the Planet 计划,用 GPT-5.6 Sol 找出了关键缺陷;Wiz Research 用自研的 Wiz Atlas 和谷歌的 Gemini 4 Argon 独立发现了这两个漏洞。
Wiz 的表述很克制,但指向很清楚:这些 bug 在 PHP 代码库里躺了十几年没人发现,原因是利用它们需要把多个漏洞串起来,还要算清楚 PHP 跨请求怎么分配和复用内存。内存类漏洞的难度在于,PHP 版本、配置、应用行为的任何差异都可能打破攻击所依赖的假设。一个在某个环境里奏效的攻击,换个环境就得重新分析、测试、调试——这种手工活过去很难做,更难规模化。
AI 改变的不是"能不能发现",而是"发现之后多快能变成武器"。模型可以帮着把 exploit 适配到不同的 PHP 版本、配置和内存布局上,可以利用调试工具分析失败原因并迭代调整。每个目标所需的专家工作量被压下来了,原本不划算的目标变得划算。
所以这次是防守方先手:Google Cloud、Cloudflare、AWS、Microsoft、Automattic、Fastly、Akamai、Imperva、Vercel 等一大串厂商在公开之前就拿到了时间窗,用来准备检测规则和开箱即用的缓解方案。
但时间窗并没有按计划执行。
PHP 团队原本计划在 10 月下旬发布更新,10月20日先发了预告,并明说"如果漏洞细节泄露或出现实地利用证据,我们保留提前发布的权利"。结果同一天细节就在社交媒体上散开了。
更说明问题的一条来自 AWS:他们的 MadPot 蜜罐在 10月17日就记录到针对这个漏洞的利用尝试,比 CVE 正式披露早了整整四天,来源是某个商业匿名网络,而当时补丁还处于 embargo 状态。也就是说,攻击者的进度至少追平了防御者。
各国那两天的动作,能看出这个漏洞的实际杀伤面。
芬兰受影响最彻底,政府公共网络服务被迫关闭。荷兰暂时关停了服务,五大主要政党的网站、部分政府门户网站和鹿特丹港网站下线。法国内政部把所有网站置于"预防性维护状态"。英国 NCSC 警告相关机构立即更新,或者直接下线直到打完补丁。爱丁堡议会和 BBC 也各自下线了部分页面。这么多国家和机构各自的公告,共同点是:它们都不是因为自己的代码有问题,而是因为底下那层 PHP 出了问题。
争议也别跳过。
社区对"AI 发现漏洞"这个叙事的质疑是有的。有人在 Hacker News 上指出,Calif 最初发现那个 PHP 缺陷时并没有使用什么特殊的 AI 工具;OpenAI 随后发的那篇关于协调披露的文章,下面被大量评论批评为营销。
两边的说法都成立:AI 确实在适配 exploit、压缩时间成本上起了实质作用,这点 Wiz 的描述很具体;但把"发现"整个功劳算到 AI 头上,是叙事上的一步跳跃。读的时候把这两件事分开看就行。
最后给一句真正重要的提醒。
打完补丁不等于事情了结。安全专家 Don Smith 的说法点到了要害:PHP 的应用面太广,可以藏在公共网站、内容管理系统、托管平台和第三方产品里,有时候连用它的人自己都不知道。补丁落地之后,各机构要反过来盯的,是攻击者"可能已经站稳脚跟"的痕迹——日志里有没有异常上传请求、网席目录里有没有多出来的 PHP 文件、Apache 或 FPM 的错误日志里有没有成段的内存耗尽和段错误。
这次真正改写的东西是这个:披露流程的时钟被换快了。过去一个冷门的内存 bug 从发现变成可用武器,要几个月。现在这个周期压缩到几周。所有还在按旧节奏做漏洞管理的团队,时间表都得重排。

【总结】
PHP2Shell 的两个 CVE(CVE-2026-109618、CVE-2026-109619,均为 CVSS v4.0 的 9.2 分)在代码库里藏了十多年,2026 年 8 月被 Calif 用 GPT-5.6 Sol、被 Wiz 用 Wiz Atlas 加 Gemini 4 Argon 各自独立发现,原计划月底修复,因为细节在 10月20日泄露而被迫提前到 10月21日 14:00 UTC 放出补丁。漏洞在 PHP 引擎本身而非上层应用,mod_php 部署的攻击可以在应用代码执行前就完成,芬兰、荷兰、法国、英国相继下线公共网站应急。修复版本是 8.5.12、8.4.27、8.3.36、8.2.35;有一条反直觉的坑千万别踩——用 RLIMIT_AS 或 RLIMIT_DATA 缓解会让内存分配以触发漏洞路径的方式失败。















































































