# Kernel page-table isolation

Kernel page-table isolation (kurz KPTI, vormals KAISER) ist ein Workaround für die Meltdown genannte Sicherheitslücke in den x86-Prozessoren von Intel. Dies wird durch eine Trennung zwischen Benutzerspeicher und Kernelspeicher erreicht. KPTI wurde in den Linux-Kernel 4.15 integriert, der für Anfang 2018 erwartet wird, und außerdem auf den Linux-Kernel 4.4.110, 4.9.75 und 4.14.11 zurückportiert. Für Windows und macOS gibt es ähnliche Updates. KPTI schützt nicht vor der Sicherheitslücke Spectre.

## Hintergrund zu KAISER

2014 wurde bei Linux Kernel Address Space Layout Randomization (KASLR) eingeführt, der durch das Verstecken der Kerneladressen vor dem Benutzerspeicher die Ausnutzung anderer Schwachstellen im Kernel erschwert. Trotz der Zugangsverhinderung zu diesen Speicherzuordnungen zum Kernel hat sich die Verwundbarkeit durch einige Seitenkanalattacken bei modernen Prozessoren herausgestellt. Dadurch lässt sich die Adresse des Speichers ausspähen, was eine Umgehung von KASLR bedeutet.
KAISER steht für „Kernel Address Isolation to have Side-channels Efficiently Removed“ und wurde im Juni 2017 veröffentlicht, als Meltdown noch nicht bekannt war. KAISER verbessert KASLR noch weiter. Während KASLR lediglich die Kerneladressen versteckt, verhindert KAISER zusätzlich das Ausspähen von Speicherinhalten des Kernels, und deckt damit die Meltdown-Sicherheitslücke ab.

## Meltdown und KPTI

Im Januar 2018 wurde die Sicherheitslücke Meltdown veröffentlicht, die hauptsächlich Intel-x86-Prozessoren betrifft. Forscher hatten im Sommer herausgefunden, dass auch der Speicherinhalt des Kernelspeichers ausgespäht werden kann, nicht nur die Speicherzuordnungen, wie ursprünglich gedacht. Daraufhin wurden die KAISER-Patches zur Behebung dieses Fehlers umgewidmet (und zu KPTI umbenannt).
AMD-x86-Prozessoren sind nicht von Meltdown betroffen und benötigen daher auch keinen Workaround. Allerdings sind AMD-Prozessoren dennoch anfällig für die Umgehung von KASLR, falls KPTI nicht aktiv ist.
KPTI basiert auf KAISER. Ohne aktive KPTI würde Linux bei jeder Ausführung von Code im Benutzerspeicher (Anwendungen) auch seinen gesamten Kernelspeicher in Seitentabellen verwalten, wenngleich zugriffsgeschützt. Der Vorteil hierbei ist die ständige Verfügbarkeit der Seitentabellen, falls eine Anwendung einen Kernel-Systemaufruf macht oder ein Interrupt ausgelöst wird. Hierdurch kann ein durch Kontextwechsel entstehender Overhead (Leerung des Übersetzungspuffers, Seitentabellen-Swapping usw.) meist vermieden werden.

## Umsetzung

KPTI behebt die Möglichkeit der Ausspähung durch die vollständige Trennung der Seitentabellen des Benutzer- und Kernelbereichs. Auf Prozessoren, die PCID (process-context identifiers) unterstützen, kann ein Leeren des Übersetzungspuffers vermieden werden, aber auch dann kommt es zu signifikanten Leistungseinbußen, insbesondere bei häufigen Systemaufrufen oder Interrupts.
Der Overhead wurde von den damaligen KAISER-Entwicklern mit 0,28 % bemessen; ein Linux-Entwickler bemaß ihn mit etwa 5 % für die meisten Anwendungsfälle und bis zu 30 % in manchen Fällen, trotz der PCID-Optimierung; für das Datenbankmanagementsystem PostgreSQL waren die Auswirkungen bei Nur-Lese-Tests auf einem Intel-Skylake-Prozessor 7–17 % (oder 16–23 % ohne PCID), während ein voller Benchmark 13–19 % verlor (Coffee Lake vs. Broadwell-E). Redis wurde um 6–7 % verlangsamt.
Unter Betriebssystemen wie Linux kann durch einen Kernel-Parameter im Bootmanager festgelegt werden, ob KPTI aktiviert werden soll oder nicht. Bei manchen Kernel-Version ist dies auch während des Betriebs möglich. Damit können die Auswirkungen durch die Leistungsreduktion im eigenen Anwendungsbereich und Hardware selbst bestimmt und bewertet und je nach Situation entschieden werden, ob KPTI angewendet werden soll oder nicht.