Muen

An x86/64 Separation Kernel for High Assurance

Checkout source code
This page is served by a MirageOS/Solo5 unikernel running on Muen

Overview

Muen is an Open Source separation kernel (SK) for the Intel x86/64 architecture that has been formally proven to contain no runtime errors at the source code level. It is developed in Switzerland by codelabs GmbH. Muen was designed specifically to meet the challenging requirements of high-assurance systems on the Intel x86/64 platform. To ensure Muen is suitable for highly critical systems and advanced national security platforms, codelabs closely cooperates with the high-security specialist secunet Security Networks AG in Germany.

Example Architecture

A separation kernel is a specialized microkernel that provides an execution environment for components that exclusively communicate according to a given security policy and are otherwise strictly isolated from each other. The covert channel problem, largely ignored by other platforms, is addressed explicitly by these kernels. SKs are generally more static and smaller than dynamic microkernels, which minimizes the possibility of kernel failure, enables the application of formal verification techniques and the mitigation of covert channels.

Muen uses Intel’s hardware-assisted virtualization technology VT-x as core mechanism to separate components. The kernel executes in VMX root mode, while user components, so called subjects, run in VMX non-root mode. Hardware passthrough is realized using Intel’s VT-d DMA and interrupt remapping technology. This enables the secure assignment of PCI devices to subjects.

Muen is under active development and verification of kernel properties is ongoing.

Features

Kernel

The following list outlines the most-prominent features of the Muen kernel:

  • Minimal SK for the Intel x86/64 architecture written in SPARK 2014

  • Full availability of source code and documentation

  • Proof of absence of runtime errors

  • Multicore support

  • Nested paging (EPT) and memory typing (PAT)

  • Fixed cyclic scheduling using Intel VMX preemption timer

  • Static assignment of resources according to system policy

  • PCI device passthrough using Intel VT-d (DMAR and IR)

  • PCI config space emulation

  • Support for Message Signaled Interrupts (MSI)

  • Minimal Zero-Footprint Run-Time (RTS)

  • Event mechanism

  • Shared memory channels for inter-subject communication

  • Crash Audit

  • Support for 64-bit native and 32/64-bit VM subjects

    • Native 64-bit Ada subjects

    • Native 64-bit SPARK 2014 subjects

    • Linux 32/64-bit VMs

    • SMP for Linux VMs

    • MirageOS unikernels [mirageos]

Tau0

Tau0 (τ₀) is the Muen System Composer. In its current static mode of operation, the task of Tau0 is to compose a system image while making sure that certain invariants are not violated. The Tau0 concept is a mechanism to gradually increase the flexibility of component-based systems running on top of Muen, while keeping a high level of assurance regarding the correctness of isolation enforcement. Read more about Tau0 here.

Components

The Muen platform includes re-usable components which implement common services:

  • AHCI (SATA) driver subject written in SPARK 2014

  • Device Manager (DM) written in SPARK 2014

  • Subject Monitor (SM) written in SPARK 2014

  • Subject Loader (SL) written in SPARK 2014

  • Subject Lifecycle Controller written in SPARK 2014

  • Timeserver subject written in SPARK 2014

  • Debugserver subject written in Ada 2012

  • PS/2 driver subject written in Ada 2012

  • Virtual Terminal (VT) subject written in Ada 2012

Furthermore the [muenfs], [muennet] and [muenblock] Linux kernel modules provide virtual filesystem, network interface and block I/O drivers based on inter-subject memory channels.

Toolchain

The Muen platform includes a versatile toolchain which facilitates the specification and construction of component-based systems in different application domains.

The [mugenhwcfg] tool for automated hardware description generation simplifies the addition of support for new target machines. There is also a Debian Live-based bootable image [mugenhwcfg-live] with persistence to simplify the collection of hardware configurations from new targets.

Resources

Documentation

The following detailed project documentation is available:

Mailing list

The muen-dev@googlegroups.com mailing list is used for project announcements and discussions regarding the Muen separation kernel.

Download

The Muen sources are available through the following git repository:

$ git clone --recursive https://git.codelabs.ch/git/muen.git

A browsable version of the repository is available here:

A ZIP archive of the current Muen sources can be downloaded here:

The ZIP archive cannot be used to build the example system since it does not contain all sub-projects.

Build

Environment

The Muen SK has been developed and successfully tested using the development environment listed in the following table.

Operating systems

Debian GNU/Linux 11 x86_64
Ubuntu 20.04 x86_64
Ubuntu 22.04 x86_64

Linux kernel/KVM

>= 5.2.0 with GUEST_CR3 fix [lnxcr3]

Ada compiler

GNAT FSF 12.2

GCC version

gcc (GCC) 12.2

SPARK version

12.1

Emulator

qemu-system-x86_64 (>= 3.1.0)

Intel AMT SoL client

amtterm (>= commit 0ece513…​)

Intel vPro AMT / WSMan

amtc (github.com/schnoddelbotz/amtc)

The following hardware is used for the development of Muen. There is a good chance similar hardware works out-of-the box if the microarchitecture is Ivy Bridge or newer.

iBASE MI995VF-X27

Coffee Lake

Xeon E-2176M

Lenovo ThinkPad T480s

Kaby Lake

i7-8650U

Lenovo ThinkPad X260

Skylake

i7-6500U

Intel NUC 6i7KYK

Skylake

i7-6770HQ

UP2 maker board

Apollo Lake

Atom E3950

Intel NUC 6CAYH

Apollo Lake

Celeron J3455

Intel NUC 5i5MYHE

Broadwell

i5-5300U

Cirrus7 Nimbus

Haswell

i7-4765T

Lenovo ThinkPad T440s

Haswell

i7-4600U

Lenovo ThinkPad T430s

Ivy Bridge

i7-3520M

Kontron Technology KTQM77/mITX

Ivy Bridge

i7-3610QE

The first step to build Muen is to install the required packages. See the tools/docker/Dockerfile.muen-dev-env file in the project repository for the current list of required packages:

acpica-tools amtterm autoconf automake autopoint bc bison bzip2 \
ca-certificates ccache cpio curl file flex git-core gnupg inotify-tools \
iputils-ping kmod lcov libc6-dev libcurl4-gnutls-dev libelf-dev \
libfreetype6-dev libgmp10-dev libiberty-dev libncurses-dev libseccomp-dev \
libssl-dev libxml2-utils lighttpd make mtools openssh-client patch picocom \
pkg-config python3-minimal python3-lxml python3-colorlog python3-setuptools \
python3-pip qemu-system-x86 rsync screen tidy unzip vim wget xfonts-unifont \
xorriso xsltproc xz-utils zlib1g-dev

Muen is built using a GNAT FSF toolchain provided via [alire], see the project’s website about instructions on how to install the alr command-line tool for your distribution. Then clone and build the Muen meta crate for alire, which takes care of installing and configuring the toolchain:

$ git clone https://git.codelabs.ch/alire/muen-dev-env.git
$ cd muen-dev-env
$ make
$ . env

Docker

There is also a ready-made Docker image which contains all necessary tools for Muen development. You can install it using the following command:

$ docker pull ghcr.io/codelabs-ch/muen-dev-env

Compilation

To build the Muen tools, RTS, kernel and example components change to the Muen source directory and issue the following command:

$ make

This will create a bootable ISO image containing the example system. See below for deployment instructions.

The following command gives a short description of the top-level Makefile targets:

$ make help

Deploy

The build system provides two ways to instantly deploy and test the created system image.

Emulation

To ease kernel development and testing, the Muen project makes use of nested virtualization provided by QEMU/KVM. In order for this to work, a Linux kernel (>= 5.2.0) with applied KVM GUEST_CR3 fix [lnxcr3] and the qemu-system-x86_64 binary must be installed on the build machine.

Issue the following command in the Muen project directory to start the nested virtualization of a Muen system:

$ make emulate

The system serial output is written to emulate/serial.out. Follow the on-screen instructions on how to connect to the QEMU curses console or how to SSH into the NIC Linux guest VM.

As the virtual terminal (VT) over curses is timing sensitive and QEMU/KVM cannot guarantee tick-exact timing depending on the host CPU and system load, this console is just an emergency console. Use SSH to interact with the booted Muen system.

Hardware

The top-level Makefile provides two convenient targets to deploy Muen to real hardware: iso and deploy. The first creates a bootable ISO image which can be burned on a CD-ROM or dumped on a USB stick, the second uses network boot to shorten round-trips during development.

USB Stick

To create a bootable USB stick containing the Muen system, enter the following commands in the top-level directory:

$ make HARDWARE=hardware/lenovo-t440s.xml SYSTEM=xml/demo_system_vtd.xml iso

Then follow the instructions on the screen.

Network Boot

For fast deployment of the Muen system image to real hardware, the iPXE [ipxe] boot firmware installed on a USB stick in conjunction with Intel Active Management Technology (AMT) is used. Please refer to the amtterm [amt] documentation on how to configure AMT on the target hardware.

To build and install iPXE with the Muen specific boot script issue the following commands:

$ sudo apt-get install liblzma-dev
$ git clone git://git.ipxe.org/ipxe.git
$ wget https://muen.sk/muen.ipxe
$ cd ipxe/src
$ make bin/ipxe.usb EMBED=../../muen.ipxe
$ sudo dd if=bin/ipxe.usb of=/dev/sdX

The /dev/sdX device is the USB stick (e.g. /dev/sdc, without partition number). All existing data will be erased.

When booting from the created stick the first NIC (net0) is configured as follows:

IP Address : 192.168.254.2
Netmask    : 255.255.255.0
Gateway    : 192.168.254.1

After initialization of the network adapter iPXE tries to download and chainload the iPXE configuration from the following URL:

http://192.168.254.1:8000/boot.cfg

The development machine must be connected to the target hardware via an interface with IP address 192.168.254.1. To actually serve the created system image to the bootloader, issue the following command in the top-level Muen directory:

$ export AMT_PASSWORD=<your AMT password>
$ make deploy

To view the output of the Muen kernel debug console use the command:

$ amtterm 192.168.254.2

If your hardware differs from the default configuration, additionally specify the HARDWARE variable:

$ make deploy HARDWARE=hardware/intel-nuc-dc53427hye.xml

References

License

Copyright (C) 2013-2023  Reto Buerki <reet@codelabs.ch>
Copyright (C) 2013-2023  Adrian-Ken Rueegsegger <ken@codelabs.ch>

This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.