From d5e454dbb1895c10576834d652e5c93273a9c950 Mon Sep 17 00:00:00 2001
From: Jan Klemkow <j.klemkow@wemelug.de>
Date: Sat, 5 Jan 2013 20:17:48 +0100
Subject: Add some Text and correct some spell errors.

---
 document.asciidoc | 133 ++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 89 insertions(+), 44 deletions(-)

(limited to 'document.asciidoc')

diff --git a/document.asciidoc b/document.asciidoc
index 62e14ce..5407479 100644
--- a/document.asciidoc
+++ b/document.asciidoc
@@ -6,31 +6,31 @@
 
 Dieses Dokument beschreibt Sicherheitsrisiken von Systemprogrammen mit dem Fokus
 auf UNIX-Systeme.
-Systemnahe meinst in diesem Dokument alle Programme welche direkt auf die
+Systemnahe meint in diesem Dokument alle Programme welche direkt auf die
 Systemschnittstellen (System-Calls) zugreifen.
+Es werden einleitend Problemfelder von Systemnahen Programmen geschildert und
+ein Historischer Vergleich zu Anwendungsprogrammen gezogen.
 
 == Einleitung
 
 Sicherheit fuer die Software-Entwicklung im systemnahen Bereich spielt eine
 wesentliche Rolle.
-Da es hier oft nicht nur um die Anwendung selbst sonder auch um die Sicherheit
+Da es hier oft nicht nur um die Anwendung selbst sondern auch um die Sicherheit
 des Gesamtsystems geht.
 Systemdienste werden in vielen Faellen mit hoeheren Rechten ausgefuehrt.
 Gelingt es einem Angreifer einen solchen Dienst zu uebernehmen, erlangt er
 selbst hoehere Rechte auf dem Zielsystem.
-Bei Endanwendungen ist dieses in der Regel nicht der Fall, sodass der Angreifer
-bei einem erfolgreichen nur Teile des Zielsystems unter seine Kontrolle bringen
-kann.
+Bei Endanwendungen ist dieses in der Regel nicht der Fall, sodass der Angreifer,
+bei einem erfolgreichen Angriff, nur Teile des Zielsystems unter seine Kontrolle
+bringen kann.
 
 Historisch betrachtet hat sich die Lage in diesem Bereich in den vergangenen
 zehn Jahren verbessert.
-Die grossen Angriffe, welche sich zu Beginn der 2000er Jahre noch auf
-Systemdienste richteten, sind heute eher selten geworden.
+Die grossen Angriffe, wie etwa der Sasser-Wurm, welche sich zu Beginn der
+2000er Jahre noch auf Systemdienste richteten, sind heute eher selten geworden.
 Momentan stehen die Endanwendungen wie Browser oder Dokumentenbetrachter im
 Fokus der Angriffe.
 
-//
-
 //Im systemnahen Bereich gibt es viele Programme welche fuer die Sicherheit des
 //Gesamtsystems eine enorme Rolle spielt.
 
@@ -38,25 +38,32 @@ Fokus der Angriffe.
 
 == Angriffsvektoren
 
-In diesem Kapitel werden verschiedene Angrifftvektoren und Schwachstellen von
+In diesem Kapitel werden verschiedene Angriffsvektoren 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.
+Viele Systemprogramme sind in der Programmiersprache ``C'' geschrieben.
+Deren Standardbiblothek unterlag im Laufe der Zeit einer ganzen Reihe von
+Veraenderungen, welche unter anderem die Sicherheit von Programmen erhoehten.
+
+Eines der groessten Probleme in ``C''-Programmen sind Funktionen zur
+Verarbeitung von Zeichenketten.
+
+Da Zeichenketten hier im Gegensatz zu anderen Programmiersprachen nicht als
+komplexes Objekt sondern als loser Speicherbereich betrachtet werden.
+Somit muss ein Programmierer bei Zeichenketten immer den dahinterliegenden
+Speicherbereich und dessen Laenge bei jeder Operation bedenken.
 
-Eines der groessten Probleme in C-Programmen stellen die Zeichekettenfunktionen
-da.
-Da diese seit langer Zeit immer wieder fuer Sicherheitsprobleme sorgen.
-Bei dieses Funktionen ist Problem, dass diese die Laengen von Speicherbereichen
-nicht beachten.
+//Da dieses seit langer Zeit immer wieder fuer Sicherheitsprobleme sorgt, wurden
+//viele Funktionen neu geschrieben.
+Bei diesen Funktionen ist das Problem, dass diese die Laengen von
+Speicherbereichen nicht beachten.
 Dadurch kommt es schnell zu Pufferueberlaeufen und Zugriffen auf nicht
-allokierte Speicherbereiche.
-Dadurch koennen Angreiffer eigenen Programmcode einschleusen und ausfuehlen
+allozierte Speicherbereiche.
+Dadurch koennen Angreiffer eigenen Programmcode einschleusen und ausfuehren
 lassen, sowie Programme zum Absturz bringen.
 
 Als Fallbeispiel wird die Funktion strcpy erklaert.
@@ -64,11 +71,11 @@ Diese Funktion wird dafuer benutzt um eine Zeichenkette von einem Speicherplatz
 zu einem anderen zu kopieren.
 Als Parameter bekommt die Funktion die Startadresse der Quelle und die
 Startadresse des Ziels im Speicher.
-Der Funtkion ist dabei die Groesse der jeweiligen Speicherplaetze nicht bekannt.
+Der Funktion ist dabei die Groesse der jeweiligen Speicherplaetze nicht bekannt.
 Es wird nun eine Speicherzelle nach der Anderen kopiert, solange bis in der
 Quelle ein NUL-Byte auftaucht.
-Dabei kann die Funtkion weder sicherstellen, dass sie nicht ueber den
-Quellpuffer hinaus Bytes kopiert, sowie dass sie nicht ueber die genzen des
+Dabei kann die Funktion weder sicherstellen, dass sie nicht ueber den
+Quellpuffer hinaus Bytes kopiert, sowie dass sie nicht ueber die Grenzen des
 Zielpuffers hinaus schreibt.
 
 Durch dieses Verhalten, kommt es immer wieder zu Pufferueberlaeufen, welche
@@ -98,71 +105,109 @@ TODO: strncpy() strlcpy()
 Ein grosser Angriffsvektor auf Computersysteme sind die Laufenden Dienste,
 welche ueber Netzwerk und Internet erreichbar sind.
 Ein Fehler in ihrer Programmierung koennte von ausserhalb ausgenutzt werden,
-da Internetdiensten eine staendige weltweite Erreichbarkeit haben.
+da Internetdienste eine staendige weltweite Erreichbarkeit haben.
 Somit kann ein Internetdienst potentiell zur jeder Zeit von jedem Ort aus
 angegriffen werden.
 
 Zum Schutz solcher Dienste gibt es verschiedene Mechanismen, welche im Folgenden
 erlaeutert werden.
 
- * privilege separation
  * chroot/jail
  * Zugangsbeschraenkung (Firewall Layer 3/4)
  * Applikation Level Gateway (doppelte parsen von protokollen)
 
-==== Privilege Separation
+==== 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
+unterschiedlichen Berechtigungen auf geteilt.
+Das Ziel dabei ist es, Programmcode mit so wenig Rechten wie moeglich laufen zu
 lassen.
 
 Als Beispiel soll der Window-Compositer Wayland genannt...
 TODO: wayland privilege separater erklaeren
 
-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
+Im einfachsten Fall startet ein Daemon mit Root rechten und holt sich alle
+Ressourcen, wie etwas Sockets mit Well-Known-Ports oder eine Filedescriptor auf
 eine Datei, gibt dann die rechte ab und laeuft im user-mode weiter.
 
+==== Privilege-Revocation
+
+Die meisten Anwendung benoetigen ausschliesslich waehrend der Initialisierung
+hoehere Rechte, um etwa einen Socket mit einem Well-Known-Port zu oeffnen.
+Zur Laufzeit werden diese hoeheren Rechte dann nicht mehr benoetigt.
+Somit sollten diesen Prozesse nach ihrer Initialisierung diese Rechte wieder
+abgeben und mit normalen Benutzer-Rechen weiter laufen.
+
+
+
 ==== 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)+.
+Daten manipulieren.
+Um dieses zu vermeiden, koennen diese Dienste in kuenstlichen Umgebungen
+von einander getrennt werden.
+Eine Variante dafuer ist 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.
+Root-Verzeichnisses nicht mehr zugreifen.
 Bereits geoeffnete Dateien koennen aber weiterhin verwendet werden,
 auch wenn diese Ausserhalb des neuen Root-Verzeichnisses liegen.
 
 Ein Beispiel 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 
+Der +chroot(2)+-System-Call ist in erster Linie aber keine Sicherheitsfunktion.
+Es gibt definierte Wege aus einem chroot wieder heraus zu wechseln.
+
+Das Konzept von ``Jails'' wie etwas im FreeBSD-Betriebssystem verwendet werden,
+sind dafuer ausgelegt verschiedene Prozesse sicher von einander zu trennen.
+Bei den ``Jails'' werden die System-Calls des eingeschlossenen Processes
+explizit gefiltert, um die Beeinflussung von anderen Prozessen zu verhindern.
+
+Um verschiedene Prozesse von einander zu trennen kann auch das
+UNIX-Rechte-Verwaltung verwendet werden.
+Jeder Service sollte unter einem separaten Nutzer-Konto laufen.
+Es sollte vermieden werden mehrere Dienste mit den selben Nutzungsrechten laufen
+zu lassen, da sich diesen untereinander beeinflussen koennen.
+Sollte ein Dienst keine eigenen Dateien benoetigen, kann dieser unter dem
+speziellen Nutzer ``nobody'' ausgefuehrt werden.
+Unter vielen Unix-Systemen wird dieser speziell fuer diese Aufgabe verwendet.
+
+==== Beschraenkung der Erreichbarkeit
+
+Sollte ein Dienst nur fuer einen bestimmten Kreis von Nutzern bestimmt sein,
+dann sollte man die Erreichbarkeit des Dienstes auf diesen Kreis beschraenken.
+Systemdienste muessen nur in seltenen Faellen eine Weltweite Erreichbarkeit
+haben.
+Kommunikation innerhalb eines Hosts sollen immer ueber das Loopback-Interface
+gefuehrt werden.
+Vor allem in Windows-Systemen ist es in der Vergangenheit oft grossen Problemen
+mit Wuermern gekommen, weil verwundbare Dienste ueber das Netzwerk erreichbar
+waren.
+Fuer die Kommunikation von Diensten innerhalb einer Broadcast-Domain sollen
+link-local-Adressen verwendet werden.
+Im Hinblick auf IPv6 gibt es in diesem Bereich viele Spezialadressen welche
+fuer die verschiedensten Zwecke genutzt werden koennen.
+In jedem Fall sollte die Erreichbarkeit von Diensten soweit wie moeglich
+eingeschraenkt werden.
+Auch Tunnel-Techniken wir IPSEC und andere VPN-Loesungen koennen dabei verwendet
+werden.
 
 === 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.
+fuer die Sicherheit eines Systems.
 So kann die Wahl eines anderen Betriebssystems schon dafuer ausschlaggebend
-dafuer sein, ob eine Programmierfehler zu einem Sicherheitsrisiko wird oder
-nicht.
+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.
-- 
cgit 

