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

== Einleitung

Dieses Dokument beschreibt Sicherheitrisiken von Systemprogrammen mit dem Fokus
auf UNIX-Systeme.

== 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.

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 man bei Internet diensten eine staendige weltweite Erreichbarkeit hat.

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 ich 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

// vim: set syntax=asciidoc:
