昨天晚上,PHP官方悄悄发布了四个小版本,8.5.12、8.4.27、8.3.36、8.2.35。
如果你只当它是例行维护,我劝你现在就去打开你的服务器看一眼。这四个版本号背后,是两个CVSS 9.2分的远程代码执行漏洞。攻击者不需要账号,不需要密码,甚至不需要你的网站有什么 bug,一个普普通通的HTTP请求打进来,就能把你的服务器变成他的肉鸡。
更离谱的事在后头。这组漏洞在PHP代码里躺了超过十年,无数安全审计从它头上走过,谁都没能把它们变成真正能用的武器。最后把它们从「理论风险」变成「真能打进来的子弹」的,是AI。
事情是这样的。
云安全公司Wiz的研究员,带着两个搭档,一个是安全公司Calif,一个是OpenAI,用前沿大模型把PHP的核心引擎翻了个底朝天。Wiz那边用的是自家的Wiz Atlas,配Gemini 4 Argon和GPT-5.6 Sol,8月19号发现第一个洞,8月20号就确认了对Drupal的无认证远程代码执行,8月21号,WordPress也沦陷。
他们把整条攻击链做成了一个脚本,起了个很直白的名字,php2shell。在WordPress、Drupal、Joomla官方最新的容器镜像上,全部打通,无需登录,一发入魂。Calif那边列的沦陷清单更长,MediaWiki、Roundcube、Magento、phpMyAdmin、Nextcloud、Laravel、Symfony,一路数下去全是熟人。
这里有个细节,我跟你说,是整件事里最吓人的一句。
漏洞不在你的应用里,在PHP本身。哪怕你的网站只是一个Hello World,应用代码干净得像一张白纸,只要你跑的是有问题的PHP,你就是靶子。安全圈过去安慰自己的那套「我的代码没问题所以我很安全」,这一下被干碎了。
还有一个更安静的洞。Wiz顺手证明了,就算不打RCE,攻击者也可以远程读走PHP进程内存里的东西。那里有什么呢,其他用户的密码、登录凭证、API密钥、证书。反正就是一个请求过来,你的服务器内存任他翻。
说真的,看到这我后背是有点发凉的。然后我看了眼披露时间线,后背更凉了。
原定的补丁发布日是10月22号。结果20号下午三点,两个CVE编号就提前在网上论坛流传开了,还带着一个传错的CVSS 10.0满分,官方被迫把预告提前,把发布整个挪到21号。20号晚上八点,Calif这边一个没忍住,误发了自己的PoC演示视频,各种魔改PoC当天就多起来了。21号早上七点四十一,安全公司Chainguard单方面撕毁了禁发协议,把带着修复的镜像直接推上了线,比协调发布时间早了六个多小时。
一场教科书级的协调披露,最后硬是演成了大型翻车现场。。。
你要问这洞有多老,那故事能再往前翻二十年。2004年,安全研究员Stefan Esser就报告过PHP内存限制相关的远程漏洞。2020年,有人给项目提过这个out-of-memory状态污染的问题。2024年,OSTIF和Quarkslab拿着Sovereign Tech Agency的资助做了一次PHP全面审计,又摸到了同一批问题的边,但没能证明可以被利用。
修不动。PHP基金会自己在博客里写,修复工作反复停滞又重启,拖了好几个月,原话是「我们不装,这是结构性的失败」。
那为什么现在突然就打通了?
Wiz在博客里给了答案。这类内存安全漏洞要变成可用的武器,得把多个bug串成链,还得针对每个目标的版本、配置、内存布局反复调试适配。一个攻击在A部署上能跑,换到B就得重新调。这活以前要世界顶级的团队干几个月,且未必干得成。
现在,用Wiz的话说,一个研究员带着前沿模型,一周干完了。
复杂度不再是屏障了,朋友们。这句才是整件事的分量所在。
好,如果你觉得这只是PHP一家的事,那这一个月的行情你可能还得再往下看。
Go在10月20号走了他们的URGENT通道,就是那个「威胁到整个Go生态完整性」才配用的最高优先级,发布了1.27.3和1.26.10。这俩版本干了件特别硬核的事,在crypto/x509里硬编码拉黑了8张eMudhra中间CA证书的公钥哈希。eMudhra是一家印度的证书签发机构,10月17号周六晚上,有研究员报告说这8张中间CA的私钥确认泄露了。私钥在敌人手里,那攻击者就能签发任意域名的假证书,对HTTPS流量发起中间人。
Chrome和Firefox当天就把这8张证拉黑了,苹果19号跟进,微软20号跟进。Go团队的做法其实吧,更绝,直接写死,没有GODEBUG开关,没有任何环境变量可以绕过,我就是不给你留逃生舱。
但这里有个坑,好多团队会踩。Go的安全修复是编译进二进制的。你的构建机升级了Go,等于什么都没发生,必须把所有跑TLS服务的Go程序重新编译、重新出镜像、重新部署。我寻思这周已经有不少运维在连夜重编了。
这之前10月8号,Go还发过1.27.2和1.26.9,一口气修了15个问题,HTTP/2服务端崩溃、校验和绕过,都有。
Node.js这边,10月21号三个分支一起发安全版本,26.12.1、24.22.1、22.23.4,修了十个CVE,四个评到High。Brotli解码器越界写入,处理不可信的压缩内容就能被远程执行代码;TLS证书的主机名校验有两个绕过,一个藏在全角数字写的IP里,一个藏在松匹配解析到IP的域名里;还有一个dns.resolve遇到NUL字符截断域名。最有意思的是它同时更新了内置根证书库,把eMudhra那批泄露的中间证也拉黑了。你没看错,就是上面Go拉黑的那家。从Chrome、Firefox到苹果、微软,再到Go和Node,这条拉黑线是四天之内全员列队的,证书信任这件事,从来都是信的人比挖洞的人跑得快。而Node官方还补了一句冷飕飕的话,22、24、26之外的老分支?不支持了,但也受影响,自己看着办。
Python 3.10在10月1号寿终正寝,临终版3.10.22带着8个CVE走的,其中三个全挤在tarfile的解压过滤器上,硬链接指向符号链接可以绕过路径过滤,解包能写到目标目录外面去。你要是用Python解过不受信任的压缩包,恭喜,你也是老演员了。而且3.10.22只发源码,连个Windows安装包都没有,官方明说了,别指望3.14,先迁到3.11再说。
微软10月补丁星期二,修了1400多个漏洞,破了历史纪录,Windows Shell在野零日、.NET Framework的WDAC绕过(署名谷歌Project Zero的James Forshaw)、C#世界的MessagePack内存滥用,全在里面。值得玩味的是微软自己的解释,修复数量这么夸张,一部分原因是他们越来越多地用AI来找漏洞。
看出来了吗,这个月,PHP、Go、Python、Node.js、C#,主流语言一个没闲着,语言的核心运行时和标准库集体爆雷。
而比这层更有意思的,是第四层。就是咱们这一年最兴奋的AI agent生态自己。
先说一个我觉得特别黑色幽默的事。让AI agent连上工具世界的MCP协议,它的官方TypeScript SDK在10月6号领了一个CVE-2026-104850,OAuth客户端不校验凭据该交给哪个授权服务器,MCP服务器说谁是谁就是谁,你之前登录存的refresh_token和client_secret,它指哪儿你就往哪儿发,全程无交互。7.5分,听着不高,但这是直接端走你身份证的洞,从2025年5月的1.12.0一路带到9月底。
Cycode在9月28号先在Python SDK里报了同一个bug,然后你猜怎么着,Python这边至今连个CVE都没有???同一个洞,两种语言,一份CVE,另一份在野。
最骚的是这玩意的修复使用姿势。官方明说了,升级不等于修好。存量的token没有issuer字段,升完级它们照样发错地方,要么补写issuer,要么清空让用户全部重登。machine-to-machine的提供商必须显式传expectedIssuer,不传只有一条警告,Python的警告还默认被藏起来。一张「升级即修复」的工单,十有八九是假闭环。
LMCache,给vLLM这类推理服务做缓存加速的开源件,10月7号被JFrog报了CVE-2026-105192,9.8分。它的多进程模式里,ZeroMQ套接字没有认证,消息用pickle反序列化。可能有小伙伴不知道pickle是个啥,你可以理解成序列化格式的任意代码执行,一条报文过来,代码就在你的服务器上跑了。发布当天,没有修复版本,升级都没有得升。按官方镜像跑的话,你的缓存服务还是root权限的。同一天还躺着一个更朴素的洞,/run_script端点,无需登录,直接执行你POST过来的Python。
同一周的漏洞速览里还有,Langchain-Chatchat的/tools/call接口裸奔,可以调它注册的工具,而它的工具列表里永远躺着一个shell,官方Docker镜像里还是root。DB-GPT的聊天端点,因为一个mock的用户认证函数,来者皆是管理员。IBM给Langflow一口气发了25个漏洞公告,两个9.8的未认证RCE。Letta的默认compose.yaml压根不启用认证中间件。
坦率的讲,这一层看得我又兴奋又心虚。我们这代人搭AI agent的姿势,基本就是官方镜像一拉、端口一开、能跑就行。而这些框架的默认配置,本身就是一层窗户纸。漏洞的定义权,正在从「你的代码写错了吗」,滑向「你周围默认跑着什么」。
聊到这,我想把镜头拉远一点。
安全圈每几年会有一个「分水岭事件」。2014年Heartbleed,大家也都知道,让大家发现原来互联网的信任地基 OpenSSL 可以烂成这样。2021年Log4Shell,让大家发现一个埋在依赖深处的JNDI,能穿透整个Java帝国。这次Wiz自己给php2shell的定位,就是AI时代的同类节点,我认为他们说得没错。
但这次还多了一个新变量。OpenAI在披露文里造了个词,叫Defender's Window,防御者窗口。意思是,这一次,前沿AI先于攻击者找到了这些洞,防御者赢在了时间前面。他们为此砸了10亿美元额度的Daybreak访问给一线防守方,还发布了个Codex skill让你自查PHP版本。
听着很热血对吧。但你把另一面也放上天平称一称。PHP基金会今年5月才组建生态安全团队,7月和9月各自新雇了一个人,一共凑出一个能全职数洞的小队。7月1号以来发了15个CVE,同时处理了超过100份「无效、重复、复现不了」的报告。这100多份是怎么来的,我不用明说了吧。AI开始给全世界的代码库挖洞之后,维护者的第一份工作变成了在沙子里淘金。
一个维持着七成网站的地基,安全团队是今年才凑齐的,靠向整个行业伸手要赞助才转得起来。真的就是一声叹息。挖洞的速度是指数级的,修洞的人是编制内的。这个剪刀差,比任何一个CVE都更能说明我们正站在什么位置。
怎么说呢,所以我个人的判断是这样的,别嫌我武断。
往后「这个漏洞太复杂、利用门槛太高、黑客懒得打」这条自我安慰,正式作废。复杂不再是屏障,只是时间问题。所有沉睡了十年二十年的老洞,都值得重新问一句,现在AI能不能把它串成链。你想想看,过去我们说一个系统安全,说的是你的代码写对了。现在这句话的完整版变成了,你的代码写对了,但你脚下踩的运行时、你构建时用的证书链、你 pip install 进来的依赖、你为了调试顺手挂上公网的 agent 框架,只要有一层是烂的,你就不是安全的。
今晚就能做的几件小事,我自己已经安排上了。去你的服务器上敲一下php -v,8.2到8.5的都去看有没有打上昨天的补丁,8.2今年年底就停止维护了,别拖。Go服务走一遍完整的重编译流水线。Node在26、24、22分支的,升到对应的26.12.1、24.22.1、22.23.4。依赖清单里搜一下3.10,开始搬家。用了MCP SDK做agent集成的,去把expectedIssuer传上,把存量token翻出来看看有没有绑issuer,别信「升级即安全」这一句。还有,把你那些「只在本地调试」的AI框架端口,从公网收回来。
回到开头的画面。那个在PHP墙上挂了二十多年的钉子,人类研究员摸了它十几年,最多只能说一句这里理论上有点危险。而AI用一周,把它敲下来磨成了一枚子弹,赶在黑客之前,交到了防守者手上。
这一次,防御者赢了一回合。
但窗口这个词本身就说明,它是会关的。
评论