= Sichere Softwareentwicklung im Systemnahenbereich
:author: Jan Klemkow, Benjamin Franzke

== Kurzfassung
Dieses Dokument beschreibt Sicherheitrisiken 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.

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.
Dadurch kommt es schnell zu Pufferueberlaeufen und Zugriffen auf nicht
allokierte Speicherbereiche.
Dadurch koennen Angreiffer eigenen Programmcode einschleusen und ausfuehlen
lassen, sowie Programme zum Absturz bringen.

Als Fallbeispiel wird die Funktion strcpy erklaert.
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.
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
Zielpuffers hinaus schreibt.

Durch dieses Verhalten, kommt es immer wieder zu Pufferueberlaeufen, welche
zu unvorhersagbaren Folgen fuer den weiteren Programmablauf fuehren.

Um dieses Problem zu loesen wurden neue Zeichenkettenfuntkionen in die
Standard-C-Bibliothek auf genommen, welche als Argument maximal Laengen
uebergeben bekommen.

-------------------
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.
TODO: strncpy() strlcpy()

 * gets()
 * strlen()
 * strcpy()
 * str..()

=== Netzwerk-Programmierung
Ein grosser Angriffvektor auf Computersysteme sind die Laufenden Dienste,
welche ueber Netzwerk und Internet erreichbar sind.
Ein Fehler in iherer Programmierung kann von ausserhalb ausgenutzt werden,
da Internetdiensten eine staendige weltweite Erreichbarkeit haben.
Somit kann ein Internetdienst potentiel zur jeder Zeit von jedem Ort aus
angegriffen werden.

Zum Schutz solcher Dienste gibt es verschiene Mechanissmen.

 * privilege separation
 * zugangs beschraenkung (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
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
eine Datei, gibt dann die rechte ab und laeuft im user-mode weiter.

=== Kernel

 * interrupt blockierung
 * Treiber Userlandi(minix) / OpenSource (nvidia)

=== Microkernel

In den meisten Betriebssystemen werden Monolitische Kernel benutzt, welche
viele Betriebssytemaufgaben im Kernel-Mode laufen lassen.

Viele dieser Aufgaben koennen auch von User-Prozessen uebernommen werden.
Dieses hat den Vorteil, dass Schutzfunktionen des Prozessors genutzt werden
koennen.

// vim: set syntax=asciidoc:
