Overview
In the CHERI capability-based architecture, a capability is an unforgeable, 128-bit token that replaces traditional integer memory pointers. Unlike a bare address, a capability carries metadata — including bounds, object type, a validity tag, and permissions — that the hardware consults on every memory operation performed through that capability. The permissions field is the mechanism by which a capability expresses what the holder is allowed to do with the memory it addresses, as distinct from which memory it addresses (the bounds field).
Role within a CHERI capability
A CHERI capability value is composed of several encoded fields:
- Bounds — compressed encoding of the accessible base and top of the address range.
- Permissions — a bitmap indicating which operations the capability authorizes.
- Object type — identifies the kind of object the capability points to (used, for example, to validate object-method invocation by requiring both a Data capability and an Execution capability).
- Reserved / other metadata fields (e.g., a
flag_cap_modebit required for Hybrid-Mode operation, where CHERI-aware and legacy code coexist). - Tag bit — an out-of-band validity tag stored separately and atomically bound to the capability, which validates that the capability has not been forged or corrupted.
The permission bits are checked by the ISA on instruction issue, alongside bounds checks, so unauthorized accesses are trapped rather than silently permitted.
Examples of permissions
Common permission bits enumerated in the CHERI specification and illustrated in the ASP-DAC 2026 paper A RISC-V CHERI VP include:
- Load — permits reading memory through the capability.
- Store — permits writing memory through the capability.
- Execute — permits using the capability to fetch instructions (i.e., an executable capability, necessary in combination with a Data capability to invoke object methods safely).
Because permissions are stored per-capability rather than per-page or per-process, software can mint derived capabilities with a subset of the original permissions (a property called monotonicity), enabling patterns such as handing out a read-only view of a buffer or separating code-fetch rights from data-access rights at function-call boundaries.
Hardware support for permissions
Enforcing capability permissions requires architectural changes throughout the processor and memory system:
- General-purpose registers widen to 129 bits (a 64-bit address plus 64 bits of metadata such as bounds and permissions, plus a 1-bit tag).
- The program counter is itself extended with a capability, so instruction-fetch permissions can be checked.
- Tagged memory protects capability-sized, capability-aligned words in DRAM by associating an out-of-band validity tag.
- The system bus is extended to transport these out-of-band tags across the memory hierarchy.
- The ISA is augmented with new instructions for capability manipulation, and existing instructions are modified to enforce monotonicity and guarded manipulation of permission bits.
Relationship to other CHERI concepts
- CHERI: capability permissions are one of the metadata classes that define the CHERI protection model; without permissions, capabilities would only offer spatial confinement (bounds) without type- or operation-level control.
- Capability pointer: a capability pointer is the concrete program-visible handle that carries the permissions field; capability permissions extend the meaning of an ordinary pointer by encoding authorized operations in the pointer value itself.