Karya Semi
HomeBlogSearchCategoriesAboutContact
Karya Semi

Less noise. More notes.

HomeBlogAboutContactPrivacy PolicyDisclaimer

© 2026 Karya Semi. All rights reserved.

XGitHubLinkedIn
  1. Home
  2. /Categories
  3. /Software Engineering

seL4 Formal Security Proofs Achieved Full Completion on AArch64

Completed sel4 aarch64 security proof guarantees microkernel isolation on ARM. Mathematical verification blocks exploits. Deploy secure code.

Dian Rijal Asyrof/August 28, 2026/6 min read
Illustration for seL4 Formal Security Proofs Achieved Full Completion on AArch64

For over a decade, seL4 has defined microkernel security through formal verification: a mathematical proof that the compiled binary matches its abstract specification. However, these proofs were long restricted to 32-bit ARM (ARMv7) and 32-bit x86. As modern server infrastructure, edge gateways, and mobile platforms transitioned to 64-bit ARM (AArch64), systems engineers faced a trade-off: choose verified security on obsolete hardware, or choose modern 64-bit hardware without verification.

That compromise is no longer necessary. The seL4 Foundation and its contributors have completed the formal verification chain for the AArch64 architecture. This means the microkernel now provides mathematically proven isolation on modern ARM processors, opening new possibilities for secure infrastructure design.

The Refinement Proof Chain

seL4 verification bypasses traditional software testing. It uses interactive theorem proving in Isabelle/HOL to establish a chain of refinement proofs. The chain begins with an abstract specification written in mathematical logic, defining security goals like access control and partition boundaries. Below this sits the executable specification, written in Haskell, which defines the concrete algorithms and state transitions.

Below the Haskell model is the C implementation, which is the actual source code of the microkernel. The verification team proves that every execution step of the C code refines the Haskell model, which in turn refines the abstract specification. If the abstract model proves that two processes cannot share memory, the C code is guaranteed to enforce that same rule.

Compiling C code introduces compiler risk. Compilers can contain bugs or perform optimizations that alter security properties. To eliminate this, seL4 uses translation validation. A decompiler reads the compiled ELF binary and converts it to a logic representation, which is then verified against the C source semantics. With AArch64 verification complete, this entire chain-from abstract math to the binary running on the hardware-is verified.

The AArch64 Hardware Challenge

AArch64 verification required solving unique hardware-specific challenges. The first was the memory management unit (MMU). AArch64 uses a translation table format different from 32-bit ARM, supporting up to four levels of page tables, virtual addresses up to 52 bits, and multiple page sizes. The verification team modeled these tables in Isabelle/HOL, proving that virtual memory operations-like mapping, unmapping, and modifying page permissions-never allow user space to access unauthorized physical memory.

The execution model of AArch64 added complexity. The architecture defines exception levels: EL0 for user applications, EL1 for the kernel, EL2 for hypervisors, and EL3 for secure monitors. Running at EL1, seL4 controls user processes at EL0. Proving isolation required modeling the hardware registers that control exception levels and memory access, including SCTLR_EL1, TCR_EL1, and the translation base registers TTBR0_EL1 and TTBR1_EL1. The proofs show that context switches update these registers correctly, leaving no residual data to leak information.

The weak memory model of ARM also added complexity. Modern ARM CPUs reorder memory reads and writes to improve performance. To ensure that memory changes are visible to the MMU and other CPU cores, the kernel must execute specific cache maintenance and Translation Lookaside Buffer (TLB) invalidation instructions. The team had to formalize these instructions, such as DC IVAC and TLBI VAE1IS, within the proof framework. They proved that the kernel executes these instructions at the correct times, preventing stale translation data from compromising security.

Capability-Based Access Control

At the core of seL4's access control model is capability-based security. User-space applications cannot refer to kernel objects directly. Instead, they reference them via capabilities. A capability is a token that grants a specific right (such as read, write, or grant) to a specific kernel resource, like a thread control block, a page table, or an inter-process communication endpoint. These capabilities are stored in kernel-managed tables called CNodes.

When a thread attempts to perform an operation, it passes a capability pointer (CPtr) to the kernel. The kernel checks the CNode to verify that the thread holds a valid capability with the required permissions. The verification proofs show that this capability model is correctly enforced by the binary, ensuring that user space cannot forge capabilities or bypass the checks.

C-to-Isabelle Translation

To verify C code, a parser converts it into a mathematical representation of control flow and state transitions in Isabelle/HOL. Because C allows undefined behavior, the kernel code is restricted to a strict subset, avoiding pointer casting and dynamic allocation. The parser translates this code into a monadic representation, enabling reasoning about system state before and after each function executes.

For AArch64, the parser maps assembly inserts to formal hardware models that define the state of the CPU registers, physical memory, and the MMU. The verification must prove that the assembly code behaves exactly as expected by the abstract kernel specification.

Memory Barrier Instructions

To manage the weak memory model of AArch64, the team modeled memory barriers. In ARMv8-A, memory operations can be reordered unless explicit barriers are used. The kernel uses instructions like DSB (Data Synchronization Barrier) and ISB (Instruction Synchronization Barrier) to enforce ordering.

When updating a page table entry, it executes a DSB to complete the write before the MMU reads the entry, followed by an ISB to flush the instruction pipeline. The proof models these barriers as state transitions, verifying that the kernel prevents race conditions that could break partition isolation.

Proving Security Properties

The AArch64 verification establishes three primary properties: functional correctness (no buffer overflows or memory leaks), integrity (no unauthorized modification of data), and confidentiality (no unauthorized reading of data). Achieving these proofs requires a massive engineering effort, with a proof codebase containing hundreds of thousands of lines of proof steps maintained through automated continuous integration.

Infrastructure and Enterprise Deployments

For enterprise infrastructure, the completion of the AArch64 proofs changes how secure systems are built. Modern cloud servers and edge nodes run on AArch64 processors like AWS Graviton or Ampere Altra. These platforms host multi-tenant workloads, where multiple virtual machines run on the same physical hardware. Traditional virtualization relies on hypervisors like KVM or Xen. These hypervisors contain hundreds of thousands of lines of unverified code. A single vulnerability in the hypervisor allows an attacker to escape their virtual machine and gain control of the host.

With seL4 verified on AArch64, developers can build a secure partitioner that runs directly on the hardware. The microkernel acts as a minimal hypervisor, isolating guest operating systems like Linux in separate protection domains. Because the isolation is mathematically proven, a vulnerability in a Linux guest cannot compromise the microkernel or other guests on the same system. This architecture is also valuable for edge infrastructure, where devices are deployed in remote locations and are vulnerable to physical or network attacks. By running critical control loops in verified partitions and network stacks in separate, unverified partitions, developers can ensure that a network attack cannot stop the physical operation of the device.

Development Best Practices on seL4

Building systems on seL4 requires following specific development best practices. The microkernel does not provide a standard operating system environment with a shell, file system, or network stack. Instead, it provides only the minimal mechanisms needed to manage memory, threads, and inter-process communication. To build applications, developers use component frameworks.

The two primary frameworks for seL4 are CAmkES and Microkit. Microkit is designed for static, high-performance systems. It allows developers to define a system as a set of protection domains, memory regions, and communication channels using a simple XML file. For AArch64 deployments, Microkit is often the best choice because its simplicity aligns with the verification goals of the microkernel.

When designing a system on seL4, engineers should apply these architectural guidelines:

First, minimize the Trusted Computing Base (TCB). Run device drivers and file systems as separate user-space components with minimal privileges. If a driver crashes, it can be restarted without affecting the system.

Second, use static resource allocation. Runtime memory allocation is a common source of security bugs and complicates formal verification. seL4 requires all resources to be allocated during system initialization.

Third, secure the boot process. Formal verification of the kernel only protects the system after it starts. Developers must use hardware features like secure boot and cryptographic keys to verify the integrity of the seL4 binary before it runs.

Cryptography and Secure Communication

In secure systems, cryptography is used to protect data. Cryptographic code must run in an environment that guarantees its keys cannot be accessed by other processes. By running cryptographic services in dedicated seL4 protection domains on AArch64, developers isolate key material from application code.

Even if an application is compromised, it cannot access the memory of the cryptographic service. The microkernel enforces this boundary using the MMU, and the proofs guarantee that no kernel bug can bypass this protection. This combination of verified isolation and strong cryptography provides a foundation for building secure communication gateways and hardware security modules on ARM hardware.

The Path Forward

The completion of the AArch64 verification is a major milestone, but it is not the end of the road. Work continues on verifying additional hardware platforms and extending the proofs to cover multicore configurations. Currently, the verified version of seL4 on AArch64 runs in single-core mode, which simplifies the verification of memory access. Verifying multicore execution requires modeling concurrent memory access and cache coherence, which is an active area of research.

For now, the verified single-core AArch64 kernel provides a production-ready foundation for high-security systems. It demonstrates that formal verification can scale to modern 64-bit architectures, proving that security does not have to be sacrificed for performance on modern hardware.

DR

Dian Rijal Asyrof

Writes about useful AI tools, programming practice, and the craft of building reliable software.

Previous articleNavigating Browser Voice AI Traps in AEC and getUserMedia ImplementationsNext articleArchitectural Strategies to Prevent Out-Of-Memory Errors in AI Visual Memory Systems
Sel4Formal VerificationAarch64MicrokernelHardware
On this page↓
  1. The Refinement Proof Chain
  2. The AArch64 Hardware Challenge
  3. Capability-Based Access Control
  4. C-to-Isabelle Translation
  5. Memory Barrier Instructions
  6. Proving Security Properties
  7. Infrastructure and Enterprise Deployments
  8. Development Best Practices on seL4
  9. Cryptography and Secure Communication
  10. The Path Forward

On this page

  1. The Refinement Proof Chain
  2. The AArch64 Hardware Challenge
  3. Capability-Based Access Control
  4. C-to-Isabelle Translation
  5. Memory Barrier Instructions
  6. Proving Security Properties
  7. Infrastructure and Enterprise Deployments
  8. Development Best Practices on seL4
  9. Cryptography and Secure Communication
  10. The Path Forward

See also

Illustration for Building Operating System from Assembly with Tumble Forth
Programming/Aug 22, 2026

Building Operating System from Assembly with Tumble Forth

Build OS from assembly. Boot sequence uses tumble forth c compiler on Forth runtime. Write low-level system code. Control hardware.

7 min read
AssemblyForth
Illustration for Bare-Metal Operating System Design with Forth and C Assembly
Programming/Aug 22, 2026

Bare-Metal Operating System Design with Forth and C Assembly

Build minimal OS kernel from bare metal. Use tumble forth c compiler to link Forth paradigm with C code. Write bootable system architecture now.

7 min read
ForthArchitecture
Illustration for How GPUs Process Memory Reads at Hardware Level
Technology/Aug 22, 2026

How GPUs Process Memory Reads at Hardware Level

Master gpu memory read architecture. Track hardware steps, memory controllers, and warp scheduling mechanics when silicon executes read commands.

8 min read
GpusHardware