发现2天,修复2个月:AI挖穿PHP后,卡兹克讲透攻防时间差

作者复盘 PHP 两个 CVSS 满分起步的远程代码执行漏洞(CVE-2026-109618、CVE-2026-109619,合称 PHP2Shell)从提前...

业务目标:69.3%的网站跑在PHP上,两个洞藏了二十年

W3Techs 统计:69.3% 的 Web 站点以 PHP 为后端。这两个洞藏在 5.4 时代引入的请求处理代码里,二十年无人问津。PHP 基金会在复盘里公开求助,Debian 的 PHP 打包维护者月赞助不到 700 美元。发现速度提了十倍,拆弹的人没多一个。当 AI 把全世界的雷都翻出来,有足够多的人去拆吗?

漏洞技术原理:multipart POST触发内存破坏,无需认证即可RCE

攻击者发一条特制 multipart POST 请求,PHP 解析器在读文件上传进度字段时越界写堆内存,触发点位于应用代码执行之前,无需登录、无需构造应用层 payload。腾讯云安全通告原文写得很直接:「可导致未经身份验证的远程攻击者通过发送特制的 multipart POST 请求,触发内存破坏并最终实现远程代码执行」(通告链接)。

发现方式值得单独说。研究员让 GPT-5.6 Sol 把第一个洞的错误模式写成一份 SKILL.md,Agent 拿这份指引沿同一条线索扫全库,在文件上传进度的记录逻辑里找到了第二个洞。找到的不再是一个点,而是一整类问题。人挖到一个就停了,方法论可以自动产出下一个。

影响面:Apache mod_php默认配置最危险,WordPress和Drupal全中

全部 SAPI 在风险内:PHP-FPM、Apache mod_php、php-cgi、FrankenPHP、LiteSpeed。mod_php 与 Apache 共享进程地址空间,内存破坏直接打到 Web 服务本体,所以默认配置最危险。WordPress、Drupal、Laravel,只要底层是 PHP,改插件没用,只能升 PHP 二进制。修复版本 8.5.12、8.4.27、8.3.36、8.2.35。还在跑 8.1 及更早停止支持版本的,CISA 建议只有四个字:先下机器。

PHP2Shell攻击路径与AI发现流程

二十年没人看的代码,一个模型两天全翻出来

方案A(传统人工审计):为什么二十年没人发现

人工审计的覆盖瓶颈:代码量与经验不可复制

PHP 核心代码库自 2004 年起经历多轮重构,multipart POST 解析路径上的边界条件组合呈指数级增长。GPT-5.6 Sol 两天定位到文件上传进度模块中的内存破坏点,随后将错误模式写成 SKILL.md 审计指引,Agent 拿着同一份指引继续扫描,找到第二个洞。

一个顶尖研究员对 C 内存模型和 SAPI 接口的理解,过去难以复制给第二个人。现在它是一份文件,交给几千个 Agent 实例并行跑。代码量没变,读代码的人变了。

PHP基金会的维护困境:Debian打包者月赞助不到700美元

69.3% 的网站跑在 PHP 上,Debian 打包者月赞助不到 700 美元。修复拖两个月,不是技术解不了,是人力管道里没人排队。

传统审计管道断裂点

当 AI 把全世界的雷都翻出来,拆雷的人没多一个。

方案B(AI Agent审计):两天挖穿核心,SKILL.md让发现可复制

从碰到一个点到扫出一整类问题的机制

方案A的瓶颈在于经验不可复制。AI 把这条管道接上了,但接法决定效率。

PHP2Shell 的发现过程里有个关键动作。研究者用 GPT-5.6 Sol 挖出 CVE-2026-109618 之后没有收工,他们让模型把刚发现的错误模式写成一份 SKILL.md,即一份可反复调用的审计指引,然后让 Agent 沿同样线索在整个代码库里继续扫。结果是在负责记录文件上传进度的那段代码里,找到了 CVE-2026-109619。

这一步改变了发现的拓扑结构。人挖到一个洞,经验留在脑子里,下一个人从零推理;AI 挖到一个洞,经验被序列化成一份文件,可以同时交给成百上千个 Agent 并行去跑。

从单点到类扫的审计管线

Chrome 156 的 353 个漏洞:AI 报告已成主力

这不是孤例。10 月 20 日 Google 发布 Chrome 156 正式版,单版本修复 353 个安全漏洞;一年前的 Chrome 141 和 142,这个数字分别是 21 和 26。一年时间,单版本修复量涨了十倍以上(数据来源:极客公园对 Chrome 安全公告的统计)。

报告人的名单也变了。Chrome 156 里最高等级的 6 个「严重」漏洞,4 个由 Anthropic 研究员 Xinyang Ge 提交,其中 1 个明确标注「由 Claude 协助」;另 1 个来自 OpenAI 的 Codex Security。AI 公司的名字,已经成批出现在全球用户最多的浏览器的安全公告里。

OpenAI 在 PHP2Shell 公开当天给了一句判断,原话是:未来几个月,类似的发现会急剧增加。发现端的机器速度已经跑起来了,但拆弹的人还是那批人。当 AI 把全世界的雷都翻出来的时候,我们有足够多的人去拆吗?这个缺口是下两段要处理的事。

方案C(混合修复管道):为什么修复要两个月

发现到修复之间的架构断层:补丁、回移植、生态同步的时间线

AI 把发现压缩到两天,修复管道仍要走完完整的工程周期。PHP2Shell 的补丁最终落在四个分支:8.5.12、8.4.27、8.3.36、8.2.35。每个分支独立验证 multipart 解析路径的内存破坏是否被堵死,跑完整回归测试确认没有引入新的解析异常。不是一个 diff 能交差的事,是四套测试套件乘以三种运行时(mod_php、PHP-FPM、php-cgi)的排列组合,再叠加 FrankenPHP 和 LiteSpeed 的私有集成层。

断层不在打补丁这一步,在补丁之后的分发。Apache mod_php 下解析器直接嵌入 Apache 进程,修复意味着重启整个 web 服务,生产环境的重启窗口本身就要排期;PHP-FPM 可以热重载 worker 进程,但 FrankenPHP 用 Rust 写的 runtime 有自己的编译链路。WordPress、Drupal 的插件生态不会因一次 8.3.36 发布自动重编,各托管商和云平台的 CI 流水线得逐个触发。生态同步的时间成本经常超过补丁开发本身。

而维护这条管道的核心人力,Debian 打包者月赞助不到 700 美元。撑的是全球 69.3% 网站的底层。EOL 版本(8.1 及以下)不在四个修复分支里,CISA 的建议没有第二种选项:拉不到支持版本,直接下线隔离。

PHP2Shell 修复管道与各环节耗时

在野利用先于补丁四天的窗口期怎么补

补丁上线前四天,PoC 已在灰市流通。这里有一个信息差值得注意:CISA 在公告文本里写「截至发布时未观察到实际攻击」,而 CERT-EU 同步声明中明确标注 PoC 已经流传。两个机构的监测口径不同,但指向同一个事实:攻击者不需要等官方公告,他们只需要等 PoC 在暗网论坛完成第一次转手。

Cloudflare CEO 给了一个数据锚点:正式披露前 10 小时,全网已记录数千次利用尝试;公告发出后 45 分钟,数字跳到数万;两小时突破数十万。曲线是指数型的,意味着每多等一小时,新增的失陷面是前一小时的好几倍。

这四天防守方能做什么?WAF 规则可以拦截畸形 multipart 特征码,但 php.net 原文是「没有完整的缓解方式,升级是唯一安全的选择」。WAF 挡的是流量特征,挡不住攻击者换一层编码再打。Cloudflare 网络层规则能多争取几小时应急窗口,替代不了底层解析器修复。对跑在 EOL 版本上的系统,CISA 的建议只有一条:把机器从网络上拔下来。

多国政府的应对层级其实反映了不同的资源约束。芬兰政府直接下线了面向公众的网站;日本首相高市早苗公开表态「来不及修就暂时关站也是降低风险的有效措施」;NSA 向所有使用 PHP 的联邦机构推送了更新指令;加拿大、英国、新加坡、澳大利亚和欧盟委员会同步发警。动作不同,逻辑相同:补丁没到之前,把暴露面缩到零。

从经验看,四天窗口不是 PHP 的个案。只要发现侧的速度持续快于部署侧,每个「2 天发现 + N 天修复」周期里的差值就是天然在野利用窗口期。缩短 N 有两条可执行路径:一是把补丁分发做进 CI/CD 流水线,让部署侧跟发现侧同速,托管商和云平台在公告发布的同时自动触发升级;二是对 EOL 版本建立强制隔离机制,让「暂时跑着」不再等于「永远跑着」。没有这两条,下一个 PHP2Shell 的窗口期只会更长,因为发现侧的速度还在涨。

选型决策:你的 PHP 资产该走哪条修复路径

决策表:版本 × 是否在维护期 × 能否热更新

php.net 公告里只留了一句判断:「没有完整的缓解方式,升级是唯一安全的选择。」但升级的前提是你清楚自己跑在哪个版本、哪种运行时上。官方修复版只有 8.5.12、8.4.27、8.3.36、8.2.35 四支,8.1 及以下不在回移植范围内。

当前版本 维护状态 运行时 操作 停机窗口
8.2 -- 8.5 在维护期 PHP-FPM 热加载新 .so < 30 s
8.2 -- 8.5 在维护期 Apache mod_php 重启 httpd 1 -- 2 min
≤ 8.1 已 EOL 任意 无官方补丁,升大版本或直接下线 视业务
任意 --- 前置 Cloudflare / 腾讯云 WAF 争取 4 -- 6 h 窗口,不替代补丁 0

当下七十二小时该做的三件事

第一,资产清点。对所有生产环境跑 php -v,云厂商控制台(AWS ECS、阿里云函数计算、GCP Cloud Run)都有批量拉取 PHP 版本号的接口。漏掉一台未纳管的虚机,整条补丁链就断在那里。

第二,不能升的先下。CISA 公告措辞很直白:跑在 8.1 及以下、短期内完不成大版本升级的系统,断网。Finland、荷兰、日本已经在做了。WAF 规则能买四到六小时缓冲,但 CERT-EU 确认 PoC 已在流传,缓冲不是方案。

第三,盯日志。在访问日志里 grep 异常 multipart POST 请求,重点看绕过前端框架直接打到 PHP 内核 handler 的路径。如果 404 后面紧跟 200,说明有东西已经进去了。

架构全景:一条图讲清发现、修复、验证的完整链路

Mermaid 流程图与关键卡点

把前面四段串成一条管道,真正卡时间的只有两处:发现到报告(这次是零,AI 直接吐 PoC),以及补丁回移植加生态同步(四个并行分支,下游 WordPress 和 Drupal 维护者还得各自发适配更新)。

PHP2Shell 攻防全链路

两个数字把瓶颈说完了:发现端两天,修复端两个月。AI 把前半段压到了极限,后半段卡在一个月赞助不到七百美元的 Debian 打包者和四个分支的回移植工时上。你买的旗舰款,瞬间变成平替套餐。

参考文献

延伸入口

相关推荐
风骏时光牛马1 小时前
测试标题001
前端
IT_陈寒1 小时前
Java性能优化完全指南
前端·人工智能·后端
电子IT笔记2 小时前
对接群晖NAS,上传和删除踩坑记录
前端·后端
计算机魔术师2 小时前
半年前说不缺钱,半年后150亿美元超募
前端
用户5708462574402 小时前
自动化发布器里最贵的 Bug:返回成功,但什么都没发生
前端
爱吃馒头不吃辣2 小时前
加一道题,改一天代码:题库即数据的降维打击
前端·架构
aiks_yuan2 小时前
Requestly规则使用技巧:前端联调、接口Mock与网络请求调试实战
前端
程序员老赵2 小时前
Docker 部署 MaxKB:轻松搭建企业级智能体平台
前端·docker·agent
踩蚂蚁2 小时前
输入关键词到离线模型:从 Wake Word 到多关键词 KWS 的一条工程链路
前端