OpenBSD-Sicherheitsmerkmale

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Das Betriebssystem OpenBSD ist für seinen Fokus auf Computersicherheit und die Entwicklung einer Vielzahl von Sicherheitsfunktionen bekannt.

Programmierschnittstellen und API-Änderungen[Bearbeiten]

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 Paketverwaltungssystem 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[Bearbeiten]

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.

Der OpenBSD 3.8 Anmeldebildschirm

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[Bearbeiten]

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.

Netzwerk und Server[Bearbeiten]

Packet Filter[Bearbeiten]

OpenBSD besitzt eine eigene Firewall-Lösung namens Packet Filter (kurz PF), die neben den Funktionen einer normalen Firewall auch erweiterte Sicherheitsmerkmale besitzt, z.B. eine antispoof-Regel, die Pakete darauf überprüft, ob die angegebene Absender-IP-Adresse logisch ist (mit der Netzwerkschnittstelle des Eintreffens übereinstimmt), oder das Packet Scrubbing, das TCP-Pakete mit ungültigen Flagkombinationen (z.B. SYN + FIN) verwirft, fragmentierte Pakete korrigiert und Pakete, die den Host eventuell zum Absturz bringen können, abfängt.

Außerdem lässt sich PF mit (im Vergleich zu iptables) einfach zu lesenden Regeln konfigurieren:

(pass|block [drop|return|return-icmp|return-icmp6|return-rst]|match) [in|out] [log] [quick]
[on <interface>] [on rdomain <number>] [inet|inet6] [proto (tcp|udp|icmp|icmp6)]
([from <src> [port <src>][os <src>]|to <dest> [port <dest>]]|all) [flags <a>/<b>]
[icmp-type <type> code <ode>|icmp6-type <type> code <code>] [probability <number>] [user <user>]
[nat-to <src>|rdr-to <dst>]

Die folgenden Regeln blockieren alle Pakete von Hosts, die keine Mails einliefern dürfen, und erlauben es für alle anderen:

blockiert = { 223.33.14.23, 34.12.34.0/24, 17.0.0.0/8 }

pass in on em0 inet proto tcp from any to self port 25,587
block in on em0 inet proto tcp from $blockiert to self port 25,587

Dabei ist em0 das Netzwerkinterface, auf dem die Filterung stattfindet, in die Richtung (eingehend), inet steht für IPv4-Pakete, proto tcp trifft auf TCP-Pakete zu, die symbolische Konstante any trifft auf alle Hosts zu (IP-Schreibweise 0.0.0.0), und self ist die eigene IP-Adresse des jeweiligen Interfaces. Die Variable $blockiert enthält eine Liste von Hosts und Hostbereichen.

Eine Besonderheit von PF ist, dass immer die letzte passende Regel zutrifft. Daher würde die umgekehrte Reihenfolge der hier beschriebenen Regeln dazu führen, dass jeder Mails einliefern dürfte, da die in der ersten Regel blockierten Hosts in der zweiten Regel durchgelassen würden.

Das nächste Beispiel zeigt eine exemplarische NAT-Lösung, die z.B. auf einem Router laufen kann:

ext_schnittstelle = em0
intern_netz = 192.168.0.0/16

match out on $ext_schnittstelle inet from $intern_netz to any nat-to $ext_schnittstelle

match trifft hierbei auf Pakete zu, entscheidet aber nicht über Durchlassen oder Blockieren. Alle Pakete, die die Firewall über die Schnittstelle $ext_schnittstelle verlassen und IPv4-Pakete (inet) aus dem eigenen (internen) Netz $intern_netz sind, werden mit der Absenderadresse von $ext_schnittstelle versehen. Weitere Regeln für eine funktionierende NAT-Firewall sind nicht mehr nötig.

Außerdem ist PF in der Lage, als TCP-Proxy zu fungieren, somit die eingehenden TCP-Verbindungen zu bestätigen und erst danach an die Anwendungen weiterzureichen. Dies verhindert SYN-Floods.

Andere Server[Bearbeiten]

OpenBSD enthält einen angepassten Apache 1.3, der vom OpenBSD-Projekt speziell gehärtet und abgesichert wurde. Als FTP-Server sind Pure-FTPd und vsftpd, nicht jedoch einige andere populäre, aber tendenziell unsicherere Server enthalten. Als Mail-Server (SMTP-Server) wird ebenfalls ein angepasster sendmail verwendet; es ist allerdings die Eigenentwicklung OpenSMTPD in Arbeit und (2012) weitestgehend fertiggestellt.[10]

Sonstige Funktionen[Bearbeiten]

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[Bearbeiten]

  1. Manpages: strncpy und strncat.
  2. Manpages: strlcpy und strlcat.
  3. 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.
  4. Drepper, Ulrich. Mail zur libc-alpha: Re: PATCH: safe string copy and concetation(sic), 8. August 2000.
  5. Madhavapeddy, Anil. Mail zu openbsd-cvs: CVS: cvs.openbsd.org: src, 6. Juni 2003.
  6. Manpages: issetugid und arc4random.
  7. ProPolice Webseite: here.
  8. Frantzen, Mike und Mike Shuey. StackGhost: Hardware Facilitated Stack Protection. Tagungsberichte des 10. USENIX Security Symposiums, 13.-17. August 2001, pp. 5566.
  9. SecurityFocus. Federico Biancuzzi, OpenBSD's network stack, 12. Oktober 2005.
  10. http://www.opensmtpd.org/