这次 PHP 漏洞 (109618/109619) 事件的一些复盘和反思

这次PHP出现漏洞修复发布已经过去超过一天半的时间了,有了一些思考和想法,来复盘一下整个事件的经过,说一说自己的想法,还有一些小小的反思。

事情最开始,大概在前天(修复发布当天)早上11点前后的时间,在一个群里看到有人发了一张截图,内容是关于这次漏洞修复的预告,大概是这样:

一开始的时候,我其实并没有很在意,甚至觉得这事儿好像没什么大不了的,该干啥干啥,吃好睡好最重要,虽然我也维护着那么几个用PHP的老系统,PHP遇到漏洞和问题太常见了,似乎没有什么值得大惊小怪的,当时就想,那过几天想再想起这事儿的时候去更新一下PHP版本就万事大吉了。这个时候,我也没有那么重视这件事,已知的信息很少,中午的时候有人问我,我还这么说

但慢慢地,这个消息越来越多次地出现在我的面前,在越来越多的社交平台或网站上反复看到类似内容,论坛里也出现了关于这次事件的讨论,比如…

甚至一些服务商也开始提示风险,到这,心态就发生了变化…然后遇到了火上浇油的说法:

套了 CF,扫 IPv4 的话,不到办个小时就能扫完全网

不过就算到了这时候,我的想法(和别人讨论的时候说的)还是 仔细想想我觉得其实可能没那么严重,如果真的严重到需要把站点都停下来的地步,那官方发布的修复应该不会忽略8.1及以下版本,不过同时也开始更多的了解相关的信息。当时给运维说:“把 session.upload_progress.enabled 关掉,晚一些更细PHP版本”。

再然后,再然后,看到了很多站点预告了维护,甚至有的站点直接关机了,其中不乏一些平时关注的比较大的站,再然后需要维护的其中一个系统的一个客户说,哎,听说PHP有这个漏洞啊,我听说**(其他站)已经关机了,我们要不要也关?

这一刻,问题的性质就变了…我不再是可以轻松应对的人了,一边安抚客户情绪,一边规划时间,晚上蹲点第一时间更新变成了必须完成的事。

时间来到下午 6 点,收到了这样一个东西:

这东西冠上了 POC 的名头,但当时官方还没发布修复,然后仔细看了看,很明显这不是同一个漏洞,我是这么说的

不过,很快消息传来,有其他人复现这个 “POC” 成功了,嘶~~此时我也有了,要不关站的想法(最后还是忍住了)。

既然提到了这个仓库,这里就先说说题外话,我没啥能力,懂的很少,实际也没做什么,不配公开评价他人,但现在这个仓库是这样的,实在是有点…哎…

然后,就到了晚上更新的时候了,思考下来,盯源码是最快获取更新的办法,嗯,然后,很快等到了源码更新,那这时候第一时间应该做什么呢?没错!当然是交给AI分析,然后发个帖子了。。。(略略略!)

在修复发布半小时后,PPA 还没更新,版本迁移验证还没做,一旁看修复的AI也给出了事态非常严重的结论,于是,根据AI 的建议调整了nginx的配置

 client_max_body_size 1m;

 if ($http_content_type ~* "(multipart|boundary)") {
     return 415;
 }

 fastcgi_request_buffering on;

然后现场让AI改造文件上传和数据提交接口,放弃了所有 multipart 的上传。

再之后,就是平平无奇的更新了,就不具体说明了。与此同时,看到了各种漏洞像雨后春笋一般冒了出来(得益于印度老哥的证书,大家几乎都没能幸免于难),各种梗图和段子,看得我也是很开心。

再之后就到了刚刚,忙完了各种乱七八糟的事情,有时间来具体看看这个漏洞怎么回事儿,顺便看看网上到底有没有可用的 POC 了,然后发现有挺多自称是这个漏洞的POC,都是之前那个反序列化漏洞问题带来和演生的,和这次 109618/109619 ,除了都是同一个模块上的漏洞之外,似乎没啥太大的关系。不过还是找到了一个实际有效的(eness/php2shell-CVE-2026-109618-CVE-2026-109619-PoC)在我看的众多号称针对这个漏洞的POC中,只有这一个是我认为真正匹配这两个漏洞的。

在此之前,我并没有特别仔细地去分析这个漏洞,只是看了AI所给我阐述的内容,大概有了一些了解,让AI为我确认没有利用POC名头投毒后,就想直接尝试执行,用本地还没更新的开发环境试试,看看效果总是没问题的。

看了看这个POC,它的配置的主要内容大概是这样的:

ZIF_OFFSET = 0x43A870       # zif_system
DTOR_OFFSET = 0x613C50      # ZVAL_PTR_DTOR (zval_ptr_dtor)
HTDATA_OFFSET = 0x6E0D8     # live 167-byte string used as fake HashTable
MAX_CMD = 14                # 167-byte carrier - 0x98 header - NUL

BOOKWORM_STAGE1_N = 841
BOOKWORM_STAGE2_T = 406
BOOKWORM_STAGE2_V = 16
BOOKWORM_HTDATA_OFFSET = 0x690D8
BOOKWORM_STAGE3_PADS = [(31, 31)] * 6

SID = b"attacksessionid0001"
DEFAULT_CMD = "id>/out/p1"

然后我愣住了,我本地的版本和他的演示的版本不一样啊,我毫不怀疑,根据这个POC和对应的容器环境,能够复现,但我本地的环境是 nginx 搭配 php-fpm,和POC的针对libphp.so完全不同…仔细想想,我也没能力靠自己完成改造实现漏洞的利用和验证…

zif_system是这个POC里使用了PHP的system/eval函数用一种最简单的办法实现验证和复现,php服务的内存基址在读Zend MM的指针遗留可以直接读到,但zval_ptr_dtor的偏移量不是能直接得到的,只能依赖对版本的提前分析。每一个PHP版本,每一种编译参数,优化方案都会带来不一样的地址,偏移量但凡错一点,可能出现的就不是获取到shell,而是干崩服务了,想要实现高阶的利用,这个哈希表也要精心的设计和计算……

哦,对,上面这些是我根据我的理解给出的看法,受我个人能力的限制,这些内容很可能是错误的,具体怎么实现的,还是看其他大佬或者AI的分析吧

嗯?是不是有点过度紧张了,仔细想想,CVSS也只给到了9.2的评分啊,只要有万分之一的可能性拿到shell,那这评分就能妥妥地到9以上,那这次事件就更像是狼来了的故事中狼没有真正来的那次了,并不是说漏洞不严重,也不是可以忽略它,而是并不需要那么紧张,对于一些小的站点和服务,完全没有必要为此停机。

那么开始反思当时怎么想的,为什么会越来越急急呢?大概是近几年AI的发展实在太迅速了,有了一种在计算机领域AI无所不能的错觉,相信了传言和其他人说的,AI分析只需要15分钟就有利用工具出现,不出一小时就能扫遍全网IPV4的说法。

鉴于我已经习惯了使用外置大脑思考,能不用自己的脑子思考就不用自己的脑子思考的情况。这里直接放出外置大脑替我进行的一些考虑和反思

这是AI总结的利用这两个漏洞获取shell的必要路径

综合下来,在现在大部分公开部署的项目中,都会有意识地避免版本信息向访客的泄露,很多运维工具还会自动地禁用一些高风险的函数,这更是一个可以被利用来进行拒绝服务攻击的漏洞,拿到shell的条件还是非常苛刻的。

但是又根据最坏假设的原则。这个漏洞被预告为能够实现未授权远程代码执行,且影响版本范围如此之大的时候,又不得不加以重视。在这件事情的处理上,我认为前期过度轻视了漏洞可能带来的影响,但中后期又过度的紧张了,其主要原因还是对相应技术的不了解,对CVSS具体评分依据的不熟悉,以及未能保持和控制的心态,对信息的过度解读,以及就算在刚刚还存在的一些思维上的偏差。

继续帖出外置大脑的思考。

既然都习惯用外置大脑思考,之前做出决定前,一定也问过外置大脑的建议。当时所有的模型都说这事情非常严重,需要立即重视和响应,现在是事后复盘时间

这时候还有问题,为什么官方在提前预告的公告里,只是大致说了是 upload_progress 的问题,而没有给出建议的缓解方案呢?

一个良好的正确的处理过程应该是怎样的?

那么再想一想,之前说的AI很快就能做出漏洞利用工具,这一点是真的吗?

这一项我们暂时保持存疑的态度,毕竟两年前我们都不会觉得未来有一天能许愿式编程,难说未来真的有模型能许个愿就能把攻击工具做出来了呢

看到一些站点甚至公共服务网站停止了服务,那这真的是好选择吗?什么时候才应该停呢?

如果未来再遇到这样的情况,推荐的执行步骤是怎样的

好的,这就是这次想要说的全部内容了。这两天各种东西的漏洞纷纷出现,还望大家保持清醒的思考,准确、理智地判断风险,及时采取必要的措施,不要在狼真的来了的时候毫无准备。

最后,祝大家吃好睡好,身体健康。

16 个赞

在修复前不公开更多的有效信息也许是正面的,你知道怎么防御了,黑客也能反推出该怎么攻击。

这种溢出漏洞,再加上 PHP 编译参数问题,利用起来还是挺费劲的

然而事前的公开消息就说了是upload_progress的问题,然后似乎还真给人找到了一个和这个漏洞不一样的反序列化漏洞…

1 个赞

w 感觉看了好多 似乎比较难触发的喵~ 感觉像渲染出来的(呆

还以为react2shell这种随便可以触发的呢(逃

虽然确实现在得在特定环境下才能方便复现…不过这才过去不到两天…可能自动化定版本,扫站利用的工具虽说没那么快,但大概率还是会出现的…喵w

1 个赞

w 最开始以为是那种可以随便执行然后可以随意下载小网站视频的漏洞呢, 真出来发现大部分可能是oom(呆

不过感觉ca的实际影响更大些喵~ 最大的好处就是可以不root随意抓包旧版应用了喵~(逃

已经连续加班两天了,升版本升框架!

只要不修…localhost也可以拥有可信tls,确信(抓

很好的复盘反思。我也分享下我的经过。我这也有些遗留的php项目维护,部分TOG的。

初期收到消息的时候我也感觉没什么php有漏洞太常见了。我简单的看了下服务器没什么问题,但是后续越来越多的消息出现,我也感到了一些不寻常。

短暂的思考了下能不能承受停机的代价,选择关停所有php服务,并同步国家互联网应急中心的消息给业主方。

最后的结果就是我的操作比业主收到文件通知要快,他可以及时向上反馈。
对我个人呢,我至今没像你这样复盘过,没深究过这个漏洞具体利用方法。仔细想想是有些过度反应了,但是不出大问题就行了。

当然现在系统还没恢复,还在评估。

1 个赞

w Google框架好说 至于国内的手机吗, 感觉就比较难了 尤其是钉子户用户的喵~(呆

1 个赞

w 据说最近还有更多漏洞喵? 可能还有加好多班呢(逃

codex -p "使用rust/go重写该应用"

https://linux.do/t/topic/3062268/52?u=pluto233

如果你不是自己的业务那应该把风险选择权交给客户,这个洞让我学到的地方

1 个赞

佬友分析的很详细,赞了:+1:t2:

VCSS

(顺便捉到一个虫子(bug))

昨天让大肥鱼跑了两节课,得出的结论是如果想完成php2shell,至少得知道对应php版本号,才能准确计算出偏移量,之后就是漏洞链利用拿www权限了

目前几个小鸡已经全部手动关站了

1 个赞

看到消息第一时间就让ai搞了自动脚本。结果就是getshell几率很低,最多也就 DoS

1 个赞