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

78 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 运行时安全升级与回滚
## 范围
| 组件 | 本次目标 | 边界 |
| --- | --- | --- |
| 素材库 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、操作系统配置或模型上游。
## 依据与可重建性
- [Node 官方 2026-10 安全更新](https://nodejs.org/en/blog/vulnerability/october-2026-security-releases)
- [Rustls 证书验证修复](https://rustsec.org/advisories/RUSTSEC-2026-0382.html)、[内置证书修复](https://rustsec.org/advisories/RUSTSEC-2026-0383.html)
- [Go 官方证书信任修复 / CVE-2026-111943](https://go.dev/issue/82345)
- [TrueNAS 官方开发模式限制](https://www.truenas.com/docs/scale/systemsettings/advanced/developermode/)
Go 源码的提交、归档哈希和版本在 `scripts/security-runtime/go-sources.json`;
构建镜像、参数和上游许可证保留在 `go-rebuild.Dockerfile` 的构建结果中。
`GOTOOLCHAIN=local` 防止模块声明把工具链降回旧版本。自编译包不冒充上游新发行版。
```powershell
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/`。
客户端包为本机未签名开发包,不能当作已签名正式安装程序分发。