# Novara 安全说明

English · 简体中文

> 另见:[威胁模型](docs/threat-model.zh-CN.md)——保护资产、攻击者、安全假设、非目标与缓解措施全量版。 · [安全架构](docs/security-architecture.zh-CN.md)——四条信任链(静态数据 / Agent 访问 / 快照 / 同步)一图速览,以及如何校验你的下载。 · [Security Architecture (English)](docs/security-architecture.md) · [Threat Model (English)](docs/threat-model.md) --- > 本文档有两个用途:(1) 告诉安全研究人员**如何私下报告漏洞**;(2) 向用户说明 **Novara 如何保护你的数据、以及不保护什么**。 > > **生效日期:** 2026-08-14 · **最近更新:** 2026-10-28 · **适用范围:** Novara novara12 / 12.0(标注处亦覆盖更早版本) --- ## 1. 受支持的版本 以下版本提供安全修复。我们强烈建议始终运行最新版本。 | 版本 | 状态 | 说明 | |------|------|------| | novara12 (12.0) | ✅ 支持 | 当前版本——交互层重构:卡片折叠与跟随记忆、路径属性、卡上 API 检测、待办进度;无安全模型变更 | | novara11.R1 (11.1) | ✅ 支持 | 上一版本——HTML 编辑器图片插入、图片选中态与工具栏焦点修复 | | novara11 (11.0) | ✅ 支持 | 上一版本——桌面端迁移 .NET 10、主库 v5 容器(Argon2id)、同步分区增量上传、更新清单签名与可选自动检查;全代码库检修 | | 10.3 | ✅ 支持 | 保存对话框恢复按所选类型补全扩展名(10.1–10.2 回归) | | 10.2 | ✅ 支持 | Markdown 分屏体验重排与编辑器反馈修复 | | 10.1 | ✅ 支持 | 选择器修复、有语义的操作提示、无密钥签名随版生效 | | 10.0 | ✅ 支持 | 信任版本:签名校验、可复现构建、公开威胁模型,以及 CI 中的依赖、许可证与覆盖率门禁 | | 9.4 | ✅ 支持 | 派生密钥缓存与 UI 线程卸载(性能),外加横跨桌面与自托管服务端的整轮加固 | | 9.3 | ✅ 支持 | 9.2 之上的热修复线 | | 9.2 | ✅ 支持 | 9.1 之上的热修复线 | | 9.1 | ✅ 支持 | 9.0 之上的热修复线 | | 9.0 | ✅ 支持 | 首个「一条命令自托管」版本(官方 Docker 镜像 + compose) | | 8.0 | ✅ 支持 | 首个跨设备同步版本——经由你自托管的服务器 | | 7.0 | ✅ 支持 | 互联时代首个版本(加密快照) | | 6.2 | ✅ 支持 | 在可行范围内提供关键修复 | | 6.0 | ✅ 支持 | 在可行范围内提供关键修复 | | 5.x | ✅ 支持 | 在可行范围内提供关键修复 | | 4.0 | ✅ 支持 | 在可行范围内提供关键修复 | | 3.0 | ⚠️ 旧版 | 在可行范围内提供关键修复 | | 2.0 | ⚠️ 旧版 | 使用较旧的 AES-CBC 加密;**建议升级**(见第 7 节) | | < 2.0 | ❌ 不支持 | | ## 2. 报告漏洞 我们认真对待安全报告,且绝不惩罚善意的安全研究。 **请先私下报告**——不要在公开 Issue 中贴出漏洞细节。 - **首选:** GitHub → **Security** 标签 → **Report a vulnerability**(私密漏洞上报)。 - **备选:** 发送邮件至 **owner@novara.xin**,标题以 `[Security] ...` 开头。 请尽量包含: 1. 受影响的版本; 2. 对问题及其潜在影响的清晰描述; 3. 复现步骤(或概念验证),如有; 4. 建议的修复方案(可选)。 **你可以期待:** - 我们力争在 **5 个工作日内**确认收到你的报告。 - 我们会持续告知你评估与修复进展。 - **高危漏洞在修复发布前不会公开披露。** 低危问题将与你协商处理。 - 致谢:我们乐于在发布说明中致谢报告者,除非你要求匿名。 --- ## 3. 安全模型与威胁模型 **我们保护什么。** Novara 是一个 *本地优先的个人数据控制层*——为你,也为你的 AI。其安全目标是保护**静止数据**(磁盘上的单文件数据库),并自 7.0 起保护你选择带它去的一切地方——快照,以及自 8.0 起的设备间同步——使其免于: - 在应用锁定或关闭时被随意或未经授权地读取(通过可选加密); - 加密文件被静默篡改(通过 AES-GCM 认证); - 意外数据丢失(通过原子写入、回收站与本地备份); - 锁屏密码被暴力猜解(通过锁定机制与单调时钟)。 **我们不保护什么(诚实的边界)。** 本地应用无法抵御一切。Novara **不**抵御: - **已解锁的会话**——应用解锁运行期间,能操作你电脑的人能看到你所看到的内容。 - **你电脑上的恶意软件**——键盘记录、屏幕录制、远程木马,或已被攻陷的 Windows 账户,无论 Novara 是否加密,都可能窥探或窃取数据。 - **物理接触**——能物理接触你已解锁设备、或能重置 Windows 密码的人,可能触及你的文件。 - **丢失/遗忘密码**——设计上无恢复机制。没有后门的加密,同时意味着没有密码重置。 - **内存提取**——应用解锁期间加密密钥驻留内存;具备相应工具的高水平本地攻击者可能将其提取。 > **结论:** Novara 的加密保护的是**磁盘上的静止数据**。它不能替代一台健康、无恶意软件、物理环境安全的电脑。 > **完整模型。** 本节是摘要。保护资产、攻击者类别、我们依赖但不掌控的安全假设、我们刻意不保护的部分,以及每条边界背后的缓解措施,全部写在**[威胁模型](docs/threat-model.zh-CN.md)**里。 ## 4. 加密体系 开启隐私锁后,Novara 对整个数据库加密: | 项目 | 详情 | |------|------| | 加密算法 | AES-256-GCM(认证加密),256 位密钥 | | 密钥派生 | PBKDF2-SHA256,格式 v3(5.3+)起为 **3,000,000 次迭代**(参考机解锁约 340 ms),每用户随机 32 字节盐;v2 库(100,000 次)经一次性选择权弹窗迁移 | | 密码 | 6–64 位字符;本地仅存版本化、加盐的密码哈希——哈希格式第二版起为 PBKDF2-SHA256(3,000,000 次迭代),绝不存明文 | | 认证 | 12 字节随机 nonce + 16 字节 GCM tag——任何篡改都会被检出 | | 数据流 | JSON → GZip 压缩 → AES 加密 → 落盘文件 | | 文件格式 | 版本化头(`NOVA` 魔数 + 版本 + 加密标记 + 16 字节完整性字段)+ 加密体 | | 迁移 | 旧版 v1(AES-CBC,Novara 2.0)经一次用户确认后自动迁移到 v2(GCM);v2 经一次性选择权弹窗迁移到 v3(强化 KDF) | **重要:** 加密**默认关闭**。未开启隐私锁时,数据库是明文 JSON 文件(仅受 Windows 账户权限保护)。这是刻意的设计选择,避免普通用户被自己的数据锁在门外。 ### 快照导出(7.0+) 互联时代为「数据离开你的电脑」增加了一条新路——同一根标尺同样适用:**要么加密后离开,要么不离开。** - **同一容器,同一契约** —— 快照把数据库以 `.novaenc` v4 密文块内嵌(44 字节自描述头作为 AES-GCM 附加数据、PBKDF2-SHA256 3,000,000 次迭代、gzip 压缩载荷),与加密备份完全同一份版本化契约。 - **强制密码门槛** —— 每次导出快照都必须输入密码:你的隐私锁密码,或为本次导出单独设置的独立密码。明文库走完全相同的导出弹窗——导出物恒为加密的 v4 容器,因此无论哪种情况都不存在明文导出路径。 - **凭证绝不随行** —— 快照封口前,设置中的 MCP 令牌与客户端授权数据一律剥离。 - **构造上零联网** —— 导出的查看器文件不发起任何网络请求:无 CDN、无外部字体、无遥测。解密在你的浏览器里经 WebCrypto 完成;文件不会「回拨任何总部」,因为它没有总部。 - **密码是唯一的钥匙** —— 快照密码不被 Novara 存储在任何地方,也无法找回。公开托管快照的安全性完全取决于密码强度;应用与部署指南都会把这一点说透。 ### 同步(8.0+) 8.0 让你的多台设备经由一台由你自己运行的服务器保持同步——而那台服务器是**密文仓库,不是能读懂你的服务**。同一根标尺照旧适用:不加密就不离开,且服务器不持有任何密钥。 - **服务器零明文** —— 它每次变更只保存一份带版本号的密文块,外加一个小小的明文信封(容器/加密/同步三个版本号、本次载荷基于的版本号、设备 id 与时间戳)。它不持有空间密钥、没有用户体系、不做任何解密、也不写明文日志。 - **密钥分离** —— 空间密钥在第一台设备上生成,永远不离开设备。配对使用服务器只打印一次的空间 id 与注册密钥;之后每台设备各自持有自己的 token。因此撤销一台丢失的手机不损失任何东西:它能下载到的密文,缺少一把它从未拥有过的钥匙。 - **同一容器,同一契约** —— 每份载荷都是 `.novaenc` v4 容器(44 字节自描述头作为 AES-GCM 附加数据、PBKDF2-SHA256 3,000,000 次迭代、gzip 压缩载荷)。开启同步以隐私锁为前提;明文库拒绝开启。 - **传输** —— 协议以 HTTPS 为前提。浏览器侧需要安全上下文,故部署指南推荐一层带自动证书的 TLS 反代(或私有网络链路),随包自带的服务端默认只监听回环地址。 - **token 处理** —— 服务端只保存每台设备 token 的 SHA-256,常量时间比较,并对反复失败做限速。 - **完整性与版本纪律** —— 每次上传都声明它基于哪一版;对不上时报冲突而不是静默覆盖,被覆盖的那一版仍保留在服务器上,坏的一次推送可以回滚。 - **本地审计** —— 每次上传、下载、冲突检出与冲突解决都写入本地审计日志;设备中心显示每台已配对设备的信任状态与最后同步时间。 ## 5. 数据完整性与可靠性 Novara 内置多层机制防止数据丢失与损坏: - **原子写入**——每次保存先写临时文件、刷盘(`Flush(true)`)、再原子替换原文件。写入中途崩溃不会损坏数据库。 - **单写者纪律**——去抖/串行化的保存队列 + 单实例互斥,防止并发写入互相覆盖。 - **独占文件锁 + Hidden/ReadOnly 属性**——降低第三方软件误改数据库的概率。 - **回收站(软删除)**——删除的卡片 7 天内可恢复,超期后下次启动永久清理。 - **本地滚动备份**——内置备份保留最多 10 份可恢复的本地快照(4.0+)。 - **崩溃日志(本地、脱敏)**——崩溃详情本地落盘(4.0+)供日后排查;敏感值(如 API Key)已脱敏,且绝不自动上传。 - **完整性校验**——明文导出带 SHA-256 头(双头探测兼容旧 MD5 头文件);加密备份由 GCM 认证;导入经校验、归一化,失败即回滚。 ## 6. 防暴力破解与锁定 - **连续 5 次输错密码**后,锁定 30 分钟。 - 失败次数与锁定截止时间跨重启持久化(`lockout.dat`),重启程序不会重置锁定。 - 自 4.0 起,锁定使用**单调时钟**(`Environment.TickCount64`),防止通过回拨系统时间绕过。 - 锁屏在窗口失焦时清空输入框,降低旁人窥视风险。 ## 7. 版本兼容与降级警告 | 场景 | 行为 | |------|------| | 在 3.0 及以后版本中打开 2.0 数据 | ✅ 可读,并在一次确认后从 AES-CBC(v1)迁移到 AES-GCM(v2) | | 在 5.3 及以后版本中打开 v2 数据 | ✅ 原样可读;经一次性选择权弹窗迁移到 v3(3,000,000 次迭代 KDF) | | 在 5.2.0 及更早版本中打开 v3 数据 | ❌ **无法读取**——旧版本不识别 v3 的 KDF 参数 | | 在 2.0 中打开 v2/v3 数据 | ❌ **无法读取**——2.0 不识别 GCM 格式 | > ⚠️ **降级或回滚到 2.0 之前**,请先导出一份明文备份。数据库一旦迁移到 GCM(v2)或 v3,旧版本将无法打开。v3 迁移弹窗在你确认前即明示此降级限制。 ## 8. 应用加固 - **日记编辑器 XSS 防护**——富文本 HTML 在加载、保存与导航后均经过严格标签/属性/URL 白名单净化,使用真实 HTML 解析器(AngleSharp)。脚本标签、`on*` 事件属性(含 `onload` 之类的实体编码变体)、危险协议(`javascript:`、`vbscript:`、非图片 `data:`)均被剥离。标题以纯文本渲染。 - **不执行不可信输入**——导入的 HTML 与 JSON 只解析与归一化,绝不执行。 - **仅本地的辅助进程**——桌面便签辅助进程通过本机文件与命名事件与主程序通信,不产生任何网络请求,也不开放任何监听端口。 - **最小攻击面**——Novara 桌面应用不监听网络端口、不向网络暴露任何远程调用接口。出站流量只发生在你触发的路径上:API Key 检测、发往你已配对自托管服务器的跨设备同步(8.0+),以及应用内检查更新(9.0+,仅连静态发布清单)——每一次都会出现在网络活动流水里(见隐私政策)。可选 MCP 服务器只是本地命名管道端点,仅可被同一台机器访问。单独安装的同步服务端(`NovaraSync`)会监听连接——它是你自行选择运行的组件,只经手密文,且不属于桌面应用的一部分。导出的 Snapshot 查看器文件不发起任何网络请求。 ## 9. 开发者承诺 作为项目所有者,我承诺: 1. **绝不**运营收集用户数据的云服务器。互联阶段项目交付的任何服务端组件都由**你**自托管,且在构造上只经手密文——明文永远不会到达它。 2. **绝不**加入后门、密码找回绕过机制,或任何远程解锁/窃取数据的途径。 3. **绝不**加入遥测、分析或广告。 4. **绝不**在未经用户显式操作的情况下自动更新或自动上传数据。 5. **透明披露**安全问题:先修复、后发布,并致谢报告者。 ## 10. MCP 接口安全模型 可选 MCP 接口让 AI 助手读写卡片。其安全模型采用纵深防御: - **默认关闭**——接口默认禁用,需你在设置页开启并复制令牌。 - **令牌鉴权**——每用户令牌,固定时间比较(`CryptographicOperations.FixedTimeEquals`),通过 `NOVARA_MCP_TOKEN` 或 `--token` 传入。 - **数据库解锁门控**——锁着或加密的数据库会拒绝一切请求;助手绝不能在未解锁时读取加密数据。 - **逐客户端授权**——任何客户端进程首次连接都需显式授权,本地持久化。 - **逐客户端权限矩阵**——每个已授权客户端持有独立的 20 位权限矩阵(读 / 建 / 改 / 删 × 五类数据)。新客户端**除备忘外默认只读**;混合(全类型)列举绝不会泄露无权分区的内容。 - **删除总闸**——删除需要客户端自身的删除权限位与全局总闸同时放行,二者取与,单独翻动其一都无法开启删除。 - **审计日志**——每次调用(含被拒绝的尝试)都落本地日志,记录进程、时间、工具、对象与结果;字段限长,凭据形态的值一律掩码。 - **敏感字段脱敏**——密码/密钥/token 字段返回为 `****`,不参与搜索,并防止改名绕过脱敏。 - **架构**——`NovaraMCP.exe` 是零逻辑的 stdio 前端;所有数据访问都发生在运行中的 Novara 主进程(唯一数据权威)内,助手绝不直接接触文件。畸形的客户端输入会得到规范错误应答,而不是让连接悬死。 核心原则——Novara 自身绝不传输你的数据——保持不变。接入云端 AI 客户端时的数据边界,见隐私政策。 ## 11. 未来变更 安全加固会跨版本持续推进。仅 6.0 一轮就收紧了 MCP 输入处理、导出/导入往返与备份路径校验;后续更新会继续收敛攻击面。每版更新日志都会列出安全相关变更。 ## 12. 联系方式 - **邮箱:** owner@novara.xin - **GitHub:** https://github.com/Novara-owner/Novara-Vault