  The Linux kernel makes considerable use of Berkeley Packet Filter (BPF) to
allow user-written BPF applications to execute in the kernel space. BPF employs
a verifier to statically check the security of user-supplied BPF code. Recent
attacks show that BPF programs can evade security checks and gain unauthorized
access to kernel memory, indicating that the verification process is not
flawless. In this paper, we present MOAT, a system that isolates potentially
malicious BPF programs using Intel Memory Protection Keys (MPK). Enforcing BPF
program isolation with MPK is not straightforward; MOAT is carefully designed
to alleviate technical obstacles, such as limited hardware keys and supporting
a wide variety of kernel BPF helper functions. We have implemented MOAT in a
prototype kernel module, and our evaluation shows that MOAT delivers low-cost
isolation of BPF programs under various real-world usage scenarios, such as the
isolation of a packet-forwarding BPF program for the memcached database with an
average throughput loss of 6%.
