2026/6/20 1:51:23
网站建设
项目流程
外贸网站如何seo,wordpress it模板下载,如何搭建网站赚钱,网站建设销售员工作内容Introducing constant-time support for LLVM to protect cryptographic code
Trail of Bits 已经为 LLVM 开发了常量时间编码支持#xff0c;为开发者提供编译器级别的保证#xff0c;确保他们的密码学实现能够安全抵御与分支相关的时序攻击。这些更改正在接受审查#xff…Introducing constant-time support for LLVM to protect cryptographic codeTrail of Bits 已经为 LLVM 开发了常量时间编码支持为开发者提供编译器级别的保证确保他们的密码学实现能够安全抵御与分支相关的时序攻击。这些更改正在接受审查并将添加到即将发布的 LLVM 22 中。这项工作引入了__builtin_ct_select系列内置函数及其支持基础设施防止 Clang 编译器以及其他可能使用 LLVM 构建的编译器无意中破坏精心编写的常量时间代码。本文将引导您了解我们构建了什么、它是如何工作的以及它支持什么。我们还将讨论扩展这项工作的未来计划。The compiler optimization problem现代编译器擅长使代码运行得更快。它们消除冗余操作、向量化循环并巧妙地重组算法以榨取每一丝性能。但在处理密码学代码时这种优化热情就变成了一个负担。考虑 Sprenkels (2019) 中这个看似无害的常量时间查找uint64_tconstant_time_lookup(constsize_tsecret_idx,constuint64_ttable[16]){uint64_tresult0;for(size_ti0;i8;i){constbool condisecret_idx;constuint64_tmask(-(int64_t)cond);result|table[i]mask;}returnresult;}这段代码小心翼翼地避免在秘密索引上进行分支。无论秘密值是什么每次迭代都执行相同的操作。然而由于编译器旨在让你的代码运行得更快它们会看到优化这段精心编写的代码的机会将其优化成包含分支的版本。问题在于编译后代码中任何依赖于数据的行为都会产生时序侧信道。如果编译器引入了类似if (i secret_idx)的分支CPU 将根据是否执行分支而花费不同的时间。现代 CPU 具有分支预测器可以学习模式使得正确预测的分支比错误预测的分支更快。攻击者如果能够在多次执行中测量这些时序差异就可以通过统计确定正在访问哪个索引从而有效地恢复秘密。即使是几个 CPU 周期的微小时序变化只要有足够的测量次数也可能被利用。What we built我们的解决方案为密码学开发者提供了显式的编译器内置函数这些函数在整个编译流水线中保持常量时间属性。核心新增的是__builtin_ct_select系列内置函数// Constant-time conditional selectionresult__builtin_ct_select(condition,value_if_true,value_if_false);该内置函数保证上述选择操作将编译为常量时间的机器码无论优化级别如何。当你在 C/C 代码中编写这个时编译器会将其转换为特殊的 LLVM 中间表示内置函数 (llvm.ct.select.*)该函数携带语义含义“此操作必须保持常量时间。”与优化器可以自由重新排列和转换的常规代码不同这个内置函数充当了一个屏障。优化器将其识别为安全关键操作并在从源代码到汇编的每个编译阶段都保持其常量时间属性。Real-world impact在最近的研究“Breaking Bad: How Compilers Break Constant-Time Implementations”中Srdjan Čapkun 和他的研究生 Moritz Schneider 和 Nicolas Dutly 发现编译器破坏了许多生产密码学库中的常量时间保证。他们对五个编译器中的 19 个库进行的分析揭示了在编译过程中引入的系统性漏洞。使用我们的内置函数有问题的查找函数变成了这个常量时间版本uint64_tconstant_time_lookup(constsize_tsecret_idx,constuint64_ttable[16]){uint64_tresult0;for(size_ti0;i8;i){constbool condisecret_idx;result|__builtin_ct_select(cond,table[i],0u);}returnresult;}使用内置函数可以防止编译器对其进行任何修改从而确保选择保持常量时间。没有优化过程会将其转换为易受攻击的内存访问模式。Community engagement and adoption要将这些更改整合到上游需要广泛的社区参与。我们于 2025 年 8 月在 LLVM Discourse 论坛上发布了我们的 RFC。该 RFC 收到了来自编译器和密码学社区的宝贵反馈。来自 Rust Crypto、BearSSL 和 PuTTY 的开源维护者表示出强烈的兴趣希望采用这些内置函数来替代他们当前的内联汇编解决方案同时为我们的实现方法和未来原语提供了有价值的反馈。LLVM 开发人员帮助确保这些内置函数能与自动向量化和其他优化过程正常工作并提供了架构特定的实现指导。Building on existing work我们的方法综合了多个先前工作的经验教训Simon and Chisnall __builtin_ct_choose (2018)这项工作为保持常量时间属性的编译器内置函数提供了概念基础但从未被整合到上游。Jasmin (2017)这项工作展示了编译器感知常量时间原语的价值但需要一种新语言。Rust’s#[optimize(never)]experiments这些实验凸显了对细粒度优化控制的需求。How it works across architectures我们的实现确保__builtin_ct_select在每个平台上都能编译成常量时间代码x86-64该内置函数直接编译为cmov条件移动指令无论条件值如何该指令始终以常量时间执行。i386由于 i386 缺少cmov我们使用带有位运算的掩码算术模式来实现常量时间选择。ARM and AArch64对于 AArch64该内置函数被转换为CSEL指令该指令提供常量时间执行。对于 ARM由于 ARMv7 没有像 AArch64 那样的常量时间指令实现会生成一个使用位运算的掩码算术模式。Other architectures通用后备实现使用位运算算术来确保常量时间执行即使在我们尚未原生支持的平台上也是如此。每种架构都需要不同的指令来实现常量时间行为。我们的实现透明地处理这些差异因此开发人员可以编写可移植的常量时间代码而无需担心平台特定的细节。Benchmarking results我们在 ETH Zürich 的合作伙伴正在使用他们从“Breaking Bad”研究中获得的测试套件进行全面的基准测试。初步结果显示对于大多数密码学操作性能开销极小在所有测试的优化级别上100% 保持常量时间属性成功集成到包括 HACL*、Fiat-Crypto 和 BoringSSL 在内的主要密码学库中What’s next虽然__builtin_ct_select解决了最迫切的需求但我们的 RFC 概述了其他内置函数的路线图Constant-time operations我们未来计划扩展常量时间实现特别是针对算术或字符串操作以及强制表达式以常量时间求值。_builtin_ctop// for constant-time arithmetic or string operation__builtin_ct_expr(expression)// Force entire expression to evaluate without branchesAdoption path for other languages我们 LLVM 实现的模块化特性意味着任何以 LLVM 为目标的语言都可以利用这项工作RustRust 编译器团队正在探索如何通过其core::intrinsics模块公开这些内置函数并可能在标准库中提供安全的包装器。Swift苹果的安全团队已表示有兴趣采用这些原语用于其密码学框架。WebAssembly这些内置函数对于浏览器密码学特别有用尽管有沙箱保护但时序攻击仍然是一个隐患。Acknowledgments这项工作是与 ETH Zürich 的系统安全小组合作完成的。特别感谢 Laurent Simon 和 David Chisnall 在常量时间编译器支持方面的开创性工作以及 LLVM 社区在 RFC 过程中给予的建设性反馈。我们特别感谢 Trail of Bits 密码学团队的技术审查。ResourcesRFC: Constant-Time Coding SupportLLVM Developers’ Meeting 2025: Constant-Time Intrinsics Presentation TalkETH Zürich’s “Breaking Bad” StudyPart 1: The life of an optimization barrier (Trail of Bits blog)Part 2: Improving crypto code in Rust using LLVM’s optnone (Trail of Bits blog)本博客文章所提及的工作由 Trail of Bits 执行基于 DARPA 根据合同号 N66001-21-C-4027 支持的工作分发声明 A批准公开发布分发无限制。材料中表达的任何意见、发现、结论或建议均为作者的意见、发现、结论或建议不一定反映美国政府或 DARPA 的观点。B66Q6Ou1tAlwnlpPPdAu77nNUwoBs1zkLmuVVwDZNnreL2yvDimMLJgNVkuWgPUMwmmuZ1ghX4itiCavn53ztKBktcqcx7ZeYB9INVnEkO/LfR/OOyo701789DsckCTeQJRrwcGh9wjomLU7MMStCe56mLHV8dOrTYEBKuzk更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号网络安全技术点滴分享