P0 已发生泄露事件最小方案

CODE-03 配置与凭据泄露整改

CODE-02被利用后的结果 · 客户非Docker部署 · 无独立业务代码整改

修正结论:CODE-02修复后,“上传配置读取脚本”这条攻击路径已被阻断。CODE-03不再新增业务代码,剩余工作是轮换已泄露凭据、清理历史恶意文件、验证旧值失效;CODE-04独立文件读取仍需单独修复。

漏洞关系

CODE-02:允许上传并执行PHP脚本 → 上传配置读取脚本 → 读取现有config.php / database.php → CODE-03:配置与凭据泄露 CODE-02补丁生效:阻断再次上传执行 CODE-03剩余闭环:轮换旧凭据 + 清理历史WebShell + 验证旧值失效 CODE-04:另一条独立读取路径,仍必须单独修复

当前代码现状

store/env.php:只定义 TP_ENV + BUSINESS ↓ application/config.php 公共应用配置 + application/config/prod/zhct_xwq/config.php 新吴区覆盖 application/database.php 公共数据库配置 + application/config/prod/zhct_xwq/database.php 新吴区覆盖

store没有.env.env.*文件;只有根目录env.php.env.*属于ai_api配置方式,与本方案无关。

最小处理范围

文件/环境动作
prod/zhct_xwq/config.php只更新已经泄露且仍在使用的Redis、微信及第三方凭据;键名和数组结构不变。
prod/zhct_xwq/database.php切换新吴区项目专属、最小权限数据库账号。
application/config.php不改结构;仅轮换报告已读取且仍被项目共享使用的敏感项。
application/database.php不改加载逻辑;仅处理报告已读取且仍有效的公共数据库凭据。
env.php不修改现有环境/商户选择逻辑继续使用。
业务代码不新增CODE-03逻辑入口修复归CODE-02/CODE-04。

明确不做

不新增.env

store没有.env机制,本次不引入。

不改加载器

保留TP_ENV、BUSINESS和array_merge。

不做Docker方案

客户按现有Nginx + PHP-FPM直接部署。

不改其他端

PC、小程序、设备端、接口和数据库结构不变。

凭据轮换顺序

  1. 建立数据库、Redis、微信及实际使用第三方凭据的消费者清单。
  2. 创建新吴区专属数据库账号并最小授权。
  3. 准备新Redis/第三方凭据,先不撤销旧值。
  4. 更新客户服务器现有四个配置文件的必要字段。
  5. 平滑重载PHP-FPM,执行后台、小程序、缓存和第三方业务冒烟。
  6. 撤销泄露旧值并验证旧账号、旧密码、旧Token全部失败。
  7. 完成WebShell、SSH key、定时任务和PHP自动加载等持久化检查。

已上传脚本怎么处理

  1. 先让CODE-02和Nginx上传目录禁执行生效。
  2. 确认实际项目根目录,用realpath证明目标位于public/static/upload内。
  3. 只记录statsha256sum,不得打开或执行脚本。
  4. 把精确目标移动到/var/lib/zhct-security-quarantine/等Web外0700隔离目录。
  5. 扫描PHP/PHTML/PHAR、双扩展和脚本内容伪装,逐个复核,不批量误删图片。
  6. 确认取证完成后永久删除隔离文件,验证原URL返回404。

如果报告已经展示配置内容,就证明脚本执行过。删除脚本可以清掉攻击产物,但不能让攻击者已经拿到的密码和Secret自动失效,仍须轮换。

客户非Docker部署要求

配置路径继续使用项目内application/config/prod/zhct_xwq及公共配置文件
权限建议0640;部署账号为属主,PHP-FPM运行组只读
Nginx root必须指向项目public/,不能指向项目根目录
发布备份放非Web目录,发布不能覆盖准备好的新配置
重载按现场PHP版本平滑重载PHP-FPM,不使用容器命令

验收门禁

待确认

现场信息PHP-FPM用户/组、项目绝对路径、服务名
业务清单微信、小程序、人脸、AI、打印、支付实际启用范围
共享范围公共数据库、Redis和第三方密钥的全部消费者
发布方式客户配置随专属发布包交付,还是服务器发布后独立维护

人工评审已确认:客户非Docker部署;方案按现有prod目录和公共配置文件做最小修改。