Tutorial: 11:45-13:15 (English)

MirageOS: building minimized special-purpose unikernels

How to develop secure and type-safe MirageOS unikernels

Unikernels are specialized services, where the runtime binary (process, virtual machine) only contains the necessary libraries. This reduces the attack surface drastically (around two orders of magnitude). MirageOS is a unikernel project that uses OCaml, which also reduces the attack vectors (memory safety, type safety). MirageOS does not contain any process management, neither virtual memory – the entire unikernel is executed in single address space. The cooperative multitasking library lwt is used at the base.

MirageOS can be deployed to various modern hypervisors: Xen, Linux KVM, FreeBSD BHyve, OpenBSD VMM, virtio, as well as to the Genode microkernel-based operating system framework and the separation kernel Muen. It can also be run as a unix process with rather restrictive seccomp filters (less than 10 syscalls needed). It runs on X86-64, ARM64 (Raspberry PI), ESP32; RISC-V support is along its way.

Apart from core Internet Protocols (TCP/IP, DHCP, DNS, HTTP), security protocols (TLS, OpenPGP, OTR), and branchable distributed storage (implementing the git protocol) for persistency, several applications are work-in-progress:

  • Calendar and address book (CalDAV/CardDAV) storing data in a remote git repository
  • EMail (MIME encoding/decoding, SMTP, IMAP)
  • Firewall
  • VPN Gateway

In this tutorial, first I’ll briefly introduce the benefits of MirageOS and the programming environment - the mirage command line utility takes care of target-specific dependency, initialization order, etc. by generating code. Afterwards, we’ll dig deep down further examples.

Further information:

Preparation

You can follow the tutorial on a Linux, FreeBSD, OpenBSD, or macOS box. You won’t need a hypervisor to follow the tutorial, but will be able to utilize Linux KVM during the tutorial.

You will need the OCaml package manager, opam. To prepare:

  • install opam >= 2.0.0
  • run opam init and follow the instructions
  • make sure you have OCaml >= 4.06.0 by running ocaml
  • install MirageOS with opam install mirage

For testing purposes, the mirage-skeleton repository hosts various example unikernels. Clone that and do a

mirage configure ; make depend ; make

in any of the subdirectories, and you should end up with a ./main.native (use mirage configure -t hvt to produce an unikernel image that runs on KVM).

Hannes Mehnert

Hannes Mehnert researches in several engineering areas: from programming languages (such as compiler optimisation visualisation, type systems) over full functional correctness proofs of object-oriented code, the topic of his PhD dissertation, development environments for dependently typed languages, to network protocols (TCP/IP) and security protocols (TLS, OTR).

In his spare time, Hannes is not only a hacker, coauthor of a book on indian cuisine and functional programming in JavaScript, but also a barista and likes to travel and repair his recumbent bicycle.

Since beginning of 2018, Hannes works on a non-profit to put MirageOS into production at robur. He used to be a postdoc at University of Cambridge working with the semantics, systems, and security group.