一次博客的安全升级——起因于CVE-2026-109618、CVE-2026-109619
一次 PHP 漏洞,让我把博客从应用商店搬进了 Docker
人倒霉喝口凉水都塞牙——穿透服务商已经好几天报网络错误了(也就是说,这几天都无法通过公网访问),又碰上了PHP突然被爆出来的这两个漏洞。。。(ó﹏ò。)
本身我还觉得没什么,毕竟拿shell哪有那么简单。但当我仔细看完这两个漏洞之后,发现它的波及范围实在是太大了,我当然也会受到影响(如果被影响者分为4个等级的话,那我应该是第二危险的那一等)
那我是真没招了,赶紧重做安全防护吧。趁着这次机会,还可以把博客迁到 Docker 里面,虽然这事早就该做了
一、PHP 是啥,这次又是出了什么事
先打个比方。
博客上的文章存在数据库里,是"原材料"。浏览器看不懂原材料,它只认"成品网页"。PHP 就是中间那个厨子——每次有人访问,它现做一份端上来。
这次出问题的,不是某个菜谱(插件),也不是餐厅的装修(主题),而是厨子本身。
本次两个漏洞的编号:编号 CVE-2026-109618 和 CVE-2026-109619,官方在 10 月 21 日发的紧急公告,严重程度 9.2 / 10。它们的毛病都出在很底层的地方:
- 第一个:当服务器的内存被用光的时候,PHP 的"善后流程"会手忙脚乱,把一些还没收拾好的东西当成好的继续用。就像厨师发现冰箱空了,慌里慌张地把没解冻的肉直接下了锅。
- 第二个:PHP 为了跑得快,会把一些临时状态留在"上一班"的记忆里,想着下一个人来还能接着用。但如果这些记忆其实已经作废了,下一个来的人捡起来用,就会出大事。这在技术上叫"use-after-free"(释放后使用)。
单个看都是很偏门的边角料问题。但组合起来,结果很要命:
不需要账号,不需要点任何链接,也不需要装错什么。只要往你的网站发一个精心构造的请求,就有可能让服务器执行别人指定的命令。
也就是圈内俗称的"拿到 shell"——攻击者可以在你的服务器上跑命令,相当于拿到了你房子的钥匙。
二、危害到底有多大
可以说是天翻地覆:
在 Apache + mod_php 这种部署方式下,这个利用已经被完整验证过,而且是"请求一进来就触发",在你博客的代码执行之前就发生了。换句话说,你博客写得再安全、密码设得再复杂,这时候都帮不上忙。
换成 PHP-FPM 的部署(我原来是这种),条件会苛刻得多,需要应用侧配合,成功率也没那么高。但"没那么高"和"没风险"是两码事。
那真的被打穿了会怎样?博客里储存的数据就危险了:
- 文章、评论——可以被随意篡改、删除;
- SMTP 授权码——这个最要命,拿到它就能用我的邮箱、以我的名义发信。
是的,我检查的时候发现,那个存着授权码的数据库文件,之前是可以直接从浏览器下载的 (。•́︿•̀。)
一个用我的邮箱发出去的钓鱼邮件,杀伤力比你想的大得多。。。
三、那我为什么不打个补丁就算了
好问题,我也想过。
答案是:我打不了
本博客原是飞牛应用中心装的 Typecho,PHP 8.2.32 是应用自带的"运行时"——它捆在应用的安装包里,我改不了版本,只能等上游更新。
而这次的情况是:公告发出当天,公开的 PoC 就已经在 GitHub 上铺开了,随手一搜就是一堆仓库,有的已经一千多 star。漏洞的传播速度,和"厂商排期"之间,隔着一条鸿沟。
并且我在迁移的时候发现一点:这个应用是用 php -S 启动的——那是 PHP 自带的开发服务器,设计初衷是"本机调试用"。它单进程、串行处理请求、没有任何并发保护。
平时没人来当然没事,人一多就完蛋了。
四、迁移做了什么
第一步,备份
- 加强了备份强度、范围和频率。
第二步,搬进 Docker
- 通过搬进容器的方式换成官方
php:8.3-fpm(正好是修复版 8.3.36)+ nginx。 - 一定程度上也增加了安全性❛˓◞˂̵✧
第三步,顺手加固 :
- 关掉 PHP 版本号暴露(原来响应头里直接写着
PHP/8.2.32,等于举着牌子告诉扫描器"来打我"); - 关掉上传进度功能(官方给的缓解项之一);
- 屏蔽数据库文件的 Web 访问——就是上面说的那个能下载的授权码;
- 屏蔽安装残留文件、隐藏文件;
- 单进程的
php -S换成 nginx,静态资源加了缓存。
第四步,修了一些小毛病。 比如全站强制 HTTPS 的跳转、订阅插件记录真实访客 IP 等等。
五、说说"必要性"
我原本也觉得,自建博客嘛,能跑就行,折腾这些干嘛。
但这次之后我的看法变了。满天飞的PoC对我来说不亚于希特勒自杀前发现手里有核弹按钮,我甚至都不用想会不会有人来扫,因为换我来我也扫
自建博客的快乐在于"什么都自己说了算",代价就是"什么都要自己盯着"。这两件事是躲不掉的 ヽ(´▽`)/
如果看这篇文章的你也在自建博客,建议立刻检查:去看一眼你的 PHP 版本。低于 8.2.35、8.3.36、8.4.27、8.5.12 的,别等了,能装补丁的赶紧装补丁。
顺便说一句,8.1 和更早的版本已经停止维护了,官方不会再出补丁,自求多福吧ಠ_ರೃ(建议直接拔网线,真的,不开玩笑)
PS:这次迁移过程中所有的操作都留了备份和回滚路径,所以不用怕文章丢失。本篇文章主要是记录安全升级,所以对这两个漏洞不做过多讲解。如果你的好奇心比较重,想知道那两个 CVE 的细节,可以参考以下官方公告:
评论 暂无评论