你更新了PHP,跑一遍 php -v,看到的是已修补的版本号。但真正给网站提供服务的,是哪一个PHP?
一台服务器上可以同时装多个PHP分支。默认的命令行二进制可能是最新的,而某个网站仍在用更早的PHP-FPM池。只查一个版本,就留下了一个实际缺口。这正是PHP2Shell Checker要解决的问题——一个只读的开源检查工具,作者用它配合自己Debian服务器的更新流程。
PHP2Shell指CVE-2026-109618和CVE-2026-109619两个PHP漏洞,可导致未认证的远程代码执行。PHP项目于2026年10月21日发布修复,并建议立即更新。公告覆盖提供Web服务的安装形态,包括PHP-FPM、Apache mod_php、CGI、FrankenPHP和LiteSpeed。
针对标准Debian软件包,修复版本阈值记录在Debian安全公告DLA-4848-1和DSA-6574-1中。检查工具把这些相关的包信息汇总到一份报告里。
它做几件事:
- 清点已安装分支中被识别的PHP核心包,涵盖CLI、FPM、CGI和Apache mod_php;
- 把已安装版本与已知的修复阈值比对;
- 显示APT中可用的候选版本;
- 找出可能阻止更新的被锁定包;
- 在常见安装目录中搜索不在评估范围内的PHP运行时;
- 当存在更新且经确认的修复候选版本时,打印建议的更新命令。
它在本地运行,只用Python标准库,不需要外部Python包。检查器本身不发起网络请求,也不改动系统。它不执行PHP二进制,也不尝试利用这些漏洞。
在Debian 12或13上使用:
- git clone https://github.com/toxy4ny/php2shell-checker.git
- cd php2shell-checker
- 先单独刷新APT的包信息:sudo apt update
- 运行检查器:python3 check-php2shell.py
在依赖报告中的候选版本之前,先解决apt update报出的错误。检查器读取的是本地APT索引。若要额外扫描一个PHP安装目录,可加参数:python3 check-php2shell.py --scan-root /www/server/php。
结果会落在三种状态之一。一个示例输出是这样的:[UPDATE] php8.2-fpm installed=8.2.34-1~deb12u1,并提示Debian包版本低于8.2.35-1~deb12u1。
UNKNOWN是设计中有意保留的一部分。厂商可能在不采用最新上游版本号的情况下回移安全修复。把所有较旧的第三方构建都判为有漏洞会误导;在没有证据的情况下判为已修复则更糟。遇到这类情况,检查器要求你去核对厂商公告。它的规则内嵌在脚本里,日期为2026年10月22日,不会自动刷新。
还有一条边界值得理解:包更新了,并不证明正在运行的PHP工作进程已经重启。应用更新之后,要重启受影响的PHP-FPM服务;使用mod_php时重启Apache;以及相关的长时间运行的PHP工作进程。然后再验证你的站点。
容器、chroot、任意自定义构建和应用代码需要另行检查。一个FIXED结果描述的是被评估的包元数据,它不认证整台服务器,也不排除此前已被入侵的可能。
该检查器在Debian 12和Debian 13容器中做过测试,包括使用真实dpkg进行比对,并针对已安装的PHP包运行。GitHub Actions在两个发行版上均通过。项目包含八个自动化测试,以MIT许可证发布。
如果你维护Debian的PHP服务器,先读一遍脚本,再对安装环境运行它。检查每一个对外提供流量的PHP运行时,应用相应更新,重启受影响的工作进程。项目欢迎贡献,尤其是回归测试和有厂商一手公告支撑的额外版本规则;提交issue时请隐去敏感路径和服务器细节。
热门跟贴