电子邮件的加密漏洞:过时的加密标准是罪魁祸首

本文深入分析了efail漏洞的技术根源,指出OpenPGP和S/MIME标准因使用过时的非认证加密模式而存在安全隐患,并探讨了如何通过采用现代认证加密技术(如AEAD模式)来提升安全性。

efail:过时的加密标准是罪魁祸首

漏洞原理速览

efail攻击的核心在于:研究团队结合加密模式弱点与HTML邮件特性,成功诱导邮件客户端泄露加密邮件内容。虽然并非所有攻击场景都涉及加密环节,但关键攻击手段利用了加密模式的可塑性(malleability)特性——即在特定条件下可对加密内容进行可控修改。

加密可塑性并非新问题。早在90年代,人们就意识到这可能带来风险,并开始为加密添加认证机制。这样不仅能保证加密数据不被破解,还能确保攻击者无法篡改数据。早期协议采用多种认证方式(如MAC-then-Encrypt、Encrypt-then-MAC等),安全程度参差不齐。OpenPGP标准后来引入了MDC(修改检测码),而S/MIME始终缺乏类似机制。

认证加密的革命

2000年,Bellare和Namprempre正式提出认证加密(Authenticated Encryption)概念,主张将认证机制标准化地整合到加密过程中。这项创新重新定义了密码学API的设计范式——未经认证的加密解密函数只处理输入输出,而认证加密的解密函数只有"成功输出"或"验证失败"两种状态:

在这种方案中,发送方的加密过程接收密钥和明文生成密文;接收方的解密过程使用相同密钥处理密文后,要么返回明文,要么返回表示"密文无效"的特殊符号。(Bellare & Namprempre,Asiacrypt 2000)

该理论后来发展为支持附加数据的认证加密(AEAD),允许对未加密部分进行认证(例如验证消息分块的顺序)。如今已有多种标准化的AEAD模式。

为什么必须使用认证加密

认证加密应该成为密码系统设计的第一准则:“除非有充分理由,否则始终使用标准化的现成AEAD模式。“大量历史漏洞本可通过AEAD避免:

  • SSL/TLS中的填充预言攻击(如Vaudenay攻击、Lucky Thirteen攻击)
  • SSH中的明文泄露漏洞(2009年发现,2016年再现)
  • XML加密因字符编码错误导致的漏洞
  • 2016年发现的iMessage漏洞
  • Owncloud加密模块漏洞

令人费解的是,如此基本的安全准则仍未成为密码学入门必修内容。

滞后的密码学教育

某次密码学邮件列表讨论中,有人推荐某大学的密码学入门课程材料。我浏览后发现其教授的加密模式竟全是ECB、CBC、OFC、CFB和CTR——这些未经认证的过时模式根本不该出现在现代系统中。更惊人的是,在与一位密码学教授交流时,他确认其课程仍教授这五种模式。进一步调查显示,这种教学内容居然相当普遍。

追溯根源,这五种模式正是Bruce Schneier 1996年著作《应用密码学》的目录。虽然该书在当年堪称经典,但如今仍以此作为教学大纲显然不合时宜。更令人担忧的是,2017年某篇经过同行评审的论文竟将CBC、CTR和CFB标注为"安全模式”——这直接解释了为何2018年我们仍需应对填充预言和密文可塑性攻击。

AEAD模式选型建议

选择AEAD模式需考虑多重因素(篇幅所限仅概述要点):

  • GCM模式:与AES搭配最常见,但实现难度大,Nonce生成失误会导致灾难性后果
  • Poly1305:常与Chacha20配合,也可用于AES
  • OCB模式:性能优异但受专利限制
  • AES-SIV:牺牲性能换取Nonce容错能力
  • CAESAR竞赛:正在遴选新一代AEAD算法

关键结论是:采用任何标准AEAD模式都好过完全不使用认证加密。

S/MIME:积重难返

S/MIME默认使用未经认证的CBC模式,其可塑性允许攻击者通过比特翻转操纵密文(代价是破坏后续区块)。结合S/MIME密文部分内容可预测的特性,攻击者可构造任意邮件(用HTML隐藏垃圾区块),这正是efail攻击的核心原理。虽然存在支持认证加密的CMS格式RFC,但最新S/MIME标准未引用该规范。更严重的是,除HTML邮件外,恶意PDF等文档格式同样可能成为渗漏通道。S/MIME缺乏认证机制的设计缺陷使其本质上不安全。

讽刺的是,过去两种邮件加密标准并存的局面反而成为转机——S/MIME用户最好转向OpenPGP。

OpenPGP:CFB模式与MDC的困境

OpenPGP采用更复杂的认证方案MDC(消息检测码),其通过SHA-1哈希验证明文完整性。虽然CFB/MDC不属于标准AEAD模式,但尚无明显安全弱点(尽管SHA-1已被证实可碰撞,但对MDC场景影响有限)。真正的风险来自标准规范的两大缺陷:

  1. MDC验证规范模糊:标准要求"必须将MDC失效视为安全问题”,但未明确处置方式。显示警告仍输出明文的设计正是efail的温床。正确的AEAD实现应该"全有或全无"。
  2. 向后兼容陷阱:OpenPGP保留两种数据包类型(SE和SEIP),攻击者可移除MDC保护(2015年已发现相关攻击)。若采用不同密钥派生函数本可避免,但现状导致任何支持SE数据包的实现都存在可塑性漏洞。

好消息是:OpenPGP可通过以下改进获得安全:

  • 强制丢弃MDC验证失败的消息
  • 彻底废弃SE数据包支持 (HTML邮件和多部分消息问题仍需单独解决)

流处理与分块机制

GnuPG先输出明文再报错的设计违反AEAD原则,也是邮件客户端易受efail攻击的主因。这种API设计源于大文件流处理需求——理想的AEAD实现需要缓冲所有解密数据直至完成验证,这对备份文件等大体积数据不现实。TLS采用的分块机制值得借鉴:将数据分为若干千字节级别的块(防止重放攻击),最终块包含特殊标识(检测截断攻击)。解密工具按块验证后输出,既保证流处理效率又满足安全性。

OpenPGP新标准展望

新版OpenPGP标准草案已引入OCB和EAX两种AEAD模式(专利问题折中方案),并支持消息分块。但当前草案存在重大缺陷:

  • 未规定分块大小上限(单块GB级数据仍会导致不安全流API)
  • 工作组因缺乏关注于去年解散

结论与启示

正确使用认证加密可预防大量安全问题。虽然OpenPGP的问题亟待解决,但通过较小改进仍可安全使用,而S/MIME恐怕已无药可救。efail事件给所有密码协议敲响警钟:立即停止使用未经认证的加密模式。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计