summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Klemkow <j.klemkow@wemelug.de>2013-01-07 09:31:22 +0100
committerJan Klemkow <j.klemkow@wemelug.de>2013-01-07 09:31:22 +0100
commit26f138d5d6f63f580e5a76cc04b5e668cfc73cbe (patch)
treeddb88e12ecc4193fee86431a76c18edc4518f32c
parent619a4238c646d2cf46b7eaa00ed4e8ec896f9ca5 (diff)
downloadsksys-26f138d5d6f63f580e5a76cc04b5e668cfc73cbe.tar.gz
sksys-26f138d5d6f63f580e5a76cc04b5e668cfc73cbe.tar.bz2
sksys-26f138d5d6f63f580e5a76cc04b5e668cfc73cbe.zip
wip
-rw-r--r--Makefile16
-rw-r--r--document.asciidoc96
-rw-r--r--image/ntpd_runtime.diabin2432 -> 2608 bytes
-rw-r--r--presentation.asciidoc17
4 files changed, 90 insertions, 39 deletions
diff --git a/Makefile b/Makefile
index 0829762..e47ddfe 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,9 @@
DBLATEX_OPTS="-P latex.encoding=utf8 -P latex.output.revhistory=0 -P doc.publisher.show=0"
IMAGES!=ls image/*.dia
-GenSVG=${IMAGES:s/.dia/.svg/}
+GenSVG=${IMAGES:S/.dia$/.svg/}
.PHONY: all clean up
-all: document.html presentation.html
+all: ${GenSVG} document.html presentation.html
.SUFFIXES: .asciidoc .html
presentation.html: presentation.asciidoc
@@ -13,19 +13,19 @@ presentation.html: presentation.asciidoc
asciidoc --out-file=$@ --backend=html $<
.SUFFIXES: .asciidoc .tex
-.tex.asciidoc:
+.asciidoc.tex:
asciidoc --backend=latex $<
.SUFFIXES: .asciidoc .pdf
-.pdf.asciidoc:
+.asciidoc.pdf:
a2x -f pdf --dblatex-opts=$(DBLATEX_OPTS) $<
.SUFFIXES: .dia .svg
-image/%.svg: image/%.dia
- dia --export=$@ --filter=svg $<
+.dia.svg:
+ @dia --export=$@ --filter=svg $<
up: document.html
- scp $< klemkow.net:www
+ scp document.html presentation.html klemkow.net:www
clean:
- rm -f document.html
+ rm -f document.html presentation.html ${GenSVG}
diff --git a/document.asciidoc b/document.asciidoc
index 3a1cf70..97daa01 100644
--- a/document.asciidoc
+++ b/document.asciidoc
@@ -69,11 +69,11 @@ allozierte Speicherbereiche.
Dadurch koennen Angreiffer eigenen Programmcode einschleusen und ausfuehren
lassen, sowie Programme zum Absturz bringen.
-Als Fallbeispiel wird die Funktion strcpy erklaert.
+Als Fallbeispiel wird die Funktion +strcpy(3)+ 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.
+Als Parameter bekommt die Funktion die Startadressen von Quelle und Ziel im
+Speicher.
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.
@@ -84,7 +84,7 @@ 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
+Um dieses Problem zu loesen wurden neue Zeichenkettenfunktionen in die
Standard-C-Bibliothek auf genommen, welche als Argument maximal Laengen
uebergeben bekommen.
@@ -105,20 +105,15 @@ TODO: strncpy() strlcpy()
== Netzwerk-Programmierung
-Ein grosser Angriffsvektor auf Computersysteme sind die Laufenden Dienste,
+Ein grosser Angriffsvektor auf Computer-Systeme sind laufenden Dienste,
welche ueber Netzwerk und Internet erreichbar sind.
Ein Fehler in ihrer Programmierung koennte von ausserhalb ausgenutzt werden,
da Internetdienste eine staendige weltweite Erreichbarkeit haben.
-Somit kann ein Internetdienst potentiell zur jeder Zeit von jedem Ort aus
+Somit kann ein solcher Dienst potentiell zur jeder Zeit von jedem Ort aus
angegriffen werden.
-
Zum Schutz solcher Dienste gibt es verschiedene Mechanismen, welche im Folgenden
erlaeutert werden.
- * 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
@@ -178,7 +173,7 @@ 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.
+zu lassen, da sich diese 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.
@@ -200,7 +195,7 @@ 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 verwendet
+Auch Tunnel-Techniken wie IPSec und andere VPN-Loesungen koennen verwendet
werden, um einen Dienst ausschliesslich einem ausgewaehlten Nutzern zugaenglich
zu machen.
@@ -210,8 +205,8 @@ 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 die Sicherheit eines Systems.
-So kann die Wahl eines anderen Betriebssystems schon dafuer ausschlaggebend
-sein, ob eine Programmierfehler zu einem Sicherheitsrisiko wird oder nicht.
+So kann die Wahl eines anderen Betriebssystems dafuer ausschlaggebend 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.
@@ -219,11 +214,11 @@ das Gesamtsystem betrachtet.
* interrupt blockierung
* Treiber Userland(minix) / OpenSource (nvidia)
-== Microkernel
+=== Kernel-Architektur
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
+Das bedeutet, dass der Programm-Code mit sehr hohen Berechtigungen
ausgefuehrt wird.
Ein Grossteil dieser Aufgaben koennen auch von User-Prozessen uebernommen
@@ -232,23 +227,62 @@ Dieses hat den Vorteil, dass Schutzfunktionen des Prozessors genutzt werden
koennen.
Bei Betriebssystemen mit einem Mikro-Kernel-Design ist dieses anders.
-Dort werden viele Aufgaben an User-Prozesse ausgelagert, zum Beispiel die
+Dort werden viele Aufgaben an User-Space-Prozesse ausgelagert, zum Beispiel die
Geraetetreiber.
-=== NVIDIA Treiber Problem
+==== 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
+Im +CVE-2012-0946+ wird eine Sicherheitsluecke im Nvidia Grafikkartentreiber
+fuer Linux, Solaris und FreeBSD beschrieben, welche 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.
+Das Ausnutzen dieses Programmierfehlers ist nur moeglich, weil der Treiber
+im privilegierten Modus ausgefuehrt wird.
+
+==== Minix
+
+Bei dem Betriebssystem Minix etwa, werden Geraetetreiber als User-Prozess
+gestartet.
+Dadurch unterliegen sie den gleichen Sicherheitsvorkehrungen wie alle anderen
+nicht privilegierten Prozesse.
+So werden z. B. Speicherbereichsverletzungen vom Prozessor erkannt.
+Ein fehlerhaft programmierter Treiber kann so nicht mehr das gesamte System
+gefaehrden.
+Dieses Kernel-Architektur hat grosse Performence-Nachteile gegenueber eines
+Monolitischen-Designs.
+Denn will einen Anwendung Beispielsweise mit der ueber das Netzwerk ein Paket
+versenden, so muss fuer dieses Paket zwei mal der Userspace-Kernelspace-Kontext
+gewechselt werden.
+Dieses kostet enorm viel Zeit, da der gesamte Prozessorkontext fuer den
+Uebergang von Anwendung zum Kernel, sowie vom Kernel zum Netzwerkkartentreiber
+gesichert werden muss.
+In einem monolitischen Design gaebe es nur einen Kontextwechsel von zum Kernel,
+welche das Netzwerkmodule enthaelt.
+Somit muss man an dieser Stelle Performence und Sicherheit abwiegen und fuer
+den konkreten Einzelfall entscheide welches wichtiger ist.
+
+=== Kernel-Programmierung
+
+Fuer die Entwicklung von Kernel-Modulen muessen ebenfalls hohes Mass an
+Sicherheit und Sorgfalt gelten.
+Hat eine Anwendung im Userspace-Bereich noch einen ganzen virtuellen
+Speicherraum und den Prozessor-Kontext noch fuer sich alleine, muessen diese
+Ressourcen innerhalb des Kernels geteilt werden.
+Um fuer kritische Aufgaben einen unterbrechungsfreien Programmablauf zu
+garantieren, koennen im Kernel Hardware-Interrupts blockiert werden.
+Diese muessen nach Beendigung der Arbeit in jedem Fall wieder freigegeben
+werden.
+Ein haeufiger Fehler an dieser Stelle ist fehlen von Interrupt-Freigaben, in
+Fehlerbehandlungsroutinen.
+In einer Funktion wird dabei fuer eine wichtige Aufgabe ein Unterbrechungsfreier
+Prozessorkontext erzeugt, indem die Interrupts blockiert werden.
+Am Ende der Routine wird die Blockierung wieder aufgehoben und die Funktion
+verlassen.
+Der Fehler liegt dann oft in den Fehlerbehandlungen mitten in der Routine.
+Es wird Beispielsweise ein Zeiger auf +NULL+ geprueft und im Fehlerfall
+die Funktion mit einem Rueckgabewert verlassen, welcher einen Fehler anzeigt.
+Vergessen wurde aber die Interrupts wieder freizugeben.
+Die Funktion in die zurueck gesprungen wird, erwartet einen Interrupt z. B.
+von Tastatur, Maus oder Netzwerkkarte, aber wird nie einen erhalten.
+Dadurch kann das gesamte System zum Stillstand kommen.
// vim: set syntax=asciidoc spell spelllang=de,en:
diff --git a/image/ntpd_runtime.dia b/image/ntpd_runtime.dia
index 63c95a3..dfc48c4 100644
--- a/image/ntpd_runtime.dia
+++ b/image/ntpd_runtime.dia
Binary files differ
diff --git a/presentation.asciidoc b/presentation.asciidoc
index 81f4626..e3d8c15 100644
--- a/presentation.asciidoc
+++ b/presentation.asciidoc
@@ -1,10 +1,27 @@
= Sichere Software-Entwicklung im systemnahen Bereich
:author: Jan Klemkow, Benjamin Franzke
:lang: de
+:imagesdir: image
:toc:
+== Standard-C-Bibliothek
+
+ * Pufferueberlaeufe
+
+== Privilege-Separation: Wayland
+
+HIER KOMMT NOCH EINE WAYLAND Grafik hin!!!!
+
== Privilege-Revocation: OpenNTPD
image::ntpd_runtime.svg[]
+== Kernel-Design
+
+image::kernel-design.svg[]
+
+== Kernel-Programming
+
+ *
+
// vim: set syntax=asciidoc spell spelllang=de,en: