78 lines
5.4 KiB
Markdown
78 lines
5.4 KiB
Markdown
# 运行时安全升级与回滚
|
||
|
||
## 范围
|
||
|
||
| 组件 | 本次目标 | 边界 |
|
||
| --- | --- | --- |
|
||
| 素材库 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/`。
|
||
客户端包为本机未签名开发包,不能当作已签名正式安装程序分发。
|