Long-Term-Release Linux 5.10: Die wichtigsten Neuerungen im Überblick

Der neue Kernel sichert virtuelle Umgebungen besser ab, rüstet sich mit Memory-Tagging auf ARM64 und bietet eine "sleepable"-Markierung für BPF-Programme.

In Pocket speichern vorlesen Druckansicht 146 Kommentare lesen

(Bild: Wikimedia Commons / Ben Tubby / CC BY 2.0)

Lesezeit: 10 Min.
Von
  • Oliver Müller
Inhaltsverzeichnis

Vorletzten Sonntag gab Linus Torvalds das letzte Release des Linux-Kernels für dieses Jahr frei. Der neue Kernel 5.10 erfährt Long Term Support (LTS) und erhält somit mindestens für die nächsten zwei Jahre noch Patches.

Aktuell gibt kernel.org als "End of Life" (EOL) Dezember 2022 an. In der Regel geht die Wartungsperiode für LTS-Kernel jedoch für bis zu fünf oder sechs Jahre in die Verlängerung – so wurde etwa der Supportzeitraum für die Ausgaben 4.19 und 5.4 im Sommer von zwei auf sechs Jahre ausgedehnt.

Linux 5.10 übertrifft in der Anzahl von Changesets seinen Vorgänger Linux 5.9, bleibt aber leicht hinter dem aktuellen Rekordhalter Linux 5.8 zurück. "Rekordverdächtig" (im Hinblick auf die Geschwindigkeit) ist allerdings das keine 24 Stunden nach dem Release von 5.10 nachgeschobene erste Point-Release. Linux 5.10.1 hatte Greg Kroah-Hartman wegen zwei Fehlern freigeben, die das Storage-System und damit eine kritische Komponente betrafen.

Der erste in 5.10.1 enthaltene Fix nimmt einen Reparaturversuch für den Device Mapper zurück: Hier war ursprünglich versucht worden, Probleme bei der Obergrenze des RAID DISCARD für RAID 1 und RAID 10 zu beheben. Welche Auswirkungen dieser misslungene Korrekturversuch hat, ist aktuell noch nicht dokumentiert. Der Commit zum Fix enthält lediglich den Kommentar: "It causes problems :(."

Der zweite Fix in 5.10.1 betrifft den MD (Multiple Devices)-Code: In 5.10 ohne den Fix kann es beim Mounten von RAID6-Setups zu erheblichen Problemen nebst Datenverlust kommen. Anwender von 5.10 sollten daher rasch auf 5.10.1 wechseln. Weitere Korrekturen oder Neuerungen umfasst 5.10.1 nicht.

Mit Linux 5.10 hält die "ARMv8.5 Memory Tagging Extension" (ARMv8.5 MTE) auf ARM64 Einzug in den Kernel. Sie hängt an Zeiger (Pointer) einen Schlüssel an, um automatisch die (Prozess-)Zugehörigkeit eines Zeigers zu markieren und zu erkennen. Auf diese Weise soll Code künftig sicherer und insbesondere Angreifern das Leben erschwert werden. Zudem will man typische Memory-Bugs im Keim ersticken.

Die ARM64-Architektur ist für 64-Bit-Zeiger ausgelegt. Aktuell verwenden Systeme aber nur 48 Bits oder 52 Bits, sofern die "Large Address Option" aktiviert ist. Für das Verwenden aller verfügbaren 64 Bits besteht aktuell (noch) kein Bedarf. Zudem gestatten es ARM-Prozessoren über ein spezielles Feature, das oberste Byte einer virtuellen Adresse zu ignorieren (top byte ignore). Daher entstanden diverse Erweiterungen für diese ungenutzten Bits. Ein prominenter Vertreter ist die "ARM Pointer Authentication", die kryptographische Schlüssel im obersten Byte zur Authentisierung von Zeigern nutzt. Mit MTE kommt nun noch eine Erweiterung in Linux hinzu.

Die MTE nutzt das untere Nibble (die unteren vier Bits) des oberen Bytes der virtuellen Adresse. Es lässt sich damit einem oder mehreren Speicherbereichen eine Markierung zuweisen. Wird ein Zeiger dereferenziert, vergleicht das System die Markierung des Zeigers mit der des Speicherbereichs, auf den der Zeiger verweist. Sind die beiden Markierungen nicht identisch, löst die CPU einen so genannten Trap aus: Der unerlaubte Zugriff wird unterbunden.

Vier Bits erscheinen nicht viel, lassen sich damit doch "nur" 16 Markierungen verwalten. In der Praxis ist das meist schon ausreichend, um effektive Schutzfunktionen zu implementieren. Mit Speicherverwaltungsroutinen wie malloc() und free() können so auf einfache Weise bestehende Anwendungen um Schutzmechanismen erweitert werden. Beispielsweise lassen sich Use-After-Free-Bugs und Buffer-Overflow-Angriffe verhindern oder zumindest erschweren. malloc() setzt passende Markierungen und versucht zumindest über eine Rotation der Marken verschiedene Stack-Frames unterschiedlich zu markieren. Damit schottet das System diese innerhalb einer Anwendung gegeneinander ab.

Gibt das System Speicher über free() frei, kann dieser freie Speicher mit einer speziellen Marke versehen werden. Damit ist dieser explizit als "frei gegeben" markiert. Will die Anwendung infolge eines Bugs oder aufgrund eines Angriffs diesen Speicher lesen, stimmen die Marker des Zeigers und des Speicherbereichs nicht überein. Das System löst einen Trap infolge einer Use-After-Free-Situation aus.

Die Markierungen kann entweder die Anwendung selbst oder die CPU verwalten. Setzen lassen sich die Marken dabei jeweils auf 16-Byte-Speicherblöcke. MTE ist dabei zunächst auf allen Linux-Systemen deaktiviert. Die Extension lässt sich aus der Anwendung heraus über das PROT_MTE-Flag von mmap() oder über mprotect() aktivieren; eine entsprechende ARM64-CPU vorausgesetzt. PROT_MTE ist allerdings nur auf anonymem Memory gültig. File-Backed Memory wird nicht unterstützt.

Aktuell ist MTE auf den Userspace begrenzt. Der Kernel selbst nutzt das Feature noch nicht. Support für den Kernelspace ist für Linux 5.11 geplant. Mit der "ARM Pointer Authentication" steht MTE im Übrigen nicht in Konflikt. Obwohl beide Erweiterungen das obere Byte der virtuellen Adresse nutzen, können beide gleichzeitig im Einsatz sein. Durch die vier Bits, die MTE vom oberen Byte "abgräbt", verkürzen sich die kryptographischen Signaturen der Pointer-Authentication. Die kann jedoch grundsätzlich auch mit den verkürzten Signaturen arbeiten.