05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

2.3 Buffer-Overflows <strong>und</strong> Format-String-Schwachstellen 47<br />

über 100 000 verschiedene Vorkommnisse im Jahr. Von den 2002 veröffentlichen<br />

37 Sicherheits-Bulletins, die nur die besonders kritischen Schwachstellen<br />

bleuchten, waren etwa zwei Drittel auf Buffer-Overflows <strong>und</strong> Format-String-<br />

Schwachstellen zurückzuführen.<br />

2.3.1 Buffer-Overflows<br />

22–28<br />

30–34<br />

Buffer-Overflows können im Zusammenspiel <strong>mit</strong> allen Programmiersprachen<br />

auftreten, die bei Operationen <strong>mit</strong> Zeigern <strong>und</strong> Feldern keine Überprüfung<br />

von Adreßbereichen <strong>und</strong> Feldgrenzen durchführen. Ein typisches Beispiel ist<br />

die Programmiersprache C, die unter <strong>Unix</strong> gerade im Umfeld der System<strong>und</strong><br />

Netzwerkprogrammierung die Programmiersprache Nummer 1 ist. In C<br />

findet weder zum Zeitpunkt der Übersetzung noch zur Laufzeit eine Überprüfung<br />

von Adreßbereichen <strong>und</strong> Feldgrenzen statt. Darüber hinaus bietet C<br />

gleich einen ganzen Satz von Funktionen, die in diesem Zusammenhang als<br />

unsicher“ einzustufen sind. C-Programmierer bewegen sich mehr oder weniger<br />

im freien Raum, sie müssen selbst wissen, was im Kontext des Programms<br />

”<br />

erlaubt ist <strong>und</strong> was zu Problemen führen kann. Aus diesem Gr<strong>und</strong> ist es besonders<br />

wichtig, über die Gefahren von Buffer-Overflows Bescheid zu wissen <strong>und</strong><br />

die wichtigsten Fehlerquellen gleich bei der Programmierung auszuschließen.<br />

Zur schrittweisen Annäherung an das Phänomen Buffer-Overflow betrachten<br />

wir als erstes das Programm aus Beispiel 2.10 <strong>und</strong> 2.11. Bei der Besprechung<br />

des Programms werden wir im Quelltext einige gr<strong>und</strong>legende Fehler entdecken<br />

<strong>und</strong> diese dann beheben.<br />

Das Programm liest von der Kommandozeile einen Benutzernamen ein. Wurde<br />

dem Programm beim Aufruf kein Argument übergeben, so beendet sich der<br />

Prozeß nach einer entsprechenden Beschwerde <strong>mit</strong> einem Fehlercode.<br />

Danach wird versucht, den angegebenen Usernamen in der Benutzerdatenbank<br />

des Systems ausfindig zu machen. Hierzu wird die Funktion user_exists()<br />

aufgerufen. Wird der Benutzername nicht gef<strong>und</strong>en, so beendet sich der Prozeß<br />

<strong>mit</strong> einer Fehlermeldung.<br />

Beispiel 2.10. overflow.c, Teil 1<br />

22 int main( int argc, char *argv[] )<br />

23 {<br />

24 if( argc < 2 )<br />

25 {<br />

26 printf( "Bitte Username eingeben.\n" );<br />

27 return( EXIT_FAILURE );<br />

28 }<br />

29<br />

30 if( ! user_exists( argv[1] ) ) /* Achtung! */<br />

31 {

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!