用 AI 协助修复 PHP 漏洞

近期 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 没有官方背书,出问题能退回去,这一条比方案本身重要。祝大家早日升级到安全版本

欢迎关注公众号,第一时间更新