现代安全建立在一个很少被明确表述的悖论之上:你添加的每一层保护都将信任转移给一个你无法控制的行为者,而并未消除它。理解这种转移是对隐私进行任何诚实推理的前提。
无懈可击之链的神话
设计安全系统的工程师自然会分层思考:端到端加密、强认证、安全密钥存储、启动完整性。每一层都经过审计、文档化、论证。最终结果给人一种堡垒的印象。然而,正是这种印象才是危险的。
绝对隐私要求计算机领域从未实现过的一种属性:掌控从芯片到应用的整个处理链。实际上,这条链至少包含一个你无法控制微码的处理器、一个你无法在每次构建时验证其完整性的编译器,以及一个或多个固件为专有的硬件组件。真正的安全不是没有可信第三方,而是对你的威胁模型中这些第三方的性质和位置的理性选择。
以下三点以具体且可验证的方式说明了这种转移。
TPM 将你的秘密封存在一个你无法打开的盒子里
可信平台模块(TPM)已成为现代架构上安全密钥存储的基石。其原理是坚实的:一颗独立于主处理器的专用芯片,能够生成不可提取的密钥,并通过 PCR(平台配置寄存器)根据系统的测量状态来限制密钥的使用。Ubuntu Core 明确利用它在启动时将 LUKS2 密钥直接封存在 TPM 中——如果固件、引导加载程序和内核的指纹与记录状态匹配,密钥就会自动释放。否则,磁盘将保持加密,无法恢复。
这很优雅。但这也意味着将信任完全委托给了芯片制造商。
2017 年,在英飞凌(Infineon)的 TPM 中发现了一个名为 ROCA(Return of Coppersmith's Attack,CVE-2017-15361)的严重漏洞。固件中嵌入的 RSA 密钥生成库产生的密钥,其质因子遵循一个可约简的模式,将 RSA-2048 的因式分解复杂度降低到实际可攻击的水平。部署在笔记本电脑、智能卡和认证令牌中的数百万颗芯片都受到影响。漏洞存在于封闭的、不可审计的代码中,而该芯片是经过 Common Criteria EAL4+ 认证的。认证并未检测到这个问题。
修复需要固件更新,由笔记本电脑制造商分发,而非直接由英飞凌分发,不同 OEM 厂商的延迟各不相同。在这个窗口期内,任何依赖于这些 TPM 生成的 RSA 密钥不可提取性的系统,其安全保证都毫无价值。
这并不是否定 TPM 的论据。这是反对"TPM 消除了对第三方依赖"这一幻觉的论据。它将依赖集中化了。你用一个弥漫性的人类密码弱点,换来了对英飞凌、意法半导体(STMicroelectronics)、新唐(Nuvoton)或 AMD(取决于你的硬件)的精确依赖——这些都是受司法管辖、法律约束和商业需求制约的公司,你对此无法控制。AMD fTPM 和 Intel PTT 是直接集成在主处理器中的固件实现,使"专用隔离芯片"和"在主 CPU 上运行的代码"之间的界限变得模糊。
谷歌的 OpenTitan 项目是对这一问题的结构性回应:一个硬件设计和固件公开且可审计的信任根。目前已在部分新款 Chromebook 上可用。对于市场上的其他产品,情况并未发生根本改变。
端到端加密只加密应用选择不看到的内容
Signal 是消息端到端加密的参考实现。Signal 协议(Double Ratchet + X3DH)是公开的、经过审计的,并由独立密码学家进行了形式化验证。其密码学属性是真实的:前向安全性、认证、防止长期密钥泄露。
常见的混淆是将协议属性与应用属性混为一谈。
端到端加密保护的是消息内容在两个客户端之间传输时的安全。它并未说明客户端解密后对内容做了什么。在 Android 上,Signal 应用运行在一个进程中,如果操作系统被攻陷,该进程可能遭受内存提取攻击。Signal 在 Google Drive 上的加密备份使用从用户 PIN 码派生的密钥,存储在由 Signal 管理的 HSM 中——你信任 Signal 不会以可利用的方式访问该 HSM。元数据(谁联系了谁,频率如何)并未以与内容相同的方式加密,Signal 收集了最少量的元数据,但仍然有所收集。
一个更直接的例子:WhatsApp 使用 Signal 协议来加密消息。但联系人元数据和使用频率会反馈给 Meta。加密是真实的,但相对于 Meta 的隐私却不是。这不是技术漏洞——这是一个有意的设计选择,但它恰恰说明了这一点:密码协议和应用程序是两个不同的对象,具有不同的信任模型。
我们在引言中提到的基于 Tor 的 Bash 加密通信项目 TerminalPhone,将这一推理推向了逻辑终点:没有第三方服务器、没有账户、没有集中元数据,唯一的身份是 .onion 地址。信任模型被缩减到最小——Tor 项目、OpenSSL 和底层操作系统。这是自洽的。但这也表明,缩减信任面需要以大多数用户不愿接受的易用性妥协为代价。
你未审计的编译器编译了你审计过的代码
1984 年,Ken Thompson 发表了《Reflections on Trusting Trust》,这篇论文至今仍是计算机科学史上最令人不安的贡献之一。其论证是:可以向编译器中注入木马,使得即使源代码完全干净,生成的二进制文件也是被攻陷的。被修改的编译器在重新编译自身时会自我再注入。阅读源代码什么也揭示不了。只有对生成的二进制文件进行分析才能检测出异常。
这并非过时的学术练习。现代系统的构建链包括:一个你没有从原始源码亲自编译过每个版本的编译器(GCC、Clang/LLVM),其发行版二进制文件由第三方生成的系统库(glibc、OpenSSL),一个构建过程由发行版团队掌控的内核,以及源代码仅部分可用的 UEFI 固件(EDK2 是开源的,制造商闭源二进制 blob 则不是)。
2020 年的 SolarWinds 攻击在大规模上实现了这一威胁:SolarWinds Orion 的构建链被攻陷,生成了带有该公司合法证书签名但包含后门的二进制文件。数以千计的组织在验证签名(签名正确)后安装了这个软件。对源代码的审计什么也发现不了,因为修改发生在构建过程中。
对这个问题的技术回应被称为可重现构建(reproducible builds):一种确定性的编译过程,使得从相同的源码和相同的环境中,任何人都能获得逐位相同的二进制文件。Debian 自 2013 年起主导该项目。Bitcoin Core 已采用它。在整个生态系统中的覆盖率仍然有限。即使有了可重现构建,对引导编译器的信任仍然是必要的——Thompson 的信任信任问题并未消失,只是被推迟了一个层次。
这一分析对系统设计的启示
隐私不是一个二元属性。它是你的威胁模型、你可信第三方在链中的位置,以及这些第三方在你的操作环境中被攻陷或受胁迫的概率的函数。
设计一个真正敏感系统的工程师必须明确地绘制出他们的可信第三方:TPM 制造商、证书颁发机构、引导编译器、发行版供应商、云服务提供商(如适用)。对于每一个第三方,问题不是"他们可信吗?",而是"这个第三方被攻陷的代价是什么?我的威胁模型是否包含了有能力攻陷或胁迫他们的对手?"
对于标准威胁模型(防范机会主义攻击者、合规性要求、用户数据保护),TPM + LUKS2 + 已审计协议是一个合理且可辩护的选择。对于国家级或高价值威胁模型,上述列表中的每个第三方都是一个潜在的攻击向量,而相应的对策(OpenTitan、可重现构建、物理隔离、以手动输入密码代替 TPM 封存)都意味着重大的操作约束,很少有系统能完全承担。
绝对隐私不存在于一个你无法掌控从芯片到应用的整个链条的系统之外。这种掌控是一个地平线,而非在实际生产条件下可达到的状态。严谨在于确切地知道你将自己的可信第三方放在了哪里,为什么,以及如果其中一个被攻陷,你会失去什么。
技术参考:CVE-2017-15361(ROCA,英飞凌 TPM) — K. Thompson,《Reflections on Trusting Trust》,CACM 1984 — 可重现构建项目,reproducible-builds.org — 谷歌 OpenTitan,opentitan.org — NIST SP 800-155(BIOS 完整性测量) — SolarWinds 供应链攻击,CISA 公告 AA20-352A。
