= 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 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 * Treiber Userlandi(minix) / OpenSource (nvidia) // vim: set syntax=asciidoc: