gongxiangp2/docs/runtime-security-upgrade-2026-10-22.md

5.4 KiB
Raw Blame History

运行时安全升级与回滚

范围

组件 本次目标 边界
素材库 Web、独立渲染进程 Node 22.23.4,固定官方镜像清单 SHA-256 重新编译 Canvas / Sharp,保留现有应用、权限与存储契约
通知中心 Node 22.23.4 独立仓库;临时 SQLite 回归,不发送真实通知
本机 Pi Node 24.22.1 或同一 24.x 线后续安全版本 随客户端打包;主入口、SDK 入口、打包均拒绝旧版本
原生客户端 HTTPS rustls-webpki 0.103.16、webpki-root-certs 1.0.10 保留 Rustls 校验,不关闭 TLS 验证
MinIO 原 2025-04-22 源码,Go 1.26.10 重编译 原协议、命令、数据卷与版本格式不变
frpc 原 0.67.0 源码,Go 1.26.10 重编译 配置不变,四个入口逐个切换、逐个检查
TrueNAS 自带 Docker、系统 rclone 另行安排 NAS 维护 用户已确认分开处理,本轮不改只读系统、不重启 Docker / NAS,不宣称已修复

生产链路没有 PHP / PHP-FPM;不为本次更新新增 PHP。 不修改其他项目的全局 Node、操作系统配置或模型上游。

依据与可重建性

Go 源码的提交、归档哈希和版本在 scripts/security-runtime/go-sources.json; 构建镜像、参数和上游许可证保留在 go-rebuild.Dockerfile 的构建结果中。 GOTOOLCHAIN=local 防止模块声明把工具链降回旧版本。自编译包不冒充上游新发行版。

node scripts/security-runtime/prepare-go-context.mjs output/security-go-build
docker build --target artifacts -f output/security-go-build/Dockerfile output/security-go-build

tls-probe.go 只执行 TLS 握手:正常站点必须通过,两个失信证书样例必须被证书验证拒绝; DNS、超时和网络错误不能算修复通过。不发送 HTTP、API Key 或业务数据。 本机 Node 使用相同的正反例验证;Rust 的显式联网验收测试默认 ignored,须单独执行。

历史 Dockerfile.base 改为按锁文件重新安装原生依赖,禁止导入 Node 18 的二进制缓存。 旧 setup-build-cache.ps1 不是当前生产链路;新基础镜像构建不读取它生成的缓存。 开发 Compose 与本地验收 Compose 也固定同一安全版本,避免参数覆盖回旧 Node。

本地兼容门禁

已完成:

  • Node 22 下账号、素材权限、分片上传、下载、原图和报告外部接口、Agent 规则与异常恢复:15 个套件、155 项通过。
  • 渲染器:中文字体、图片比例、PNG、长图、可编辑 PSD、非法输入等 6 项通过。
  • Pi:31 项回归;客户端主程序:182 项通过、严格 Clippy 通过、31 个 crate 分层检查通过。
  • 真实本地 1440 × 12337 多屏文件:中文编辑、撤销重做、保存重开、分层 PSD 重读通过。
  • 更新后的本地客户端恢复原账户、56 条对话及原画布;原生模型桥只读检查通过。没有新增模型请求。
  • MinIO 在同一隔离测试卷上依次运行原版、修复版、回退原版;图片、PDF、ZIP、RAR 的逐字节校验、Range、分页、元数据均通过。
  • frpc 0.67.0 的配置校验、TLS、Token 鉴权和 TCP 转发在隔离网络通过。
  • Node、Rust、Go 均通过正常 HTTPS / 失信证书正反例。实际生产替换后须再次核对运行版本与证书行为。

图形界面和模型调用流程不在本次重写。没有用新的付费调用代替兼容回归;未知请求不重发。

数据保护与生产切换

备份位于生产机私有目录: /mnt/PoolOne/apps/youyidian-3d/security-upgrade-20261022/backup。 PostgreSQL 使用一致性逻辑备份并验证 TOC;通知 SQLite 使用在线备份并通过完整性检查。 MinIO 数据集和上传素材数据集均建立 security-upgrade-20261022 快照并加 hold。 环境、容器配置和原镜像保留供回滚;不得把这些敏感备份纳入 Git 或日志输出。

  1. 只打包已提交的源代码,不把工作区无关改动混入发布。
  2. 镜像归档逐份校验哈希、Linux/amd64、真实 config ID 与版本标签。
  3. 记录 DB / Redis 容器身份、素材挂载、队列及未知请求指纹;有活动任务先等待。
  4. MinIO 与通知中心分别替换,故障立即切回原容器;禁止两个 MinIO 同时写生产数据卷。
  5. frpc 先用原服务环境校验配置,再逐个重启;每个入口核对原业务健康,失败恢复原二进制。
  6. Web 按现有增量发布流程部署。无数据库迁移、数据恢复、素材清理或自动补发模型。
  7. 检查公网页面、权限、健康端点、真实素材读取 / Range、通知队列、Node 和 Go 身份。

回滚优先恢复程序和镜像,不能自动回滚素材 ZFS 快照,避免覆盖切换后新增的用户文件。 数据库引擎、库结构和用户文件均不属于本次修改范围。

本地构建与验收原始证据保留在 output/security-upgrade-20261022/。 客户端包为本机未签名开发包,不能当作已签名正式安装程序分发。