Mbed TLS 安全模型详解:威胁模型、漏洞报告流程与分支维护策略
【免费下载链接】mbedtlsAn open source, portable, easy to use, readable and flexible TLS library, and reference implementation of the PSA Cryptography API. Releases are on a varying cadence, typically around 3 - 6 months between releases.项目地址: https://gitcode.com/GitHub_Trending/mb/mbedtls
Mbed TLS 作为广泛使用的开源 TLS 库,其安全性承诺的边界比"支持哪些算法"更关键:它防哪些攻击、不防哪些攻击、漏洞该报给谁、哪些分支会收到安全修复。本文以仓库根目录的 SECURITY.md 为主体,结合 BRANCHES.md 的分支维护策略与源码中的常量时间(constant-time)实现证据,完整解析 Mbed TLS 的威胁模型(threat model)、漏洞报告通道和 X.509 解析的安全边界。读完后,你能够为自己的项目准确划定 Mbed TLS 的安全保证范围,并知道如何正确地上报漏洞与选择受支持的版本分支。
一、漏洞如何报告:安全团队的报告通道与事件处理目标
根据 SECURITY.md 的"Reporting Vulnerabilities"一节,如果你认为发现了一个 Mbed TLS 安全漏洞,应通过电子邮件将其发送至安全团队:
mbed-tls-security@lists.trustedfirmware.org安全事件的处理流程(Security Incident Handling Process)则详细说明在项目在线文档的 vulnerability 处理页面中。该流程的首要目标是确保当问题公开时,修复方案已经准备好可以部署(fixes ready to be deployed when the issue goes public)——这也是 Mbed TLS 安全响应的基本方针:公开披露前修复必须就绪,而不是先公开再修。
这一承诺在仓库中是有迹可循的。例如 ChangeLog.d/serialized-data-load-hardening.txt 记录的是一类典型的"内存越界读取"型缺陷修复:
Reject serialized TLS 1.2 sessions whose session ID length exceeds 32, instead of accepting an out-of-range length that is later used to read past the end of the 32-byte session ID buffer.
这类改动会进入ChangeLog.d/待发布变更说明并在修复就绪后随版本一起公开,与"修复先于公开"的事件处理目标一致。
二、哪些分支会收到安全修复:只有维护中的分支
SECURITY.md 明确指出:只有维护中的分支(maintained branches)才会获得安全修复,并强烈建议用户始终使用维护分支的最新版本。维护分支的完整清单定义在 BRANCHES.md 中,当前仓库(4.2.0 版本线,见 build_info.h 中的MBEDTLS_VERSION_STRING "4.2.0")对应以下分支格局:
| 分支 | 性质 | 修复策略 |
|---|---|---|
main | 始终包含最新 release 及所有已公开的安全修复 | 功能 + Bug 修复 + 安全修复 |
development | 准备下一个 4.x 小版本 | 新功能 + Bug 修复 + 安全修复 |
mbedtls-3.6 | LTS 长期支持分支(2024 年 3 月发布) | 仅 Bug 修复 + 安全修复,支持到 2027 年 3 月 |
mbedtls-4.1 | 首个 4.x LTS(2026 年 3 月发布) | 仅 Bug 修复 + 安全修复,支持到 2029 年 3 月 |
需要注意的边界(同样来自 BRANCHES.md):
- 归档分支不再获得任何更新:以
archive/为前缀的历史分支(如archive/mbedtls-2.7)将不会收到任何变更,自然也收不到安全修复。如果你的系统仍在跑这类老版本,升级本身就是最大的安全动作。 - LTS 分支的额外约束:LTS 分支除修复外还会尽量维持 ABI 兼容,避免代码体积/RAM 占用增长;但若与修复安全问题冲突,安全优先——且会提供兼容选项。
因此,"是否还会收到安全修复"这个问题可以用一条简单的判断规则回答:分支名不带archive/前缀、且在 BRANCHES.md 的维护清单里,才会收到安全修复。
三、与 TF-PSA-Crypto 的关系:密码学操作的威胁模型边界
SECURITY.md 的"Use of TF-PSA-Crypto"一节强调:Mbed TLS 使用 TF-PSA-Crypto 提供的密码学 API,TF-PSA-Crypto 的威胁模型适用于 Mbed TLS 执行的所有密码学操作。特别地,文档提醒 Mbed TLS 用户注意其中关于分组密码(block ciphers)的考量——因为分组密码正是 TLS 中使用的类型,那部分的威胁模型约束直接作用于 TLS 的密码处理。
这一结构在仓库中可以直接印证。docs/4.0-migration-guide.md 说明了 4.0 的重大变化:"Mbed TLS has been split between two products: TF-PSA-Crypto for cryptography, and Mbed TLS for X.509 and (D)TLS",即 Mbed TLS 被拆分为 TF-PSA-Crypto(密码学)与 Mbed TLS(X.509 和 (D)TLS)两个产品,Mbed TLS 以子模块方式消费 TF-PSA-Crypto。仓库根目录下的tf-psa-crypto/目录正是该子模块的挂载点。
对使用者的实际含义是:评估 Mbed TLS 的密码学安全性时,不能只看本仓库的 SECURITY.md,还必须把 TF-PSA-Crypto 的威胁模型一并纳入,尤其是其中对分组密码实现(如常量时间性、故障注入防护)的说明。
四、威胁模型:按攻击者能力分级
SECURITY.md 的"Threat model"部分按攻击者能力将攻击分为三类:远程攻击、本地攻击、物理攻击。下面逐类展开 Mbed TLS 对每一类的承诺。
4.1 远程攻击:目标是完全防护
攻击者定义:能够观察并修改网络上发送的数据,包括观察单个数据包的内容与时间、抑制或延迟合法消息、注入消息。
Mbed TLS 的立场:
- 目标是完全防护远程攻击,并让用户应用能够提供完整的远程攻击防护;
- 但安全保证以所实现协议自身提供的安全保证为上限。文档举了一个典型例子:Mbed TLS 单独无法保证消息不延迟送达,因为 TLS 协议本身也不保证这一点。
换言之,Mbed TLS 在远程攻击这一层是"全力防护 + 协议能力为天花板"。
4.2 本地攻击:防护有限且不承诺
本地攻击者定义:能在同一台机器上运行软件,但权限不足以直接访问 Mbed TLS 的内存和文件等资产。此类攻击进一步细分为三种。
4.2.1 时序攻击(Timing attacks)
攻击者利用共享硬件(Mbed TLS 与攻击者都可访问的 CPU 资源)观察 Mbed TLS 执行的指令时序,典型攻击向量包括缓存时序、内存总线争用、分支预测。
Mbed TLS 在此处只做有限防护(limited protection),原因和目标在文档中说得非常直白:
- 防护成本随测量粒度与噪声水平差异很大,因此防护只能有限;
- 目标是仅防护公开记录在案的已公开攻击技术(publicly documented attack techniques);
- "攻击在进步,防护也在进步。Mbed TLS 正朝着完全时序无关(fully timing-invariant)代码的模型演进,但尚未达到"。
这一承诺在源码中可以得到印证:Mbed TLS 在敏感比较处显式使用常量时间函数。以 TLS 1.2 重协商时的 verify-data 校验为例,ssl_tls12_client.c 中:
/* Check verify-data in constant-time. The length OTOH is no secret */ if (len != 1 + ssl->verify_data_len * 2 || buf[0] != ssl->verify_data_len * 2 || mbedtls_ct_memcmp(buf + 1, ssl->own_verify_data, ssl->verify_data_len) != 0 || mbedtls_ct_memcmp(buf + 1 + ssl->verify_data_len, ssl->peer_verify_data, ssl->verify_data_len) != 0) {这里对敏感的 verify-data 使用mbedtls_ct_memcmp(常量时间内存比较)而非普通memcmp,同时代码注释明确"长度本身不是秘密"——这正是"针对已公开时序攻击技术做定点防护"这一策略的微观体现。服务端 ssl_tls12_server.c 中有完全对应的实现。此外,tests/suites/下存在 test_suite_constant_time_hmac.function 等测试套件,用于对常量时间行为进行回归验证。
文档中还特别指出:时序信息也可能通过网络或物理旁路观察到——远程时序攻击归入远程攻击一节讨论,物理时序攻击归入物理攻击一节讨论。
4.2.2 本地非时序旁路(Local non-timing side channels)
攻击者代码可以通过平台上某种传感器拾取 Mbed TLS 运行时的硬件物理状态信息。文档举例:平台上一个"恰好位置不当"的模数转换器(ADC)拾取了 CPU 噪声。
Mbed TLS 的立场明确:不对本地非时序旁路攻击提供任何安全保证。如果用户用例的威胁模型中存在此类攻击,必须由平台侧缓解。
4.2.3 本地故障注入(Local fault injection attacks)
同一硬件上运行的软件可以影响设备物理状态并引入故障。Mbed TLS 同样不提供针对本地故障注入的安全保证,需由平台缓解。
4.3 物理攻击:明确不承诺
攻击者定义:能获取 Mbed TLS 所运行硬件的物理信息,和/或能改变硬件的物理状态(例如功耗分析、电磁辐射、故障注入)。
Mbed TLS 的立场:不针对物理攻击提供任何安全保证。若威胁模型中存在物理攻击,必须由物理反制措施(physical countermeasures)来缓解。这对嵌入式场景是重要提示:如果你依赖硬件安全模块或物理加固来做物理防护,Mbed TLS 不会成为缺口,但也不会替你兜底。
五、Caveats:三条容易被忽略的重要注意事项
SECURITY.md 的"Caveats"部分给出了三条边界说明,每一条都直接影响工程实践。
5.1 编译器引入的时序旁路(Compiler-induced side channels)
Mbed TLS 主体用 C 编写,使用标准 C(已知编译器例外除外),因此不预期编译器会引入直接漏洞。但编译器可能在意图为常量时间的代码中引入时序旁路。Mbed TLS 包含防止这一点的反制措施,但鉴于编译器、编译选项和目标平台的多样性,这种防护可能不完整。
文档给出了明确的编译建议:
- 推荐使用常见优化级别编译,如
-O2或-Os; - 若"常见编译器 + 常见优化级别"下出现可利用的时序旁路,Mbed TLS 通常会将其视为漏洞;
-O3、-Oz更高级别"通常仍然安全",但审查程度更低(less scrutinized);- 不推荐单独使用可能引入数据依赖时序的个别选项,且 Mbed TLS 不会为"不属于常见优化级别"的此类优化做适配。
工程含义:如果你用非标准的编译选项组合构建 Mbed TLS(如某些编译器私有标志),时序安全性承诺的适用性会打折扣。
5.2 范围外的反制措施(Out-of-scope countermeasures)
Mbed TLS 是"有机生长"(evolved organically)的项目,威胁模型并非从一开始就清晰定义。因此代码中可能存在针对威胁模型之外攻击的反制措施。两条关键结论:
- 这些反制措施的存在,不代表Mbed TLS 对其威胁模型之外的某一类攻击提供防护;
- 这类反制措施的失效,也不被视为漏洞。
这避免了"某处代码看起来像防护,于是把它当安全承诺"的误读。
5.3 X.509 数据的格式处理(Formatting of X509 data)
这一节讨论 Mbed TLS 处理 X.509 对象(证书、证书签名请求 CSR、证书吊销列表 CRL)的局限,对 CA 场景尤其重要:
- Mbed TLS 不校验对象严格符合 X.509 及其他相关标准。对已签名的证书与 CRL,假设签名方已做过合规校验(签名正确则信任其格式正确);CSR 同样被隐式信任为标准合规的;
- 明确警告:除非额外独立地执行合规性校验,否则不得用 Mbed TLS 去签署不可信的 CSR 或 CRL。因此 Mbed TLS 单独使用不适合直接充当证书颁发机构(CA);
- 但 Mbed TLS 承诺:在解析证书、CSR、CRL 时防护内存破坏和其他未定义行为。如果一个 CSR 或签名证书在解析时触发未定义行为,即被视为安全漏洞。
这一条给出了清晰的使用边界:Mbed TLS 的 X.509 定位是"安全地解析与信任链验证",而非"完整的 CA 签发流水线"。
六、把威胁模型落到工程决策:一份速查表
综合 SECURITY.md 的承诺矩阵,可以为不同部署场景直接得出结论:
| 威胁类型 | Mbed TLS 的承诺 | 谁来兜底 |
|---|---|---|
| 远程攻击(窃听/篡改/注入/时序观测) | 全力防护,以协议保证为上限 | Mbed TLS + 用户应用 |
| 本地时序攻击 | 有限防护,仅针对已公开攻击技术,朝 fully timing-invariant 演进 | Mbed TLS(有限) |
| 本地非时序旁路 | 无保证 | 平台 |
| 本地故障注入 | 无保证 | 平台 |
| 物理攻击(功耗/辐射/物理故障注入) | 无保证 | 物理反制措施 |
| 解析恶意 X.509 对象导致的内存破坏/UB | 有保证(UB 即漏洞) | Mbed TLS |
| 签署不可信 CSR/CRL | 不保证(需额外校验,单独不适合做 CA) | 上层 CA 软件 |
| 密码学原语本身的威胁模型 | 适用 TF-PSA-Crypto 威胁模型 | 需一并评估 |
配合前文的两点行动建议:
- 版本侧:始终使用维护分支的最新版本(当前维护分支见 BRANCHES.md:
main、development、LTS 的mbedtls-3.6至 2027-03、mbedtls-4.1至 2029-03),避免停留在archive/归档分支; - 构建侧:使用
-O2或-Os这类常见优化级别编译,保持时序防护承诺在承诺范围内生效。
七、小结
SECURITY.md 的价值在于把 Mbed TLS 的安全承诺写得没有任何模糊空间:远程攻击全力防护、本地时序攻击有限防护且目标明确、本地非时序旁路与物理攻击明确不承诺、X.509 解析保证"无未定义行为"但不保证"严格标准合规"、漏洞统一走 mbed-tls-security@lists.trustedfirmware.org、安全修复只进维护分支。源码层面的常量时间比较函数(如 ssl_tls12_client.c 中的mbedtls_ct_memcmp)、针对常量时间行为的测试套件、以及ChangeLog.d/中的安全修复记录,都与这份文档的承诺相互印证。把这份威胁模型当作选型与加固清单使用,是安全使用 Mbed TLS 的第一步。
【免费下载链接】mbedtlsAn open source, portable, easy to use, readable and flexible TLS library, and reference implementation of the PSA Cryptography API. Releases are on a varying cadence, typically around 3 - 6 months between releases.项目地址: https://gitcode.com/GitHub_Trending/mb/mbedtls
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考