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.

56 2 Programmieren <strong>mit</strong> <strong>Unix</strong>-Prozessen<br />

Was ist passiert? Die printf()-Funktion interpretiert den ersten Parameter,<br />

das ist in Beispiel 2.13 die eingelesene Zeichenkette, jeweils als Format-String.<br />

Nachdem beim ersten Testlauf keine speziellen Umwandlungszeichen in der<br />

übergebenen Zeichenkette vorhanden sind, liefert die printf()-Funktion die<br />

gewünschte Ausgabe.<br />

Im zweiten Testlauf befinden sich im Datenstrom der Standardeingabe allerdings<br />

mehrere Umwandlungzeichen, die beim nachfolgenden Aufruf von<br />

printf() im ersten Parameter landen. Die printf()-Funktion muß nun davon<br />

ausgehen, daß ihr beim Aufruf weitere, zu den Umwandlungzeichen passende<br />

Argumente übergeben wurden. 11 Funktionsargumente werden in C von<br />

der aufrufenden Umgebung auf dem Stack abgelegt. Die Funktion nimmt daher<br />

die durch die Art <strong>und</strong> Anzahl der Umwandlungzeichen bestimmten Werte<br />

vom Stack, in unserem Beispiel sind das 16 Zeiger, die (vermeintlich) auf gültige<br />

Zeichenketten im Adreßraum des Prozesses verweisen. Die geschieht völlig<br />

unabhängig davon, ob beim Aufruf von printf() tatsächlich die erwartete<br />

Anzahl von Argumenten hinterlegt wurde, oder nicht. Im Zweifelsfall werden<br />

also Speicherbereiche des Stacks ausgewertet, die gar nicht für die aufgerufene<br />

Funktion bestimmt sind.<br />

Für die Ausgabe versucht die printf()-Funktion aus Beispiel 2.13 nun, die<br />

16 Umwandlungszeichen %s durch Zeichenketten zu ersetzen. Dazu werden<br />

nacheinander 16 Zeiger vom Stack gelesen. Die von diesen Zeigern referenzierten<br />

Speicherbereiche werden Zug um Zug in die Ausgabe kopiert. Es ist dabei<br />

allerdings recht wahrscheinlich, daß die vom Stack entnommenen Adressen<br />

Speicherbereiche referenzieren, die außerhalb der für diesen Prozeß gültigen<br />

Speichersegmente liegen (vgl. dazu Abschnitt 2.1.4). In einem solchen Fall<br />

wird das Programm – wie oben zu sehen – <strong>mit</strong> einer Speicherschutzverletzung<br />

(Segmentation Fault) abgebrochen.<br />

Das Problem einer Format-String-Schwachstelle liegt also darin, daß ein Programm<br />

die Kontrolle über die eingesetzten Format-Strings an seine Umgebung<br />

abgibt. Dadurch wird es für die Anwender eines Programms möglich,<br />

über Kommandozeilen-Argumente, Konfigurationsdateien oder durch Benutzereingaben<br />

über die Kommandozeile oder das Netzwerk auf Format-Strings<br />

Einfluß zu nehmen. Durch gezielte Einflußnahme kann dann eine aus Sicht des<br />

Programmierers ungewollte Reaktion des Anwendungsprogramms provoziert<br />

werden. Über Format-String-Schwachstellen lassen sich ganz bewußt<br />

• Programme zum Absturz bringen<br />

• Speicherwerte auslesen <strong>und</strong> manipulieren sowie<br />

• Code-Fragmente in den Programmcode einschleusen <strong>und</strong> ausführen.<br />

Das eingeschleuste Umwandlungszeichen %x kann z. B. dazu verwendet werden,<br />

den aktuellen Stack des betroffenen Programms zu analysieren. Trifft<br />

11 In C haben Funktionen <strong>mit</strong> variablen Argumentenlisten leider keine Handhabe<br />

um festzustellen, <strong>mit</strong> wievielen Parametern sie tatsächlich aufgerufen wurden.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!