CHERI C/C++ 编程指南:能力硬件内存安全的终极手册

GitHub April 2026
⭐ 67
来源:GitHub归档:April 2026
CHERI C/C++ 编程指南正式发布,成为面向CHERI能力硬件开发者的权威参考。该指南系统性地覆盖了指针压缩、能力边界检查等核心概念,填补了CHERI生态系统中长期存在的关键文档空白。

CHERI(能力硬件增强RISC指令集)架构是最有前景的软硬件协同设计方案之一,旨在从根源上消除内存安全漏洞。多年来,CHERI生态系统虽拥有丰富的研究论文和学术原型,却严重缺乏实用、对开发者友好的文档。官方CHERI C/C++编程指南在GitHub(仓库:ctsrd-cheri/cheri-c-programming)上的发布彻底改变了这一局面。该指南不仅是教程,更是一本全面参考手册,系统性地讲解如何编写充分利用CHERI能力模型的C和C++代码。内容涵盖从能力(即同时携带地址和权限元数据的胖指针)的基础知识,到高级主题的方方面面。

技术深度解析

CHERI C/C++编程指南围绕一个看似简单的核心前提构建:教会开发者如何编写与CHERI能力模型正确配合的代码。但技术现实远比这复杂得多。

CHERI的核心是用128位或256位的能力取代传统的64位指针。每个能力不仅包含地址,还包含基址、边界(长度)以及一组权限(读、写、执行、加载能力、存储能力等)。硬件强制执行:任何通过能力进行的内存访问都必须落在其边界内并遵守其权限。这与传统的基于MMU的保护有本质区别,后者以页粒度(通常为4KB)运行。CHERI实现了字节级保护,这意味着即使单个字节的缓冲区溢出也能在运行时被捕获。

该指南将大量篇幅用于指针压缩,这是实际部署中的关键优化。完整的128位能力会使每个指针的大小翻倍,这对许多工作负载来说是不可接受的。CHERI的压缩方案(如Morello架构中所实现的)尽可能将能力存储在64位寄存器中,利用了许多能力共享共同基址和边界值这一特性。指南解释了开发者如何组织数据以最大化可压缩性——例如,将具有相似生命周期和权限的对象分组到同一内存区域。

另一个关键部分涵盖了CHERI与C/C++类型系统之间的交互。指南解释了如何使用`__capability`关键字注释指针,以及编译器如何自动为代码插入边界检查。它还介绍了用于手动能力操作的CHERI特定内建函数,例如`cheri_bounds_set`和`cheri_perms_and`。当自动插装不足时,这些内建函数为开发者提供了细粒度的控制。

对于从事CHERI-RISC-V实现的开发者,指南引用了开源的CHERI LLVM编译器及相关工具链。CHERI LLVM项目的GitHub仓库(ctsrd/cheri-llvm)一直保持活跃,拥有超过1200颗星和定期提交。指南展示了如何以最小修改编译现有的C/C++代码库,通常只需添加诸如`-mabi=purecap`(纯能力ABI)之类的编译器标志。

数据表:CHERI开销与传统内存安全方法对比

| 方法 | 内存开销 | 性能开销 | 粒度 | 检测时机 |
|---|---|---|---|---|
| CHERI(128位能力) | 指针大小增加约100-200% | 平均5-15% | 字节级 | 运行时(硬件) |
| Address Sanitizer | 内存增加约200-300% | 2-3倍减速 | 字节级 | 运行时(软件) |
| SoftBound/CETS | 内存增加约50-100% | 1.5-2倍减速 | 字节级 | 运行时(软件) |
| Rust(所有权) | 运行时约0% | 运行时0% | 编译时 | 编译时 |
| MPK(内存保护键) | 指针大小约0% | 开销<1% | 页级 | 运行时(硬件) |

数据要点: CHERI提供了一个引人注目的中间地带:硬件强制的字节级保护,性能开销适中,远低于仅软件方法(如Address Sanitizer)。然而,指针大小的增加是一个真实成本,压缩方案只能部分缓解。

该指南还深入探讨了CHERI与C++特性(如虚函数表、异常和标准库容器)之间的交互。例如,CHERI的能力模型要求虚函数表指针被视为能力,这意味着硬件可以验证对虚函数表的访问是否超出其边界——从而防止虚函数表劫持攻击。指南提供了编写CHERI安全的自定义分配器和智能指针的模式。

关键参与者与案例研究

CHERI生态系统主要由学术和研究机构推动,剑桥大学计算机实验室是其起源地。该指南由来自剑桥、SRI International和Arm的研究人员共同撰写,反映了该项目的协作性质。

Arm的Morello板是最突出的商业CHERI实现。Morello于2021年宣布,并于2022年开始向选定合作伙伴发货,它是一款在修改后的Armv8-A架构上实现CHERI的原型片上系统。指南包含了针对Morello的具体示例,例如如何使用`morello`目标三元组以及如何在板上调试CHERI异常。Arm在CHERI上投入了大量资源,将其视为在物联网、汽车和云基础设施领域实现安全计算的一个潜在差异化优势。

在开源方面,CHERI-RISC-V项目(github.com/CTSRD-CHERI/cheri-riscv)提供了CHERI在RISC-V上的完整FPGA实现。这对于无法访问Morello硬件的研究人员和爱好者尤其重要。指南涵盖了这两个平台,并指出其编程模型几乎相同。

比较

更多来自 GitHub

Cabinet:这款AI优先的知识操作系统,能否颠覆Notion?Cabinet并非又一款聊天机器人附体的笔记应用。它将自己定位为完整的“初创公司操作系统”,AI是核心引擎,而非附加功能。该项目托管于GitHub(仓库名:hilash/cabinet),增长迅猛,单日收获近700颗星,总数达1733。这标OpenAgent:零星AI框架,能否重新定义多智能体编排?OpenAgent是一个全新的开源AI智能体框架,旨在简化多智能体系统的构建与编排。目前该项目在GitHub上星标数为零,没有任何过往记录、社区反馈或实际应用验证。其文档网站(托管于 the-open-agent/openagent-webCHERI-RISC-V 的 Sail 模型:硬件安全前沿的深度探秘GitHub 上拥有 66 颗星标的 ctsrd-cheri/sail-cheri-riscv 项目,提供了一个用 Sail 语言编写的 CHERI-RISC-V 架构的形式化、可执行模型。CHERI(Capability Hardware查看来源专题页GitHub 已收录 1243 篇文章

时间归档

April 20263011 篇已发布文章

延伸阅读

CHERIBSD:FreeBSD 硬件内存安全革命已从论文走进现实CHERIBSD 将 FreeBSD 移植到 CHERI-RISC-V 与 Arm Morello 平台,通过硬件强制的能力模型,在架构层面彻底消灭整类内存安全漏洞。这不是一次软件补丁,而是对操作系统管理指针与权限方式的根本性重构。CHERI LLVM分支:硬件能力如何重塑AI时代的内存安全LLVM编译器基础设施的一个专门分支,正将硬件强制内存安全引入主流开发。ctsrd-cheri/llvm-project将CHERI(能力硬件增强RISC指令)能力直接集成到工具链中,有望在硬件-软件边界消除整类内存破坏漏洞。CHERI-RISC-V 的 Sail 模型:硬件安全前沿的深度探秘一个基于 Sail 语言的 CHERI-RISC-V 形式化模型,正在悄然重塑硬件安全验证的范式。这个开源项目提供了一份可执行的规范,有望加速基于能力的存储保护机制在 RISC-V 生态系统中的普及。whisper-rs:将高效本地语音识别引入 Rust 内存安全生态whisper-rs 项目通过为 C++ 实现的 whisper.cpp 提供高效绑定,将 OpenAI 的 Whisper 语音识别模型引入 Rust 开发者视野。这实现了无需依赖云端或 Python 工具链、内存安全且高性能的本地转录,

常见问题

GitHub 热点“CHERI C/C++ Guide: The Missing Manual for Memory Safety on Capability Hardware”主要讲了什么?

The CHERI (Capability Hardware Enhanced RISC Instructions) architecture represents one of the most promising hardware-software co-design approaches to eliminating memory safety vul…

这个 GitHub 项目在“CHERI C/C++ programming guide memory safety”上为什么会引发关注?

The CHERI C/C++ Programming Guide is built around a deceptively simple premise: teach developers how to write code that works correctly with CHERI's capability model. But the technical reality is far more nuanced. At its…

从“CHERI capability hardware tutorial for developers”看,这个 GitHub 项目的热度表现如何?

当前相关 GitHub 项目总星标约为 67,近一日增长约为 0,这说明它在开源社区具有较强讨论度和扩散能力。