- OpenBSD-Sicherheitsmerkmale
-
Das Betriebssystem OpenBSD ist für seinen Fokus auf Computersicherheit und die Entwicklung einer Vielzahl von Sicherheitsfunktionen bekannt.
Inhaltsverzeichnis
Programmierschnittstellen und API-Änderungen
Die in der Programmiersprache C gebräuchlichen Zeichenketten-Funktionen strcpy und strcat werden oftmals falsch verwendet, was zu Fehlern und Sicherheitslücken führen kann. Die existierenden Alternativen strncpy und strncat,[1] sind nicht ideal, weswegen die OpenBSD-Entwickler Todd C. Miller und Theo de Raadt die strlcpy- und strlcat-Funktionen erschaffen haben.[2] Diese sind auf höhere Sicherheit ausgerichtet und bieten einen konsistenteren Ersatz für strncat und strncpy. Sie machen es Programmierern schwerer, Puffer unterminiert und damit für Pufferüberläufe verwundbar zu lassen.[3] Diese Funktionen wurden von den Net- und FreeBSD-Projekten übernommen, jedoch nicht für die GNU C Bibliothek akzeptiert. Deren Maintainer Ulrich Drepper widersetzt sich vehement ihrer Integration, mit dem Argument, memcpy sei eine gleichwertige Lösung für die Probleme.[4] Der OpenBSD-Linker wurde geändert, um eine Warnung auszugeben, falls unsichere Funktionen wie strcpy oder strcat verwendet werden. Dies gilt auch für andere Funktionen, die Zeichenketten manipulieren und häufig Probleme verursachen – zum Beispiel sprintf. Alle Vorkommen solcher Funktionen wurden im OpenBSD-Quellcode ersetzt. Außerdem wurde die Richtlinie eingeführt, jedes Auftreten im Paketmanagementsystem zu patchen. Zusätzlich ist in OpenBSD ein statischer Software-Test enthalten, womit versucht wird, andere gebräuchliche Programmierfehler schon bei der Kompilierung zu finden.[5] Weitere vom OpenBSD-Projekt auf Sicherheit hin entwickelte Programmierschnittstellen sind issetugid und arc4random.[6]
Speicherschutz
OpenBSD enthält einige Techniken, die dabei helfen, das Betriebssystem vor Angriffen durch Pufferüberläufe und Überläufen von Integer-Variablen zu schützen.
ProPolice[7] ist eine von Hiroaki Etoh entwickelte Erweiterung des GCC, welche Programme vor Angriffen auf den Stapelspeicher (stack-smashing) durch erweiterten Speicherschutz schützt. Um dies zu ermöglichen, nimmt es eine Reihe von Veränderungen vor: Lokale Stack-Variablen werden neu angeordnet, damit Puffer nach Zeigern platziert werden - dies schützt sie im Falle eines Pufferüberlaufs vor Verfälschung. Zeiger auf Funktionsargumente werden vor lokalen Puffern platziert; ein Canary-Wert wird nach lokalen Puffern gesetzt: Sobald die Funktion endet, kann der Canary benutzt werden, um Pufferüberläufe festzustellen. ProPolice entscheidet automatisch anhand einer Heuristik, welche die Verwundbarkeit eines Puffers analysiert, ob dieser Puffer geschützt wird. ProPolice wurde im Dezember 2002 in den OpenBSD GCC aufgenommen und mit Version 3.3 erstmals verfügbar gemacht. Der Schutz wird seit OpenBSD 3.4 für den Kernel angewandt. Die Erweiterung funktioniert auf allen Architekturen, die von OpenBSD unterstützt werden, und ist standardmäßig aktiviert. Dadurch wird jedes C-Programm ohne Benutzereingriff geschützt.
Im Mai 2004 erhielt OpenBSD auf der Sparc-Architektur weiteren Stapelspeicherschutz durch StackGhost. Dieser hilft mit Funktionen der Sparc Architektur, die Ausnutzung von Pufferüberlaufen zu verhindern.[8] Unterstützung für 64-Bit Sparc wurde im März 2005 hinzugefügt.
In OpenBSD 3.4 wurde W^X (Abkürzung für Writeable xor eXecutable) eingeführt. Dabei handelt es sich um eine Speicherverwaltung, die sicherstellt, dass Speicher entweder nur schreib- oder nur ausführbar ist, jedoch niemals beides. Dies bietet eine zusätzliche Schutzschicht gegen Pufferüberläufe. Obwohl sich dies relativ einfach auf einer Plattform wie amd64 realisieren lässt, die Hardwareunterstützung für das NX Bit bietet, ist OpenBSD eines der wenigen Betriebssysteme, die dies auch auf der gewöhnlichen i386 Architektur unterstützt.
Während der Entwicklungsphase für Version 3.8 wurden Änderungen an der Speicherverwaltungsfunktion malloc vorgenommen. In traditionellen Unix-Betriebssystemen reserviert malloc Speicher, indem es das Unix-Datensegment erweitert. Dieses Vorgehen hat die Realisierung eines starken Schutzes gegen Sicherheitsprobleme erschwert. Die jetzige malloc-Implementierung in OpenBSD benutzt den mmap-Systemaufruf. Dieser wurde modifiziert, um zufällige Speicheradressen zu verwenden und gleichzeitig sicherzustellen, dass zwei Bereiche nicht nebeneinander liegen. Zusätzlich wurde die Reservierung von kleinen Blöcken innerhalb gemeinsamer Bereiche zufällig angeordnet. Die free-Funktion wurde geändert, um Speicher sofort an den Kernel zurückzugeben, anstatt ihn im Prozess abgebildet zu belassen. Eine Vielzahl weiterer optionaler Prüfungen wurde hinzugefügt. Diese Fähigkeiten vereinfachen das Finden von Programmfehlern und machen deren Ausnutzung schwieriger: Anstelle von Speicherverfälschungen oder Ignorieren unautorisierter Zugriffe verursachen Fehler oftmals eine Schutzverletzung (SIGSEGV) - und damit die Beendigung des Prozesses. Dies hat einige Probleme in OpenBSD 3.8 ans Licht gebracht, die zuvor ignoriert worden waren. Speziell Programme, die über den Anfang oder das Ende eines Puffers hinaus lesen, verursachen jetzt Fehler. Dies ohne beachtliche Geschwindigkeitseinbußen zu ermöglichen, benötigte mehr als drei Jahre zur Fertigstellung. Verfolgt werden ähnliche Ziele wie die der Electric Fence-malloc-Bibliothek zur Fehlerbereinigung von Bruce Perens.
Kryptografie und Randomisierung
Eines der Ziele des OpenBSD-Projektes ist es, so viel kryptografische Software und Funktionen wie möglich in das Betriebssystem zu integrieren. Zu diesem Zweck werden eine Menge systemnaher Fähigkeiten zur Verfügung gestellt: Ein starker Pseudozufallszahlengenerator, integrierte kryptografische Hash-Funktionen und -Transformationen und Unterstützung für kryptografische Hardware-Beschleuniger. Diese Fähigkeiten finden auf vielen Ebenen starke Nutzung: Eine ist der von Bruce Schneiers Blowfish-Blockchiffre abgeleitete Passwort-Hash-Algorithmus. Dieser zieht seinen Vorteil aus der langsamen Blowfish-Schlüsselinitialisierung, weswegen Passwortabfragen sehr CPU-lastig und damit Versuche, das Passwort durch Bruteforce zu knacken, schwieriger (weil langsamer) sind. Der Netzwerkprotokollstapel macht starken Gebrauch von Randomisierung, um die Vorhersagbarkeit einiger für Angreifer interessanter Werte zu reduzieren und damit die Sicherheit zu erhöhen. Dies beinhaltet die ISN- und Zeitstempel-Felder sowie die Portnummer flüchtiger TCP-Quellports.[9] OpenBSD enthält auch eine Vielzahl von Funktionen, um die Netzwerkrobustheit und -Verfügbarkeit zu erhöhen. Dies sind unter anderem Gegenmaßnahmen gegen Probleme mit ICMP und Software für Redundanz, zum Beispiel CARP und pfsync. Das Projekt war vermutlich das erste, welches den Klartext-telnet-Daemon zugunsten des verschlüsselnden SSH Daemons deaktivierte und andere kryptografische Softwaremaßnahmen – wie z. B. IPsec und Kerberos – aufnahm.
Sonstige Funktionen
Privilegientrennung, Privilegienwiderrufung, Chroots und zufälliges Laden von Bibliotheken spielen ebenfalls eine wachsende Rolle für die Systemsicherheit. Viele davon wurden in OpenBSD auf gewöhnliche Programme, wie tcpdump und den Apache-Server, angewandt.
Anhang und Quellenangabe
- ↑ Manpages: strncpy und strncat.
- ↑ Manpages: strlcpy und strlcat.
- ↑ Miller, Todd C. und Theo de Raadt. strlcpy and strlcat - consistent, safe, string copy and concatenation. Tagungsberichte der USENIX Annual Technical Conference, 6.-11. Juni, 1999, pp. 175178.
- ↑ Depper, Ulrich. Mail zur libc-alpha: Re: PATCH: safe string copy and concetation(sic), 8. August 2000.
- ↑ Madhavapeddy, Anil. Mail zu openbsd-cvs: CVS: cvs.openbsd.org: src, 6. Juni 2003.
- ↑ Manpages: issetugid und arc4random.
- ↑ ProPolice Webseite: here.
- ↑ Frantzen, Mike und Mike Shuey. StackGhost: Hardware Facilitated Stack Protection. Tagungsberichte des 10. USENIX Security Symposiums, 13.-17. August 2001, pp. 5566.
- ↑ SecurityFocus. Federico Biancuzzi, OpenBSD's network stack, 12. Oktober 2005.
Wikimedia Foundation.