Login
Newsletter
Werbung

Mo, 22. Juli 2019, 09:34

Software::Kernel

Sicherheitsverbesserungen im Linux-Kernel 5.2

Die am 7. Juli freigegebene neue Version 5.2 von Linux enthält neben den bereits anderweitig genannten Änderungen auch weitere Maßnahmen zur Erhöhung der Sicherheit. Kees Cook erläutert sie im Detail.

Larry Ewing

Kees Cook ist seit 2011 bei Google und arbeitet dort an der Sicherheit von Chrome OS. Außerdem arbeitet er zusammen mit anderen daran, weitere vorbeugende Sicherheitsmaßnahmen in den Linux-Kernel zu integrieren. Einige der Maßnahmen stammen aus der Chrome OS- und Android-Entwicklung von Google, andere von Grsecurity und von weiteren Personen. Für jede Linux-Version veröffentlicht Cook eine Zusammenfassung der Neuerungen in diesem Bereich.

Linux 5.2 ist am 7. Juli erschienen. Kees Cook erläutert in seinem neuen Beitrag, was sich bezüglich der Sicherheit im neuen Kernel getan hat. Eine vorbeugende Maßnahme ist die Vergabe von zufälligen Adressen. Sie macht es für Schadsoftware unmöglich, bereits im Voraus die Adresse von bestimmten Daten zu kennen. Für die Allokatoren SLUB und SLAB wurde bereits in Linux 4.7 eine Randomisierung der Listen freier Blöcke implementiert. Beim übergeordneten Seitenallokator gab es das bisher nicht. Eine Änderung von Dan Williams macht das jetzt möglich, allerdings nur mit einer Granularität von 4 MB. Die Änderung stammt aus dem Supercomputer-Bereich, wo sie teils schon länger verwendet wird. Um sie im Kernel zu aktivieren, muss man den Kernel mit CONFIG_SHUFFLE_PAGE_ALLOCATOR compilieren und als Boot-Argument page_alloc.shuffle=1 angeben, außer in speziellen Fällen. Dass die Änderung nicht generell aktiviert ist, liegt daran, dass sie zwar die Geschwindigkeit gleichmäßiger macht, aber nicht generell schneller. Einige Anwendungen laufen etwas schneller, während andere in den bisherigen Tests eine Verlangsamung zeigten.

Wenn man den Kernel mit Clang compiliert, kann man jetzt auch Stack-Variablen initialisieren lassen. Bei GCC gibt es ein Plugin für dieselbe Aufgabe. Es gibt aber Unterschiede zwischen beiden Compilern, so deckt Clang mehr Fälle ab und initialisiert mit einem Bitmuster (0xAA) statt mit 0. Durch die Initialisierung werden alle potentielle Fehler mit uninitialisierten Variablen eliminiert.

Wie SMAP auf x86 und PAN auf ARM gibt es nun auch auf Power einen Mechanismus, der verhindert, dass der Kernel auf Adressen außerhalb des Kernels zugreift, außer es handelt sich um einen expliziten Datenaustausch mit einem Anwenderprozess. Der Mechanismus heißt Kernel Userspace Access Prevention (KUAP), ist die Fortsetzung von KUEP und benutzt ein Prozessorregister namens AMR. Er ist standardmäßig eingeschaltet.

Eine neue Kommandozeilenoption mitigations= vereinfacht die Kontrolle, welche Maßnahmen gegen Spectre-Lücken aktiviert werden sollen. Denn die Zahl dieser Lücken wird immer unübersichtlicher. Vor kurzem kamen weitere Lücken ans Licht, die unter Microarchitectural Data Sampling (MDS) zusammengefasst wurden. Auch gegen diese Lücken wurden Gegenmaßnahmen implementiert.

Der userfaultfd-Daemon konnte von Angreifern dazu genutzt werden, einen Kernel-Thread bei einem Speicherzugriff zu blockieren. Ein ähnliches Problem existierte bei FUSE, wo man es durch Zugriffsrechte unterbinden kann. Für userfaultfd wurde jetzt ebenfalls ein Schalter eingeführt, der den userfaultfd-Systemaufruf für unprivilegierte Benutzer sperrt. Eine weitere Sicherheitsmaßnahme für x86-Systeme betrifft den selbstmodifizierenden Code im Kernel, beispielsweise das Einfügen von Trace-Punkten.

Die case-Anweisung in C hat die Eigenheit, dass das Ende jedes Falles mit einer break-Anweisung abgeschlossen werden kann, aber nicht muss. Programmierer können dies in cleverer Weise nutzen, um ein paar Bytes Code zu sparen - heutzutage ist die Ersparnis fraglich, da der Compiler den Code eventuell selbst besser anordnen kann. Die meisten Fälle, in denen das break fehlt, sind allerdings schlichtweg Fehler, wo die Anweisung vergessen wurde. Die Compiler-Option -Wimplicit fall-through kann alle diese Fälle finden. Um allerdings keine falschen Warnungen zu erhalten, muss der Kernel von allen Stellen gesäubert werden, wo das break bewusst weggelassen wurde. Hierbei wurden tatsächlich eine Reihe von Fehlern gefunden. Diese Arbeit ist nun so gut wie vollständig und vermutlich kann die Compiler-Option -Wimplicit fall-through in Linux 5.3 aktiviert werden.

Werbung
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung