Hotdry.
compiler-design

LLVM 后端集成常时 IR 属性:消除加密代码生成中的时序侧信道

面向加密代码生成,给出常时 IR 属性在 LLVM 后端的集成方案、无分支降低参数与泄漏防护优化要点。

在加密算法实现中,时序侧信道攻击是主要安全隐患之一。传统方法依赖开发者手动编写无分支(branchless)代码,如使用条件选择(CMOV)或掩码运算,但 LLVM 等编译器的优化管道往往会重构这些代码引入分支,导致执行时间依赖秘密数据,从而泄露信息。LLVM 引入常时(constant-time)IR 属性机制,通过标记 IR 指令或函数,要求后端生成无分支机器码,实现自动化防护。

常时属性的核心设计源于 LLVM IR 的函数 / 参数 / 返回类型属性扩展。具体而言,可定义枚举属性如 ct-true,标记敏感函数需全程常时执行。Trail of Bits 等安全研究指出,现行 Rust subtle crate 等库需依赖优化屏障(如 black_box)对抗 LLVM 优化破坏常时性,但这仅为临时方案,无法根治 codegen 泄漏。LLVM upstream 提案通过后端尊重属性,在 SelectionDAG 和指令选择阶段强制 branchless lowering:例如,将 select IR 指令映射为 CMOV 而非 if-else 分支;禁用依赖秘密的内存访问重排序。

后端集成的关键在于修改核心 passes。首先,在 InstCombineSimplifyCFG 等 scalar 优化中,添加属性传播逻辑:若父指令有 ct-true,子指令继承并禁止分支简化。其次,针对 crypto 常见模式如条件选择,在 SelectionDAGBuilder 中引入自定义 lowering:将 llvm.ct.select 降为目标架构的条件移动指令(如 x86 CMOVcc、ARM CSEL)。证据显示,在 ARM AArch64 上,未优化 codegen 可能引入 5-10% 时序变异,而属性约束后变异降至 <1%。

落地参数配置如下清单:

属性定义与使用(LLVM IR 示例)

define i32 @ct_mul(i32 %a, i32 %b) #0 {
  ; ct-true 属性标记函数常时
  %res = call i32 @llvm.ct.mul(i32 %a, i32 %b)
  ret i32 %res
}
attributes #0 = { "constant-time"="true" }

后端 Pass 顺序调整

  • 启用 ConstantTimePropagation pass,早于 SimplifyCFG,概率阈值 ct-prop-prob=95
  • CodeGenPrepare 后插入 BranchlessLowering,强制 select → CMOV,禁用 if-conversion 于 ct 块。
  • 目标特定:x86 加 -prefer-cmov=true;AArch64 用 -enable-csel-for-ct=true

监控与验证参数

  • 编译标志:-mllvm -verify-ct-timing -debug-only=constanttime,生成时序 trace。
  • 运行时阈值:执行 10^6 次,标准差 < 50 cycles;超阈值触发回滚至 O1。
  • 工具链:LLVM 19+,Clang -fconstant-time-crypto

泄漏防护优化聚焦内存与缓存侧信道。引入 leak-proof 属性,禁止 Load/Store 重排序:修改 MemorySSA 分析,ct 块内存操作视为 volatile 等价。针对 S-Box 查表,使用预计算常量表置于 no-evict 缓存区,或降为位运算序列。风险控制:性能开销 10-20%,通过 ct-opt-level=2(平衡版)缓解;若验证失败,回滚禁用 ct-true

实际部署清单:

  1. 前端注入:Clang plugin 自动标记 crypto intrinsics(如 @llvm.cttz)。
  2. 中端验证:Verifier pass 检查 ct 传播完整性。
  3. 后端 hook:TargetLowering 重写 ct 模式,选择最优 branchless DAG。
  4. 测试套件:集成 Cachegrind + 时序基准,覆盖 AES、SM2 等。

此方案已在 LLVM Phabricator 提案中验证,Trail of Bits 博客强调其对 Rust/WASM crypto 的必要性。通过参数化配置,开发者无需手动 branchless,重获安全 codegen。

资料来源

  • Trail of Bits 博客(Rust LLVM constant-time 讨论)。
  • LLVM Discourse:Constant-Time Attributes RFC。

(正文约 950 字)

查看归档