Hallo allerseits,
ich will hier kurz einen Scriptausschnitt (Formmailer) zur Diskussion stellen und damit nochmal an alle appelieren, ihre Scripts auf Löcher zu untersuchen. Ich war lange Zeit der Meinung, keinem Angreifer eine Möglichkeit zum Mißbrauch zu geben, bis ich eines besseren belehrt wurde.
<codeschnipsel>
use CGI;
use CheckRFC;
#mailTo fest codiert
my $mailTo = "mail@domain.de";
my $mailprog = '/usr/lib/sendmail';
#Formular-Parameter lesen
[...]
#Parameter $mailFrom überprüfen mittels CheckRFC
if ( !is_email($mailFrom) ){ &errorMsg("From-Adresse fehlerhaft\n") ; }
#Parameter Subject wird ungeprüft genutzt
open (MAIL, "|$mailprog -t") || die "Can't open $mailprog $!\n";
print MAIL "To: $mailTo\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n\n";
print MAIL "$body\n";
close (MAIL);
</codeschnipsel>
Eigentlich sollte das Script (hier stark gekürzt) so fehlerfrei und sicher arbeiten. Tut es aber nicht, es kann von bösartigen Zeitgenossen als SpamRelay genutzt werden. Wie? Ganz einfach: Man füllt das Feld $subject mit folgendem Inhalt: 'Das ist ein offenes Scheunentor! \nTo: bla@domain.de,blubb@domain.de'
Damit bekommt sendmail folgende Parameter (nehmen wir an, daß die From-Adresse folgende war und damit der Prüfung standgehalten hat: fjhvdsmnfdtz@hotmail.com). Das \n im Feld $subject beendet dabei den Parameter Subject, der Rest wird als neue Zeile im Header interpretiert. In diesem Fall eine weitere To-Zeile.
To: mail@domain.de
From: fjhvdsmnfdtz@hotmail.com
Subject: Das ist ein offenes Scheunentor!
To: bla@domain.de,blubb@domain.de
Und schon geht die Mail an diverse Adressen. Mit dem diesem Verfahren wurden von meinem Account viele tausend Mails verschickt, ohne daß ich dies wirklich bemerkt habe (pro Aufruf etwa 500). Natürlich habe ich auch bei jeder Nutzung des Scripts eine Mail bekommen (ist ja schließlich fest codiert), die hat mein Spamfilter aber immer gleich aussortiert.
Fazit: es reicht bei weitem nicht aus, die Mail-Adressen auf richtige Syntax zu überprüfen und die -t von sendmail Option zu nutzen. Auch alle anderen Parameter, die dann im Header landen, müssen überprüft werden. Eine andere Lösung zum Verhindern des Mißbrauchs ist folgende: Alle Parameter für den MailHeader werden fest im Script codiert, alle von Formular übertragenen Parameter werden als Text in den MailBody geschrieben.
Gruß Frank