From 1a3bfcce5e76f9c8ff1150ced5586a8dc35989ba Mon Sep 17 00:00:00 2001 From: Jan Klemkow Date: Tue, 1 Jan 2013 15:10:31 +0100 Subject: Add some text in varios sections. --- document.asciidoc | 99 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 86 insertions(+), 13 deletions(-) diff --git a/document.asciidoc b/document.asciidoc index 09c6a76..0e9e2de 100644 --- a/document.asciidoc +++ b/document.asciidoc @@ -1,22 +1,26 @@ -= Sichere Softwareentwicklung im Systemnahenbereich += Sichere Software-Entwicklung im systemnahen Bereich :author: Jan Klemkow, Benjamin Franzke :lang: de == Kurzfassung -Dieses Dokument beschreibt Sicherheitrisiken von Systemprogrammen mit dem Fokus + +Dieses Dokument beschreibt Sicherheitsrisiken von Systemprogrammen mit dem Fokus auf UNIX-Systeme. == Einleitung + Im Systemnahenbereich gibt es viel Software welche fuer die Sicherheit des Gesammtsystems eine enorme rolle spielt. == Angriffsvektoren + In diesem Kapitel werden verschiedene Angrifftvektoren und Schwachstellen von Systemprogrammen erlaeutert. Zudem werden werden verschiedene Verteidigungsmassnahmen erlaeutert, welche das Risiko der Angriffsmoeglichkeiten senken. === Standard-C-Bibliothek + Viele Systemprogramme sind in der Programmiersprache C geschrieben. Deren Standardbiblothek unterlag im laufe der Zeit einer ganzen Reihe von Veraenderungen, welche unteranderem die Sicherheit von Programmen erhoehten. @@ -50,13 +54,14 @@ Um dieses Problem zu loesen wurden neue Zeichenkettenfuntkionen in die Standard-C-Bibliothek auf genommen, welche als Argument maximal Laengen uebergeben bekommen. +[source,c] ------------------- strcpy(char *dst, const char *src); strncpy(char *dst, const char *src, size_t len); strlcpy(char *dst, const char *src, size_t dstsize); ------------------- -Hierbei gibt es zwei ansaetze mit Laengen umzugehen. +Hierbei gibt es zwei Ansaetze mit Laengen umzugehen. TODO: strncpy() strlcpy() * gets() @@ -65,20 +70,24 @@ TODO: strncpy() strlcpy() * str..() === Netzwerk-Programmierung -Ein grosser Angriffvektor auf Computersysteme sind die Laufenden Dienste, + +Ein grosser Angriffsvektor auf Computersysteme sind die Laufenden Dienste, welche ueber Netzwerk und Internet erreichbar sind. -Ein Fehler in iherer Programmierung kann von ausserhalb ausgenutzt werden, +Ein Fehler in ihrer Programmierung koennte von ausserhalb ausgenutzt werden, da Internetdiensten eine staendige weltweite Erreichbarkeit haben. -Somit kann ein Internetdienst potentiel zur jeder Zeit von jedem Ort aus +Somit kann ein Internetdienst potentiell zur jeder Zeit von jedem Ort aus angegriffen werden. -Zum Schutz solcher Dienste gibt es verschiene Mechanissmen. +Zum Schutz solcher Dienste gibt es verschiedene Mechanismen, welche im Folgenden +erlaeutert werden. * privilege separation - * zugangs beschraenkung (Firewall Layer 3/4) + * chroot/jail + * Zugangsbeschraenkung (Firewall Layer 3/4) * Applikation Level Gateway (doppelte parsen von protokollen) ==== Privilege Separation + Bei der Privilege-Seperation wird ein Programm in verschiedene Prozesse mit unterschiedlichen Berechtigungena auf geteilt. Ziel ist es, so wenig Programmcode wie moeglich mit root-Rechten laufen zu @@ -91,18 +100,82 @@ Im einfachsten Fall startet ein Deamon mit Root rechten und holt sich alle resourcen, wie etwas sockets mit Well-Known-Ports oder eine Filedescriptor auf eine Datei, gibt dann die rechte ab und laeuft im user-mode weiter. +==== Service-Seperation + +Da auf einem Computer zumeist mehr als nur ein Dienst laeuft, welcher mit einem +Netzwerk oder dem Internet verbunden ist, ist auch die Angriffsmoeglichkeit auf +dieses System sehr hoch. + +Vor Allem beim Servern, welche viele Dienste wie HTTP, FTP, SMTP, POP3 und +viele mehr anbieten ist die Gefahr einer Sicherheitsluecke sehr hoch. +Sollte einer dieser Dienste ueber eine Sicherheitsluecke von einem Angreifer +uebernommen werden, so koennte diese ebenfalls die anderen Dienste und deren +Daten uebernehmen. + +Um dieses zu vermeiden, werden diese Dienste in kuenstlichen Umgebungen +getrennt von einander getrennt. + +Eine Variante ist dafuer der System-Call +chroot(2)+. +Dieser System-Call wechselt fuer einen Prozess und dessen Kind-Prozesse das +Root-Verzeichnis. +Somit kann ein Prozess auf Dateien ausserhalb des neuen +Root-Verzeichnisses mehr zugreifen. +Bereits geoeffnete Dateien koennen aber weiterhin verwendet werden, +auch wenn diese Ausserhalb des neuen Root-Verzeichnisses liegen. + +Ein Beipsiel fuer die Anwendung dieser Technik ist der Apache-Http-Server, +welcher meist in das Verzeichnis +/var/www+ als Root-Verzeichnis wechselt. + +==== Zugangsbeschraenkung + +Sollte ein Dienst nur fuer + === Kernel +Beim erstellen einer sicherheitskritischen Anwendung ist nicht nur die +Architektur und Programmierung der Anwendung selbst wichtig. +Die Umgebung in der die Anwendung laeuft ist ebenfalls ein wichtiger Faktor, +fuer dich Sicherheit eines Systems. +So kann die Wahl eines anderen Betriebssystems schon dafuer ausschlaggebend +dafuer sein, ob eine Programmierfehler zu einem Sicherheitsrisiko wird oder +nicht. + +Im Folgenden werden einige Aspekte des Kernel-Designs auf ihre Sicherheit fuer +das Gesamtsystem betrachtet. + * interrupt blockierung - * Treiber Userlandi(minix) / OpenSource (nvidia) + * Treiber Userland(minix) / OpenSource (nvidia) === Microkernel -In den meisten Betriebssystemen werden Monolitische Kernel benutzt, welche -viele Betriebssytemaufgaben im Kernel-Mode laufen lassen. +Die meisten Betriebssysteme verwenden ein monolitisches Kernel-Design. +In diesem werden viele Aufgaben des Betriebssystems im Kernel erledigt. +Das bedeutet, dass der Programmcode mit sehr hohen Berechtigungen +ausgefuehrt wird. -Viele dieser Aufgaben koennen auch von User-Prozessen uebernommen werden. +Ein Grossteil dieser Aufgaben koennen auch von User-Prozessen uebernommen +werden. Dieses hat den Vorteil, dass Schutzfunktionen des Prozessors genutzt werden koennen. -// vim: set syntax=asciidoc: +Bei Betriebssystemen mit einem Mikro-Kernel-Design ist dieses anders. +Dort werden viele Aufgaben an User-Prozesse ausgelagert, z. B. die +Geraetetreiber. + +==== NVIDIA Treiber Problem + +Im +CVE-2012-0946+ wird eine Sicherheitsluecke im NVIDIA Graphikkarten-Treiber +fuer Linux, Solaris und FreeBSD beschrieben, welcher das erlangen von hoeheren +Rechten ermoeglicht. +Das ausnutzen dieses Programmierfehlers ist nur moeglich, weil der Treiber +im Kernel-Mode ausgefuehrt wird. + +//Bei dem Betriebssystem Minix etwa, werden Geraetetreiber als User-Prozess +//gestartet. +//Dadruch unterliegen sie den gleichen Sicherheitsvorkehrungen wie alle anderen +//Programme. +//So werden z. B. Speicherschutzverletzungen vom Prozessor erkannt. +//Ein Fehlerhaft programmierter Treiber kann so nicht mehr das gesammte System +//gefaehrden. + +// vim: set syntax=asciidoc spell spelllang=de,en: -- cgit