2026年10月21日深夜,如果你恰好刷着手机,可能会看到一种非常诡异的新闻潮:芬兰政府把所有对外网络服务关了;荷兰的国家网络安全中心把自己的官网都撤了下来,鹿特丹港、荷兰足协、好几家医院跟着下线;法国内政部让各省政府网站暂时歇业;比利时外交部、维基媒体基金会、任天堂,也一个接一个把服务掐了。
一看就是发生了什么大事。但魔幻的地方在于——这些网站全都没有被黑客攻破。它们是主动关门谢客的。
让全球一堆政府和巨头网站集体“装死”的,是一串在互联网最底层埋了十多年的雷。它有个代号,叫 PHP2Shell。

一、这不是黑客打进来的,是大家吓得自己关的门
很多人听到“PHP”可能一脸懵,但你天天都在跟它打交道。W3Techs 的统计里,全球能识别出后端语言的网站,大约七成跑在PHP上。WordPress、Drupal、Joomla 这些主流建站系统,Wiki 百科的 MediaWiki,还有数不清的电商站、后台系统,底层都是它。
也就是说,全球每10个网站里就有7个,是踩在这门语言上跑起来的。
10月21日,PHP 官方紧急发布了一批安全更新,一次性堵上了两个“允许远程代码执行”的致命漏洞。这两个洞被安全圈合称 PHP2Shell,危险评分 CVSS v4.0 高达 9.2 分(满分10),安全公司 watchTowr 更是直接给到了满分10.0。
“远程代码执行”翻译成人话就是:攻击者不用登录,不用用户名密码,只要往你的网站服务器发几个精心构造的请求,就可能直接在服务器上运行他想要的任何命令。轻则偷走数据库里的账号密码、篡改网页,重则把整台服务器变成他的“肉鸡”,再顺着内网一路横着走。
这不是危言耸听。安全公司 Sansec 已经确认,Magento、WordPress、Drupal、Joomla、MediaWiki、phpMyAdmin、Nextcloud、Laravel 等一系列知名系统,都被验证可以“未认证远程代码执行”。
所以各国政府的反应一点都不夸张:补丁来不及打的,先下线保命。
二、这两个洞到底藏在哪:PHP最底层的老毛病
想看懂 PHP2Shell,不需要你是程序员,记住两个词就够了:内存和“用完就还”。
第一个洞,编号 CVE-2026-109618,出在 PHP 处理内存不够用时的“应急通道”上。网站处理请求会用到内存,一旦某个请求把服务器内存挤爆了,PHP 会触发一个类似“先救火再收尸”的机制,把还没处理完的数据草草清理掉。问题就出在这个“草草清理”上——有一部分只初始化到一半的数据,被 PHP 当成了“完整的有效数据”去接着处理,结果就是内存被搞坏了。攻击者只要精心控制请求,就能利用这段“坏掉的内存”,一步步换成执行自己代码的机会。
攻击路径走的还是所有网站都会接收的 multipart/form-data 文件上传解析——这一步发生在你的业务代码运行之前。
第二个洞,编号 CVE-2026-109619,更阴。它藏在一个叫“跨请求复用已释放内存”的机制里。网站服务器是长年开着的,一个进程处理完 A 访客的请求,又接着处理 B 访客的请求。当某个请求触发致命错误或内存耗尽时,本该被清掉的数据没有清干净,还赖在内存里。下一个访客的请求一来,就捡起了这份“上一任留下的记忆”,把它当成自己的数据来用。懂点行的朋友应该已经反应过来了——这正是教科书里讲的 use-after-free,UAF。
两个洞,一个管“内存坏了还硬要用”,一个管“上一任的数据没擦干净被下一任捡走”。共同点都是:发生在 PHP 最底层,发生在你的业务代码运行之前。
所以 Cloudflare 把话说得很直白:光更新你网站的代码、换个插件,根本没用。因为你自己的代码再干净,漏洞也不在它那儿。
更麻烦的是影响范围。官方说,所有处理网页请求的 PHP 都受影响,受影响的版本从十多年前的 PHP 5.4 一直延伸到最新的 8.5。过去十几年发布的每个主流版本,几乎都在射程之内。
三、最扎心的问题:为什么人挖了14年没挖出来,AI几天就破案
这才是 PHP2Shell 真正让安全圈后背发凉的地方——它一点都不“新”。
最早能追溯到2004年,安全研究员 Stefan Esser 就描述过 PHP 内存耗尽导致的同类远程漏洞。2020年有人提交过相关的 bug 报告,几乎没人理会。2024年,一次第三方资助的 PHP 安全审计又碰到了相关问题,但当时没法证明它真的能被利用,最后没修。
一个潜伏了十几年的洞,不是没人看见过,是所有人都觉得“太费劲了”。
独立安全研究员 Nick Rogers 给这种状态起了个名字,叫 security by exhaustion——靠攻击者累到放弃来保证安全。意思是,这洞理论上存在,但真要把它从“理论”变成“能用的攻击”,需要数周枯燥的手工调试,过去的顶尖黑客都觉得不划算,索性没人动手。
这套“靠别人懒得打”的默契,被 AI 一脚踹翻了。
今年6月,OpenAI 启动了一个叫“Patch the Planet(修复地球)”的计划,出钱出模型,请安全公司去审计那些全世界都在依赖的开源软件。安全公司 Calif 参与了,把目标锁定在 PHP。
8月1日,Calif 的研究员带着 GPT-5.6 Sol 开始审计。AI 在这里扮演的是“审计搭档”,会自己梳理 PHP 内核代码、追踪程序执行路径。仅仅几天,第一个漏洞的关键缺陷就被 AI 从内核代码里翻了出来。8月11日,团队把报告提交给 PHP 官方。
更绝的是后续:团队让 AI 把“找到第一个漏洞的方法”总结成一份可复用的技能文件,专门用来搜同一类缺陷。第二个漏洞,就是靠这份“方法论文件”顺藤摸瓜找到的。
AI 找到一个洞之后,能把找它的方法打包,再去翻下一个洞。过去一个顶尖研究员十几年磨出来的手感,现在变成一份文件,扔给无数个 agent 同时去跑。
几乎同一时间,Google 旗下的安全公司 Wiz 也独立撞上了同一组漏洞。8月19日,Wiz 的研究员借助 Wiz Atlas、Gemini 4 Argon 和 GPT-5.6 Sol,独立发现了第一个洞;第二天在 Drupal 上验证了远程执行代码;第三天在 WordPress 上也打穿了。Wiz 自己的总结是:一名研究员一周完成了过去需要世界顶尖团队数月才能干完的活。
两家公司、三个 AI 模型、三周之内,从两个方向撞上同一组漏洞。这不是巧合,这是 AI 把“找漏洞”这件事的边际成本,第一次推向了接近零。
过去那些“理论上有漏洞、但真打起来太累”的雷,一夜之间全都变成了“值得打”。
四、一次“翻车”的保密:48小时的混乱
按理说,发现漏洞这种事,圈内有个默认规矩:软件方先把补丁悄悄做好,再和发现者一起挑个时间公开,给全世界留出修复窗口。PHP2Shell 本来也是这么安排的,两个多月的时间够很多运维从容打补丁。
但计划赶不上变化,10月20日,漏洞消息在 Hacker News 和地下论坛上提前泄露了。
更糟的是,安全公司 Calif 自己还误发了一段概念验证(PoC)攻击视频;开发平台 Chainguard 又提前发布了包含补丁的二进制版本,攻击者拿新旧代码一对比,就能反推出漏洞细节。PHP 官方气得公开表示,这种做法“无视了多方数周以来为协调披露所做的努力”。
补丁被迫提前一天发布。可就在补丁发布之前,攻击已经开始了。
Cloudflare 在补丁发布前近6个小时就观测到早期利用迹象;watchTowr 的蜜罐网络在10月21日就抓到了真实的利用行为;安全公司 Sansec 更是直接预言,“大规模攻击将在补丁发布后15分钟内开始”。
OpenAI 管漏洞被发现到被攻击者利用之间的这段时间,叫“防守方窗口”。PHP2Shell 的窗口原本有两个多月,一次提前泄露,被压缩成了几个小时。
美国 CISA 发紧急通告“强烈敦促立即修补”,NSA 的建议更直接:来不及更新的,先把网站关了吧。日本那边动静更大——好几款热门游戏(比如《赛马娘》《碧蓝幻想》《公主连结》)和大量电商网站,都因为这事临时停服了。
五、重点来了:这个漏洞到底怎么解决
前面铺垫这么多,其实都是在为这一节做准备。作为网站站长、运维或者只是自己搭了个博客的人,你现在最该做的,就是下面这几件事。
第一步,升级 PHP,这是唯一彻底的修复。
PHP官方已经发布了修复版本,覆盖四个仍在支持的主线版本:
| 版本主线 | 修复版本 |
| PHP 8.5 | 8.5.12 |
| PHP 8.4 | 8.4.27 |
| PHP 8.3 | 8.3.36 |
| PHP 8.2 | 8.2.35 |
用发行版的软件源、或托管服务商提供的包升级都行。升级完,务必做一次全量排查:把 FPM、Apache、CLI 都查一遍版本号(php -v、php-fpm8.4 -v),确认所有入口都已经是修复版本。
第二步,升级完必须重启所有 PHP worker,这一步最容易漏。
很多人以为“升了级就万事大吉”,结果跑着的进程还是老版本。PHP 官方说得直白:更新后的包,对已经在运行的进程来说,啥也没发生。所以你还要重启所有 PHP-FPM 池和 Apache,让新版本真正生效:
sudo systemctl restart php8.4-fpm
sudo systemctl restart apache2
用 Octane、FrankenPHP 这类会长期驻留 worker 的,更要确认重启到位。
第三步,老版本怎么办:该升的升,该下线的下线。
注意,PHP 7.4、8.0、8.1 已经停止官方支持,没有官方修复包了,得靠厂商回移补丁、源码自编译,或者干脆升级。而 PHP 5.x 到 7.3,官方彻底不管——要么升级,要么停服,要么先放到 VPN 或 WAF 后面顶着。W3Techs 的数据显示,目前约27%的 PHP 网站还跑在 PHP 7 上,7.7%跑在 PHP 5 上,也就是说,差不多三分之一的 PHP 网站,当前连个官方修复版本都没有。
第四步,实在没法立刻升级,先拿“临时拐杖”顶一顶。
PHP 官方把下面的缓解措施叫“临时拐杖”(a temporary crutch),只能帮你争取时间,不是长久之计。你可以在 php.ini 或 FPM 池配置里改:把 memory_limit 设为 -1(注意:单个请求可能吃光整台机器内存)、调低 post_max_size、关闭 session.upload_progress(官方建议修完也继续关着)、在 PHP 8.5 上把 fatal_error_backtraces 设为 0、调低 max_input_nesting_level。如果业务上用不到文件上传,直接在边缘层把 multipart/form-data 请求挡掉也行。
做完这些,同样要重启 worker 才会生效。Cloudflare 也上线了临时 WAF 规则,能再兜一层底。
第五步,打探风声:怎么判断自己是不是已经被盯上了。
留意这几种异常:突然出现“内存不足”报错或 HTTP 500 的文件上传请求;异常超大或畸形的 PHPSESSID Cookie;服务器 worker 莫名频繁重启;PHP worker 进程里去执行了 curl、wget 这类命令。一旦怀疑中招,立刻隔离主机、备份日志,检查网站目录里有没有新增的 webshell 文件、可疑的定时任务和新账号。
六、比修漏洞更值得想的事:AI 攻防时代来了
PHP2Shell 真正划时代的意义,不在于它多严重,而在于它是怎么被找到的——以及,这意味着什么。
这已经不是 AI 第一次挖出漏洞。2024年11月,Google 的 AI 项目 Big Sleep 在数据库软件 SQLite 里找到一个此前未知的漏洞;今年4月,Anthropic 说自家模型找到数千个零日漏洞,包括 OpenBSD 里一个藏了27年的洞;今年7月,由 AI 发现的 WordPress 核心漏洞链 wp2shell 公开,随后被大规模利用。
但 PHP2Shell 是第一次,一个 AI 挖出来的漏洞,让好几个国家的政府在同一天关掉了自己的网站。
OpenAI 自己也承认:帮防御方找漏洞的同一套能力,攻击者拿过去,就能更快地造出攻击工具。这已经不是假设。watchTowr 在蜜罐里观察到的攻击尝试,有些工具就是借助 AI 写出来的。
防守方有一个时间窗口,AI 帮忙把“找洞”变快了;但修补,还得一台服务器一台服务器地做。补丁发布前一天,互联网上大约还有88万台服务器对外显示着 PHP 8.1 或更老的版本。Mallory 的统计说得很现实——对它们来说,“理论上有漏洞、实际上没人会打”的那份安全感,已经没有了。
OpenAI 判断,未来几个月,类似的 AI 挖洞发现会急剧增加。这句话已经有数据在印证:10月20日 Google 发布 Chrome 156,这一个版本就修了353个安全漏洞,而一年前的版本只有二十几个。
当 AI 让“发现漏洞”变得前所未有地容易,整个行业真正的难题,变成了“让修复漏洞的速度跟上”。这不再是一场技术仗,更像是一场成本仗、一场时间的赛跑。
对普通站长和打工人来说,这件事最实在的提醒只有一句:别再指望“没人打我”了。工具已经站在所有人手里,真正能护住你的,只有一条——该升级的立刻升级,该重启的重启,别把今天能做的安全,拖到明天。