PHP2Shell 最值得复盘的,不是两个漏洞的技术细节,而是它在中小站点暴露出的三样东西的缺失:不知道自己在跑什么版本、不知道该在多久内修、以及不清楚防护层能顶什么用。

这三件事都不需要预算,但都需要提前决定。下面逐条给出可以直接落地的做法。

一、一份能随时回答「我有哪些 PHP」的版本台账

这次事件里,排查成本最高的部分不是修漏洞,而是圈定影响面。你没法修一个你不知道存在的东西。

NCSC 在公告里专门提醒:评估不能只限于对外可访问的网站——PHP 可能藏在管理后台、内部工具、容器镜像、商业产品的内置组件里。荷兰 NCSC 甚至为此维护了一份「哪些第三方软件内置了 PHP」的公开清单,因为采购时它不会出现在你的技术栈表里。

所以第一件事是台账。最小可用版本只需要一张表:

字段说明
站点 / 域名连同绑定域名,一个域名一行
运行形态mod_php / PHP-FPM / CGI / 容器镜像
PHP 版本与来源版本号 + 来源(自编译 / 面板 / 镜像 / 主机商)
暴露面公网可访问 / 仅内网 / 仅本机
负责人出事时能立刻找到人
补丁状态当前版本 + 是否已修复 + 最近更新时间

这份表的价值在平时不明显,在出事那天是决定性的:你能在半小时内说清「我有 17 个 PHP,其中 6 个低于修复版本,其中 2 个对公网开放」,而不是花两天找机器。

二、一条明确的补丁 SLA 与停机决策规则

这次的真正困境不是「怎么修」,而是「要不要停机」。这个问题本该在三个月前就回答过:

  • 关键站点能否停机?停多久窗口可以接受?
  • 哪些站点允许「临时缓解 + 延后升级」?延后多久是上限?
  • 谁有权批准停机?流程走多久?

把这些写成一页纸的规则,事先定好级别与时限:

漏洞级别处理时限是否必须停机
严重 / 已被在野利用(CVSS ≥ 9.0)24 小时内是,对外可访问的站点一律升级,不接受延后
高危(CVSS 7.0–8.9)7 天内可临时缓解,但必须有升级计划与复查日期
中危(CVSS 4.0–6.9)下一个维护窗口否

再补一条容易被忽略的规则:「官方已停止支持的版本」单独列一类。这次的 PHP 8.1 及更早版本就属于这一类——它们不是「补丁还没来」,而是「不会有补丁」,只能升级或换供应商。这种资产要单独列出来,混在普通版本里等通知是最危险的。

三、把 WAF 和隔离当限速层,不当修复层

官方与多国 CERT 的表述高度一致:即使有 WAF 也不够。这不是保守说法,而是因为这两个漏洞位于「几乎每个请求都会经过」的内存管理与错误处理路径上,特征并不总是明显。

那 WAF 和隔离该放在什么位置?正确的认知是:

  • WAF = 限速器。它能挡掉一部分明显的扫描与超大请求,降低攻击频率与噪声,但不是修复。
  • 网络隔离 = 优先级工具。如果只能做一件事,把非核心系统从公网隔离,比给核心系统加十条规则更有用。
  • 修复 = 唯一的解。WAF 永远排在升级后面。

这条思路对中小站点的实际含义是:不要为了「看起来有防护」而花钱买 WAF,却把升级一拖再拖。顺序反了,等于用一笔确定的开销,买了一个不确定的结果。

四、供应链视角:谁在决定你的补丁节奏

很多站点的 PHP 版本,实际由三个你控制不了的人决定:

  • 主机商 / 面板提供方:他们的补丁节奏就是你的节奏。要问清楚他们的安全更新公告怎么发布、滞后多久、是否支持回移植补丁。
  • CMS / 框架维护方:WordPress、Drupal、Laravel 之类决定了你必须运行哪个 PHP 版本区间——很多 CMS 的最低 PHP 要求会卡住你升级的上限。
  • 容器基础镜像:镜像 tag 不变不代表内容没变,安全修复常被回移植;反过来,tag 变了也可能没修。要看构建时间与 digest。

这三方都需要「主动问」,没有谁会来敲你的门。这正是版本台账里「来源」这一栏存在的意义——它同时也是你向供应商提问的清单。

五、一份能落地的季度自查表

把这四件事变成固定动作,比临时抱佛脚有效得多:

  • 每季度:更新版本台账,对照「当前支持版本」清单,标出所有已停止支持的资产;
  • 每季度:抽查一次「站点实际运行的 PHP 版本」——用 php-fpm -v,不是 php -v;
  • 每季度:验证一次备份能否恢复(没验证过的备份等于没有备份);
  • 每季度:演练一次「隔离 + 升级 + 恢复」,包括联系人和决策流程。

最后一条尤其重要:流程的可靠度来自演练,不来自文档。真正出事的那天,你会需要同时做三件事——联系主机商确认补丁、给客户发通知、准备停机窗口——这时候有没有提前演练过,差别是小时级的。

结语

PHP2Shell 会被修好,会被写进下一版 PHP 的历史里。但它暴露的那三样缺失不会自己消失。台账、SLA、防护层定位——这三件事不需要预算,只需要决定。