OpenBSD 6.5 mit neuem Stack-Protector

Das Team um Theo de Raadt hat Version 6.5 des auf Sicherheit ausgelegten OpenBSD freigegeben. Das neue RETGUARD schützt ARM64 und amd64 vor ROP-Angriffen.

In Pocket speichern vorlesen Druckansicht 26 Kommentare lesen
Open Source, Open Access, Open Innovation, Allmende, Coypright, Urheberrecht

(Bild: EFKS, shutterstock.com)

Lesezeit: 5 Min.
Von
  • Michael Plura
Inhaltsverzeichnis

Die inzwischen 46. Release des auf Sicherheit ausgelegten OpenBSD bringt neben vielen Verbesserungen gegenüber der Vorversion einige besondere Neuerungen: Der standardmäßige Linker für i386 und amd64 ist nun LLD. Darüber hinaus enthält Version 6.5 des Betriebssystems einen Radeon Mesa-Treiber für Southern Island and Sea Island-GPUs und bietet mit pvclock(4) endlich eine stabil synchronisierte Systemuhr in KVM-Umgebungen.

Traditionell bekommt jede OpenBSD-Release ein eigenes Logo.

(Bild: OpenBSD.org)

Es gibt einen neuen Treiber für Ethernet-Adapter aus Intels 700-Serie, der Bereich WLAN hat wiederum viele Verbesserungen erhalten. Die halbjährlichen Upgrades von OpenBSD dürften in Zukunft automatisch durchzuführen sein, da die Arbeit an einem /bsd.upgrade-Kernel begonnen hat. Das System soll diesen Kernel starten, falls er vorhanden ist. Die Sicherheitsfunktionen unveil(2) und pledge(2) haben die Entwickler stark erweitert, Letzteres erweiterten sie um die Zugriffsklasse "video". Ebenso haben sie einen lästigen Fehler beim Start des Xorg-Servers mit SETUID behoben und mit OpenRSYNC einen sicheren Ersatz für den rsync-Befehl ins Leben gerufen. Mit unwind(8) bietet OpenBSD einen zusätzlichen lokalen DNS Resolver, der mit wechselnden und bei fehlerhaften DNS-Servern helfen soll.

W^X bedeutet, dass ein Speicherbereich entweder schreibbar ist (W, Daten) oder ausführbaren Programmcode enthält (X, Code) – eine Mischung gibt es nicht. Dank W^X kann ein Angreifer also nicht mehr als Daten getarnten Schadcode auf ein entferntes System hochladen und ausführen. Eine neue Methode sucht daher in bestehendem Code nach Fragmenten, aus denen ein Angreifer seine Schadroutinen gleich einer Patchwork-Decke zusammenstoppelt (ROP, Return Oriented Programming). Der Trick dabei: Das Codefragment muss mit einem Return-Befehl enden, um so zurück zum Rest des Schadcodes zu springen. Der x86/amd64 kennt vier Return-Befehle (RET), deren Byte-Darstellung C2, C3, CA und CB lauten – wobei C3 (RET (near)) der nützlichste ist.

Der Angreifer durchsucht vorhandenen Programmcode auf dem angegriffenen System nach "C3" und analysiert "rückwarts" den Teil, der vor dem C3-Befehl steht, auf seinen Nutzen. Perfide dabei ist, dass der originale Code die benötigte Funktion gar nicht direkt enthalten muss, wie folgendes Beispiel zeigt:

83 e3 01	andl $1, %ebx
01 c3 addl %eax, %ebx

Fünf Bytes bilden zwei Befehle ab, das C3 am Ende der zweiten Zeile hat aber nicht die Bedeutung RET, sondern ist Teil des Zwei-Byte-Befehls addl. Der Angreifer springt nun aber nicht auf die 83, sondern die 01 am Ende des ersten Befehls. Der Prozessor sieht nun statt der obigen Codesequenz diese Befehle und interpretiert sie anders:

01 01	 add dword ptr [rcx], eax
c3 ret

Aus vielen dieser kleinen Fragmente lässt sich – auch wenn es kompliziert ist – neuer (Schad-)code aus bestehendem Code zusammenbasteln.

Todd Mortimer hat bereits auf der EuroBSD 2018 in einem Vortrag eine Lösung vorgestellt, die Theo de Raadt anfangs als kaum realisierbar abtat. Mortimers Idee: Man weist den CLANG-Compiler einfach an, Code ohne jegliche C3 zu produzieren. Das ist leider unmöglich, da C3 beispielsweise auch Teil von Daten sein kann. Die Lösung besteht darin, den Code vor dem C3 auf seine Nutzbarkeit zu verifizieren und notfalls zu modifizieren. Unbrauchbarer Code mit einem folgenden C3 ist ungefährlich. Ebenso hat Mortimer herausgefunden, dass ein CC (INT3-Befehl, genutzt für Debugger) direkt vor dem C3 das Problem ebenfalls entschärft.

Zwar ist Mortimers Methode keine absolute Lösung, sie reduziert jedoch die Anzahl der möglichen ROPs massiv. Der Kernel von OpenBSD 6.3/arm64 enthielt noch 69935 ROPs, der mit Mortimers RETGUARD geschützte Kernel von OpenBSD 6.4/arm64-beta gerade noch 46 – damit dürfte auch ein genialer Hacker keinen sinnvollen Code zusammenbekommen. Die Kosten für das Mehr an Sicherheit sind vernachlässigbar: etwa 2% weniger Performance und ein um 7% vergrößerter Code. In OpenBSD 6.5 ersetzt RETGUARD den bisherigen Stack Protector. Wer den Code auf seinem System nach ROP-Gadgets durchsuchen möchte, kann dies mit einem Python-Skript von Jonathan Salwan machen.

OpenBSD 6.5 nutzt das vor wenigen Tagen fertiggestellte OpenSSH 8.0. Die Liste der neuen Funktionen und Bugfixes ist lang, sodass im bestehenden Betrieb mit Problemen zu rechnen ist. Vor allem scp(1) und sein Protokoll gelten als schlecht designed und führen unter anderem zu einem Sicherheitsproblem: CVE-2019-6111 zeigt auf, dass nicht überprüft wird, ob die vom Server gesendeten Dateien tatsächlich denen entsprechen, die der scp-Client angefordert hat. Ein bösartiger Server kann so Dateien auf dem Client überschreiben. OpenSSH 8.0 verwirft auch die "host/port"-Syntax mit dem Schrägstrich, die 2001 für IPv6 eingeführt wurde und mit der CIDR-Notation kollidieren kann.

Das Change-Log listet detailliert auf, was sich in OpenBSD 6.5 geändert hat. Das freie Betriebssystem steht ab sofort für zehn Hardware-Architekturen auf den Spiegeln des Projektes zum Download bereit. (avr)