技术深度解析
ctsrd-cheri/llvm-project并非一个简单的补丁,而是对LLVM代码生成和优化通道的实质性重构,旨在理解并发出能力指令。其核心在于,CHERI用能力取代了传统的平面内存指针——这些128位或256位的对象将虚拟地址与边界、权限和有效性元数据结合在一起。编译器必须在每个阶段追踪这些能力:从前端的AST表示,经过中间端的IR优化,到后端的指令选择。
架构: 该分支修改了LLVM针对CHERI启用架构(最初为CHERI-RISC-V和Arm的CHERI原型Morello)的目标描述。关键变更包括:
- 指针表示: 指针被扩展为能力大小(64位CHERI上为128位)。所有指针算术必须保留能力元数据,这意味着编译器不能优化掉边界信息。
- 内建函数: 新的LLVM内建函数(例如`@llvm.cheri.cap.bounds.set`、`@llvm.cheri.cap.perms.and`)直接在IR中暴露CHERI操作,允许优化器对能力变换进行推理。
- 代码生成: 后端发出CHERI特定指令,如`CSetBounds`、`CAndPerm`和`CSeal`,用于能力操作。分支指令被修改为在解引用前检查能力有效性。
- ABI变更: 调用约定被扩展,以在专用能力寄存器中传递能力,并对可变参数函数和函数指针进行特殊处理。
性能影响: 能力检查的开销不可忽视。CHERI-RISC-V上的早期基准测试显示,CPU密集型工作负载平均性能损失5-15%,内存密集型应用则可能放缓高达30%。然而,这种权衡消除了整类漏洞,且没有基于软件的解决方案(如AddressSanitizer,其可能导致2倍减速)的运行时开销。
相关GitHub仓库:
- `ctsrd-cheri/llvm-project` — 支持CHERI的主要LLVM分支。目前有69颗星,在`cheri`分支上活跃开发。
- `CTSRD-CHERI/cheribsd` — 一个启用CHERI的FreeBSD发行版,使用此LLVM分支编译用户空间和内核。
- `CTSRD-CHERI/sail-cheri-riscv` — 用SAIL编写的CHERI-RISC-V形式化规范,用于验证。
数据表格:内存安全开销对比
| 保护方法 | 运行时开销 | 内存开销 | 漏洞覆盖范围 | 采用障碍 |
|---|---|---|---|---|
| CHERI(硬件能力) | 5-15% | 5-10%(更宽的指针) | 所有空间 + 时间(使用密封能力) | 需要CHERI硬件 |
| AddressSanitizer (ASan) | 2倍-3倍 | 3倍-5倍 | 仅空间 | 仅需编译器标志 |
| 内存标记 (MTE) | 1-3% | 2-5% | 概率性(1/16几率) | 需要ARM v8.5-A+ |
| Rust的所有权模型 | 0%(编译时) | 0% | 空间 + 时间(编译时) | 需要语言重写 |
数据要点: CHERI在低运行时开销和全面漏洞覆盖之间提供了最佳平衡,但其硬件依赖性造成了鸡生蛋蛋生鸡的采用问题。LLVM分支是解锁硬件价值的软件钥匙。
关键参与方与案例研究
CHERI生态系统由一个小型但具有影响力的学术与工业参与者联盟推动:
剑桥大学计算机实验室 — CHERI的发源地。Robert Watson和Simon Moore等研究人员是该架构背后的智力力量。他们在CheriBSD和CHERI-RISC-V原型上的工作证明了基于能力的安全在完整操作系统中的可行性。
Arm Holdings — 最重要的商业支持者。Arm的Morello项目生产了一个CHERI启用的处理器原型(Morello SoC)和一个研究用板卡(Avalon)。Arm已公开承诺探索将CHERI用于未来核心,但尚未公布生产时间表。ctsrd-cheri/llvm-project是Morello开发的主要编译器。
Google — 通过其Project Zero和Android安全团队,Google一直是硬件内存安全的积极倡导者。他们为CHERI LLVM分支贡献了改进代码生成的补丁,并在内部使用它评估CHERI用于Android内核和用户空间。
Microsoft — Azure Sphere团队已试验将CHERI用于物联网安全,Microsoft Research与剑桥大学合作对CHERI规范进行了形式化验证。
对比表格:CHERI硬件实现
| 实现 | 架构 | 状态 | 性能 (SPEC2006) | 可用性 |
|---|---|---|---|---|
| CHERI-RISC-V (Bluespec) | RISC-V 64位 | 活跃研究 | 约基线的85% | FPGA比特流 |
| Arm Morello | Armv8.2-A | 原型 (2022) | 约基线的90% | 有限板卡(约1000块) |
| CHERI x86(学术) | x86-64 | 早期仿真 | 不适用 | 不适用 |