Skip to content

本地格式化与密码学擦除设计

1. 定义与边界

“本地格式化”是:在用户预先启用并精确输入假密码后,优先删除解封真实 Profile 所需的关键密钥材料,再清理 App 沙箱内可控数据。

它不等于:

  • 对 iPhone NAND 做物理覆写;
  • 删除 Files、iCloud Drive、AirDrop 或其他设备上的外部 .vmaxbak
  • 立即删除接收方设备内容或服务器 TTL 内密文;
  • 抵抗已完全控制操作系统或在触发前已复制明文/密钥的攻击者。

产品文案只能使用“本地格式化/密码学擦除”,不得使用“物理擦除”“无法恢复全部痕迹”等承诺。

2. 来源分类

v1.1 MUST

  • 默认关闭;启用前重新验证主密码、展示不可逆影响并二次确认。
  • 只有精确假密码验证成功触发;普通错误、空输入、Face ID 失败、取消、退后台或系统终止均不得触发。
  • 先销毁数据库主密钥、身份/设备私钥封装和会话关键材料,再清数据库、WAL/SHM、附件、缓存、临时文件、诊断日志和通知。
  • 本地格式化不得等待网络成功;完成后保持在空白 Decoy/首次启动状态。
  • 任一步骤被终止后,重新启动必须安全收敛,不能出现一半明文/一半可恢复状态。

当前已验证事实

  • 当前没有实现;尚未验证 Keychain、Secure Enclave、文件保护、通知中心或系统备份的删除行为。
  • iOS 闪存和磨损均衡使 App 无法证明物理扇区覆写,这是明确的不保证项。

3. 前置条件

同时满足以下条件才可开始:

  1. 用户已在 Real 解锁状态主动打开开关;
  2. 本次设置重新验证主密码;
  3. 用户查看不可逆影响和外部备份边界;
  4. 用户进行第二次明确确认;
  5. 假密码已配置且与主密码不同;
  6. 当前解锁提交由 AppUnlock 返回不可伪造枚举 decoyAuthenticatedAndEraseEnabled

任一配置损坏、版本未知或状态不完整都应禁用触发并保持锁定,不能“按更安全处理”而自动删除。

4. 崩溃安全状态机候选

text
Idle
  -> ArmedIntentPersisted
  -> RealAccessQuiesced
  -> CriticalUnwrapMaterialDeleted
  -> CriticalDeletionVerified
  -> SandboxCleanupPending
  -> DecoyReady

4.1 中性意图记录

在删除前写入经过完整性保护、语义中性的本地维护记录,至少包含操作版本、目标 Profile 内部随机标识、阶段和重试计数。只有假密码验证成功后的受控路径能创建。

  • 写入失败:中止,不删除任何关键密钥,保持 Locked。
  • 记录存在:下次启动在初始化任何 Real 组件前恢复协调器。
  • 记录损坏或未知版本:保持 Locked,进入本地恢复/支持路径;不得猜测并删除。

记录可能被取证识别,不能宣称其实现可否认性。若审计认为记录本身风险不可接受,需选择等价的事务机制并证明崩溃安全。

4.2 关闭 Real 访问

  • 阻止新的 Real 解锁、数据库和网络任务。
  • 取消 WebSocket、后台刷新、通知摘要处理和附件任务。
  • 释放 Real 依赖容器;对可控秘密缓冲做尽力清理。

此步骤不算格式化成功,也不依赖向服务器发请求。

4.3 删除关键解封材料

按最终密钥层级删除:

  • Profile Data Master Key 的所有有效封装/Keychain 项;
  • 身份和设备私钥的独立封装材料;
  • 仍可恢复会话根/链状态的关键材料;
  • 可能绕过上述层级的恢复令牌或备用封装。

删除操作必须幂等。不存在视为已删除;权限/系统错误视为未完成并重试。

4.4 验证不可解封

  • 重新枚举所有版本和历史命名空间,不只检查当前键名。
  • 尝试按正常路径解封,必须失败为“材料不存在/已失效”,而非暂时系统错误。
  • 只有验证完成,才把状态推进为 CriticalDeletionVerified

若验证失败,保持 Real 不可加载的锁定/中性界面,并继续受控重试;不得显示“已完成”。

4.5 清理沙箱数据

清理集合至少包括:

  • 主数据库、WAL、SHM、迁移副本、备份副本;
  • 附件、缩略图、头像、草稿、导入暂存、下载和临时文件;
  • URLCache、WebKit/系统缓存中由 App 可控的相关项;
  • 本地诊断日志、崩溃前暂存、搜索索引和分享扩展容器;
  • 当前可见通知、待处理本地通知和 badge;
  • Real Push 路由的本地映射(服务端撤销仅作后续最佳努力)。

文件清理失败不恢复 Real 密钥。记录保留 SandboxCleanupPending 并在后续启动重试。

4.6 进入 Decoy

仅使用独立 Decoy 容器;不得因清理需要打开 Real 数据库。UI 展示自然空白/首次启动状态,不出现格式化进度、成功、假密码或真实 Profile 提示。

5. 待总控决策 01 崩溃恢复机制

选项优点风险验证
中性阶段记录 + 幂等恢复可逐步测试和重试;可证明安全收敛记录可能暴露维护/擦除痕迹每阶段 kill、记录损坏、重放测试
单一 Keychain 原子代际切换可减少显式阶段文件Keychain 多项删除并非跨项事务;文件清理仍异步真机故障注入、历史命名空间枚举
无记录尽力删除实现简单崩溃后无法证明状态,可能重新加载残留 Real不推荐

推荐:中性阶段记录 + 幂等恢复;记录的可区分性作为明确剩余风险。最终格式和存储位置由 iOS 安全评审冻结。

6. 网络与服务端边界

  • 本地关键密钥删除不等待注销、撤销、Push route 删除或服务器响应。
  • 本地完成后,可排队发送设备撤销/路由删除的最佳努力请求;请求失败不能恢复或阻塞本地结果。
  • 服务端仍按 TTL、ACK 和数据保留策略处理密文;不能将本地格式化描述为“远程删除消息”。
  • 具体接口由服务端/Push 任务设计,只需支持幂等、最小信息和不泄露伪装事件语义。

7. 误触防线

  • 删除 API 不对 UI 或通用错误处理公开,只对受控协调器开放。
  • 协调器输入为强类型授权,不接收密码字符串、槽位数字或多个可被误组装的布尔值。
  • Face ID、主密码成功、错误密码、迁移失败、数据库损坏、连续失败次数和远程命令都没有通往格式化的边。
  • 开关配置采用明确版本和校验;未知/损坏值解释为“关闭”,同时提示用户在 Real 设置中修复。
  • 自动化测试对所有非触发事件断言:关键 Keychain 项、数据库哈希和身份公钥均未变化。

8. 验证计划

正常与边界

  • 格式化关闭/开启;主密码/假密码;最长/最短允许口令;两个以上 Profile。
  • Real 数据库为空、超大、WAL 有未检查点事务、附件清理中、通知堆积。

故障注入

  • 在每个状态转移前后强制 kill;设备重启;磁盘满;Keychain 暂时不可用;文件权限错误;通知清除失败。
  • 对每个历史密钥命名空间、数据库副本和共享容器注入残留。
  • 网络完全离线、服务端 5xx、Push Gateway 不可用。

断言

  • 非精确假密码路径的关键数据和密钥变化为零。
  • 一旦 CriticalDeletionVerified,正常/恢复/旧版本路径均不能解封旧 Real 数据。
  • 重启只会继续向 DecoyReady 收敛,不会加载 Real。
  • 沙箱、Keychain、WAL/SHM、缓存、临时目录、通知和扩展容器残留扫描通过。
  • 外部备份仍存在时,UI/发布说明准确说明其不在范围内。

9. 发布门槛与审计问题

  • 双密码、伪装和格式化独立安全评审完成;误格式化为 0。
  • 真机故障注入覆盖所有状态边,不只使用模拟文件系统。
  • 审计 Keychain/Secure Enclave 删除语义、系统备份、App Group、扩展和升级遗留命名空间。
  • 确认中性状态记录不会被普通日志、分析或诊断导出暴露。
  • 产品、隐私和支持文案不承诺物理擦除,不声称删除外部备份或远端副本。

系统初步设计 · 待决事项不代表批准 · 安全方案尚未完成独立审计