为LLVM引入常量时间支持以保护密码学代码

Introducing constant-time support for LLVM to protect cryptographic code

Trail 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_tresult=0;for(size_ti=0;i<8;i++){constbool cond=i==secret_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_tresult=0;for(size_ti=0;i<8;i++){constbool cond=i==secret_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_ct<op>// for constant-time arithmetic or string operation__builtin_ct_expr(expression)// Force entire expression to evaluate without branches
Adoption path for other languages

我们 LLVM 实现的模块化特性意味着任何以 LLVM 为目标的语言都可以利用这项工作:

  • Rust:Rust 编译器团队正在探索如何通过其core::intrinsics模块公开这些内置函数,并可能在标准库中提供安全的包装器。
  • Swift:苹果的安全团队已表示有兴趣采用这些原语用于其密码学框架。
  • WebAssembly:这些内置函数对于浏览器密码学特别有用,尽管有沙箱保护,但时序攻击仍然是一个隐患。

Acknowledgments

这项工作是与 ETH Zürich 的系统安全小组合作完成的。特别感谢 Laurent Simon 和 David Chisnall 在常量时间编译器支持方面的开创性工作,以及 LLVM 社区在 RFC 过程中给予的建设性反馈。

我们特别感谢 Trail of Bits 密码学团队的技术审查。

Resources

  • RFC: Constant-Time Coding Support
  • LLVM Developers’ Meeting 2025: Constant-Time Intrinsics Presentation Talk
  • ETH Zürich’s “Breaking Bad” Study
  • Part 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 的观点。
B66Q6Ou1tAlwnlpPPdAu77+nNUwoBs1zkLmuVVwDZNnreL2yvDimMLJgNVkuWgPUMwmmuZ+1ghX4itiCavn53ztKBktcqcx7ZeYB9INVnEkO/LfR/OOyo701789D+sckCTeQJRrwcGh9wjomLU7MMStCe56mLHV8dOrTYEBKuzk=
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1123211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【课题推荐】基于UAV辅助的UGV高精度协同定位技术研究,附MATLAB例程运行的典型结果

针对GPS拒止环境下UGV高精度定位难题&#xff0c;提出基于UAV辅助的协同定位解决方案。通过建立精确的相对观测模型、设计鲁棒的多源信息融合算法、改善UGV定位精度 文章目录研究背景与意义研究背景研究意义国内外研究现状存在的问题研究内容与技术路线MATLAB例程运行结果研究背…

【好写作AI】玩转新媒体:让AI帮你写出点赞10w+的校园公众号推文

当你还在为阅读量焦虑时&#xff0c;对手小编已经用AI跑通了从“热点”到“爆款”的流水线。校园公众号小编的日常&#xff1a;盯热点、找角度、憋标题、凑字数、等推送、看数据……然后失眠。你是否发现&#xff0c;那些看似信手拈来的10w&#xff0c;背后往往有一套精准的“数…

MCP量子计算考试倒计时:这10个知识点你必须掌握!

第一章&#xff1a;MCP量子计算考试概述 MCP&#xff08;Microsoft Certified Professional&#xff09;量子计算认证考试旨在评估开发者在量子算法设计、Q#编程语言应用以及量子硬件模拟方面的实际能力。该考试融合了理论知识与动手实践&#xff0c;要求考生掌握从量子比特操作…

亲测好用9个一键生成论文工具,自考学生轻松搞定毕业论文!

亲测好用9个一键生成论文工具&#xff0c;自考学生轻松搞定毕业论文&#xff01; 自考论文的救星&#xff1a;AI 工具如何改变你的写作方式 在自考学习过程中&#xff0c;毕业论文无疑是许多学生最头疼的一环。从选题到撰写&#xff0c;再到反复修改&#xff0c;每一步都充满了…

5.12MB 局域网神器:比 MeFile 更轻,传文件秒搞定

之前给大家安利过文件共享工具、MeFile 两款局域网传文件的利器&#xff0c;用着都挺顺手。直到挖到今天这款&#xff0c;才发现原来局域网共享还能这么省事。 下载地址&#xff1a;https://pan.quark.cn/s/2b6ed44973d9 备用地址&#xff1a;https://pan.baidu.com/s/19kVYE…

农业-虫情监测:图像识别模型泛化能力测试指南

在精准农业中&#xff0c;图像识别模型已成为虫情监测的核心工具&#xff0c;能自动检测病虫害威胁&#xff08;如蚜虫或飞蛾&#xff09;&#xff0c;减少农药滥用并提升产量。然而&#xff0c;模型易受田间变量&#xff08;如光照、背景杂乱或虫种变异&#xff09;影响&#…

零信任在MCP中的真实应用,5个高危场景及应对策略

第一章&#xff1a;MCP中零信任安全架构的演进与核心理念在现代云计算平台&#xff08;MCP&#xff09;快速发展的背景下&#xff0c;传统基于边界的网络安全模型逐渐失效。攻击面的扩大、远程办公的普及以及多云环境的复杂性&#xff0c;促使安全架构向“永不信任&#xff0c;…

(N_081)基于jsp、ssm网上购物商城系统

开发工具&#xff1a;eclipse&#xff0c;jdk1.8 服务器&#xff1a;tomcat7.0 数据库&#xff1a;mysql5.7 技术&#xff1a; springspringMVCmybaitsEasyUI 项目功能介绍&#xff1a; 关于在线商城系统的功能有&#xff1a; 用户前台功能&#xff1a;商品分类多级展示、…

部署效率翻倍的关键,MCP Azure Stack HCI 架构设计精髓(仅限资深架构师查看)

第一章&#xff1a;MCP Azure Stack HCI 架构核心理念Azure Stack HCI 是微软混合云战略的关键组成部分&#xff0c;旨在将公有云的敏捷性与本地基础设施的可控性相结合。其架构设计围绕软件定义的数据中心&#xff08;SDDC&#xff09;理念展开&#xff0c;通过集成计算、存储…

深圳南柯电子|EMC摸底测试整改:从摸底到合规的全流程系统方案

在5G通信、新能源汽车、工业物联网等新兴技术快速迭代的今天&#xff0c;电子设备面临的电磁环境复杂度呈指数级增长。某知名汽车电子厂商曾因ECU辐射超标导致整车电磁干扰&#xff0c;最终通过系统性整改才通过认证&#xff1b;某消费电子品牌因静电放电&#xff08;ESD&#…

精准适配,让IPD咨询成为企业产品力增长引擎

集成产品开发&#xff08;IPD&#xff09;作为一套系统化的产品开发管理方法论&#xff0c;自IBM提出后经华为成功实践&#xff0c;已成为企业提升产品竞争力的核心工具。华为问界、三折叠手机等现象级产品的持续热销&#xff0c;印证了IPD体系在市场洞察、跨部门协同、高效研发…

SpringSecurity小白指南:用AI10分钟搭建第一个安全项目

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个最简单的SpringSecurity入门项目&#xff0c;要求&#xff1a;1. 图形化界面配置用户和权限&#xff1b;2. 实现基础的表单登录&#xff1b;3. 不同角色看到不同首页内容&…

H100 GPU支持即将上线,大幅提升AI模型运行性能

H100即将登陆平台 我们致力于让用户能够轻松地在多种不同类型的硬件上运行机器学习模型&#xff0c;包括英伟达T4、A40和A100 GPU&#xff0c;以及CPU。 很快&#xff0c;我们将新增对英伟达H100 GPU的支持&#xff0c;其性能将更为强大。 如果您有兴趣提前体验H100&#xff0c…

‌月球采矿软件适配测试报告:低重力环境挑战与解决方案

低重力环境下的软件测试新边疆‌ 随着人类太空探索的加速&#xff0c;月球采矿已成为现实&#xff08;2026年全球矿业投资激增&#xff09;&#xff0c;但其低重力环境&#xff08;约地球的1/6&#xff09;对软件系统构成独特挑战。软件测试从业者必须适配传感器漂移、控制算法…

N8N一键安装方案:节省80%部署时间

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个N8N一键安装脚本生成器。功能包括&#xff1a;1) 支持Docker/原生安装模式选择 2) 生成对应平台的安装脚本 3) 自动依赖项处理 4) 安装进度可视化。要求输出完整的bash/po…

Z-IMAGE-TURBO本地部署实战:医疗影像分析案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个医疗影像分析系统&#xff0c;使用Z-IMAGE-TURBO本地部署。功能需求&#xff1a;1) DICOM格式医学图像的高效读取和处理&#xff1b;2) 基于深度学习的病灶检测算法&#…

Windows.edb损坏?手把手教你修复与重建

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个Windows.edb修复工具&#xff0c;能够检测数据库完整性&#xff0c;自动执行修复流程或重建索引。工具应提供两种模式&#xff1a;普通用户的一键修复和高级用户的手动配置…

2026 年已到 想以全新执照开启创业路?

2026 年已至&#xff0c;想以全新执照开启创业路&#xff1f;春芽惠企同步北京最新政策&#xff0c;整合 “一网通办” 升级服务与创业补贴新政&#xff0c;全程线上办理无需跑政务大厅&#xff0c;让新年创业省心又省钱&#xff01;​一、核心材料清单 公司名称&#xff1a;备…

VENTOY实战:用U盘同时安装Windows+Linux双系统

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个分步骤的VENTOY双系统安装教程应用&#xff0c;包含&#xff1a;1)准备工作清单 2)VENTOY安装流程可视化演示 3)Windows ISO添加教程 4)Linux ISO添加教程 5)双系统启动菜…

S32K ADC功能在S32DS中的项目应用

玩转S32K的ADC&#xff1a;从S32DS配置到实战采样优化你有没有遇到过这样的场景&#xff1f;在电池管理系统中&#xff0c;明明电压传感器输出很稳定&#xff0c;但MCU读出来的ADC值却“跳来跳去”&#xff0c;搞得SOC估算像坐过山车&#xff1b;或者DMA采集8个通道&#xff0c…