近期 PHP 爆出两项高危远程代码执行漏洞(俗称 PHP2Shell 漏洞),CVSS 评分均高达 9.2 分,可谓火爆全球,甚至日本首相都发微博警示。
我们大部分是 PHP 7 版本,少部分是 8.0,基本都没有官方修复版本。下面说一下我的修复方案。
Docker 版方案
首先感谢宝塔,官方提供了各个版本的修复包, https://docs.bt.cn/notices/php-security-protection-guide/ ,需要的话可以自行下载。
Docker 版本我们会找版本最接近的源码包,比如 7.3,就找宝塔提供的 7.3.34 修复版本。
在原有镜像基础上,以源码包让 AI 替换掉原来的版本,但要把 PHP 源码的编译配置参数以及线上已加载的模块告诉它。
CID=c266257f5735
docker exec $CID sh -c '
echo "===== 1. php-config 权威路径 ====="
php-config --prefix
php-config --ini-path
php-config --extension-dir
echo "===== 2. php --ini ====="
php --ini
echo "===== 3. /usr/local/php 是软链还是实体目录 ====="
ls -ld /usr/local/php
ls -la /usr/local/php/ | head -20
echo "===== 4. 【最关键】php / php-fpm 命令是软链还是实体拷贝 ====="
which php php-fpm php-config
ls -la $(which php) $(which php-fpm) 2>&1
ls -la /usr/local/bin/php /usr/local/bin/php-fpm /usr/local/sbin/php-fpm 2>&1
echo "===== 5. extensions 目录 ====="
ls -la /usr/local/php/lib/php/ 2>&1
ls -l /usr/local/php/lib/php/extensions/*/ 2>&1
echo "===== 6. php.ini 里的 extension 行 ====="
grep -nE "^[[:space:]]*(zend_)?extension" /usr/local/php/etc/php.ini 2>&1
echo "===== 7. 实际加载的扩展 ====="
php -m
echo "===== 8. 版本与 fpm 配置 ====="
php -v
php-fpm -t 2>&1
'
镜像制作完成后,把旧的 PHP 容器删除或者停掉,换成新镜像就行了。PHP 源码根本不用动,composer 也不用重新拉,只在 PHP 层面替换,基本上无缝切换。
源码安装
如果是在服务器上直接源码安装的,或者用其他方式安装的,思路也是一样的,就近选择修复版本。让 AI 先分析一下服务器现状,再给出修复版本的编译配置和依赖包信息,编译完成后替换老的版本。
宝塔
如果用的是宝塔,那就更简单了,直接找到最接近的安全版本,编译安装后切换一下就行,都是傻瓜式操作。对于没有运维能力的,可以用宝塔重新部署一下,以后直接用宝塔就行了。
总结
这三个方案没什么高下之分,看你的环境。Docker 的最省事,换个镜像就行;服务器源码装的,关键是让 AI 先把编译参数和已加载的扩展摸清楚,参数差一个,编出来的东西就跑不起来;宝塔用户直接编译安装再切换,最快。
动手前记一句:旧的镜像或者包别删,留着回滚。自己编出来的 PHP 没有官方背书,出问题能退回去,这一条比方案本身重要。祝大家早日升级到安全版本