A.13 system() und popen()
Eines der größten Sicherheitslöcher, welches jeder Programmierer kennen sollte, ist die Verwendung der Funktion system(), welche eine Shell verwendet, um ein anderes Programm zu starten. Ein einfacher kurzer Codeausschnitt sollte Ihnen genügen, um das Problem zu erläutern:
...
printf("Wonach wollen Sie suchen: ");
fgets( suche, MAX, stdin );
...
sprintf (buffer, "fgrep -i %s datenbank.sql ", suche);
system(buffer);
...
Der Anwender gibt jetzt für den String suche Folgendes ein:
Wonach wollen Sie suchen: foo /dev/null; rm -Rf /
fgrep -i foo /dev/null; rm -Rf / /usr/dict/words
Hinweis Das Sicherheitsloch ist also hier nicht die Funktion system(), sondern meistens der Programmierer, der es nicht richtig anwendet!
|
Hier hat der Anwender aus einem Kommando zwei gemacht – was sich in der Shell durch ein Semikolon realisieren lässt. Das erste Kommando ist noch harmlos, aber mit dem zweiten Kommando kann man, wenn man dummerweise auch noch als root unterwegs ist, alle Dateien vom laufenden System entfernen. Auch, wenn man nicht als root unterwegs sein sollte, können trotzdem noch alle Dateien entfernt werden, welche man als User besitzt. Dasselbe Problem kann auch mit der Funktion popen() auftreten, womit eine Pipe zwischen dem Eltern- und Kindprozess verwendet wird. Auch hier wird die Shell zur Ausführung von Kommandos verwendet.
Ein weiteres Problem ist die Verwendung der Funktionen unter Angabe des Kommandos, das gestartet werden soll, ohne eine komplette Pfadangabe. Denn auch hier gilt, wie schon bei den Umgebungsvariablen, dass die PATH-Angabe jederzeit verändert und durch ein gleichnamiges schadhaftes Programm in einem anderen Verzeichnis ersetzt und ausgeführt werden kann. Kann/will man nicht auf system() oder popen() verzichten, sollte man wenigstens den kompletten Pfad zur Anwendung angeben.
|