Gästebücher, Spam und Abwehrmaßnahmen – Teil I

Spam ist eine Geißel des modernen IT-Zeitalters. Ich möchte an dieser Stelle über meinen kleinen Dauer-Krieg mit Spammern in einem Gästebuch berichten. Einiges davon ist sicher auch für Leute interessant, die eigene Blogs oder Foren betreiben und einen Schutz gegenüber Spam aufbauen wollen. Ich kürze mit "FBG" nachfolgend die Begiffs-Kombination "Forum/Blog/Gästebuch" ab.

Ich teile diesen Blog-Beitrag in zwei Teile auf:
Im diesem ersten Teil I beschreibe ich in allgemeiner Weise, welche Maßnahmen man typischerweise zur Absicherung von Gästebüchern oder FBGs einsetzt und wie meine Erfahrungen damit aussehen.

Im zweiten und wichtigeren Teil setze ich mich mit der Generierung von Captcha-Sequenzen mittels PHP auseinander. PHP deshalb, weil viele populäre WEB 2.0-Applikationen in dieser Sprache realisiert werden. Captcha-Mechanismen werden dabei häufig als Hürde für Spammer aufgesetzt.

Leider wird diese Hürde auch immer wieder überwunden - z.T. deshalb, weil die Entwickler bei der Captcha-Generierung die Tücken von "Pseudo-Zufallszahlen-Generatoren" [PRNG] nicht richtig einschätzen. Hierbei ist Vorsicht angesagt - insbesondere dann, wenn der PHP-Code des Blogs/Gästebuchs/Forums als Opensource-Produkt bekannt ist.

Auf adaptive Anti-Spam-Maßnahmen "lernender" Algorithmen z.B. für den Einsatz in E-Mail-Systemen möchte ich in diesen Beiträgen nicht eingehen; das ist ein Thema für sich.

Schutz-Maßnahmen gegen Spam in Foren/Blogs/Gästebüchern

Klassische Maßnahmen gegen Spam-Nachrichten in FBGen sind u.a. folgende :

  1. Check der IP-Adresse gegenüber Blacklists
  2. Check der E-Mail-Adresse auf Besonderheiten und Vergleich gegenüber entsprechenden E-Mail-Blacklists
  3. Erstellung eigener Blacklists aufgrund bestimmter Kriterien für abgewiesene FBG-Beiträge
  4. Untersuchung des Spam-Beitrags-Textes auf bestimmte typische Begriffe oder Phrasen
  5. Aufwandserhöhung für den Spammer durch zeitl. Vorgaben für die Erzeugung des Eintrags oder bei Wiederholungstätern (also bei Wiederholung eines bestimmten Fehlverhaltens) durch zeitl. Sperren der IP-Adressen und/oder E-Mail-Adressen der Absender
  6. Aufwandserhöhung für den Spammer durch hoffentlich (!) nur manuell und nicht maschinell durchführbare Aktionen auf Absenderseite - das klassische Beispiel für diese Abwehrmaßnahme stellen Captcha-Verfahren in unterschiedlicher Ausprägung dar.
  7. Einsatz serverbasierter Spam-Analyse-Dienste (wie Akismet) von kommerziellen oder nichtkommerziellen Anbietern.
  8. Einsatz versteckter Input-Felder, die von automatisierten Spam-Bots fälschlicherweise ausgefüllt werden

Persönliche Erfahrungen mit Abwehrmaßnahmen

Was sind nun meine Erfahrungen mit den verschiedenen Maßnahmen? Ein paar grundsätzliche Anmerkungen vorweg:

Wenn ein Forum/Blog/Gästebuch eine ernsthafte Schwachstelle aufweist, ist die entsprechende Website in der Spammer-"Szene" schneller bekannt, als es dem Besitzer der Website lieb sein kann. Man muss sich hier wirklich die Vorstellung einer organisierten Kriminalität zu eigen machen! Abschalten und Ersatz durch eine bessere SW und/oder Wechsel des Providers statt eines Dauerkrieges können durchaus vernünftige und sinnvolle Maßnahmen sein ! Im Zusammenhang mit Providerwechseln ist es übrigens wichtig, bei seinen Blogs/Foren/Gästebücher selbst Herr über die Daten und die zugehörigen Datenbanken zu sein. Ein krasses Gegenbeispiel zu dieser wünschenswerten Flexibilität liefern in letzter Zeit Blog-/Foren-Angebote oder Web-Baukästen von namhaften Web-Hosting-Providern in unserem Land. Dazu mehr in einem anderen Beitrag.

Nun zu meiner Einschätzung der einzelnen Maßnahmen:

Vergleich der IP-Adresse oder der E-Mail-Adresse gegen Blacklists

Maßnahmen, bei denen IP-Adressen, E-Mail-Adressen oder Domainnamen gegen Blacklists verglichen werden, sind grundsätzlich positiv zu bewerten. Dabei ist es für den Betroffenen Empfänger der Spams zunächst egal, ob die IP eine real benutzte oder eine per HTTP-Header-Manipulation gefälschte ist. Real benutzte IPs können von gekaperten PCs oder anderen Systemen stammen; gefälschte IP-Adressen werden ggf. immer wieder eingesetzt. Egal woher die Spam-Nachricht kommt : Man möchte Sie von den bekannten Adressen abweisen.

Aber die Effektivität dieser Maßnahme hängt extrem von der Aktualität der entsprechenden Listen ab. Meine persönliche Erfahrung ist die, dass man in der Praxis einem Teil der Bot-Networks der Spammer immer hinterherhinkt. Ich konnte in meiner (bescheidenen) Praxis immer wieder feststellen, dass sich die Wellen von SPAM-Angriffen systematisch über bestimmte Regionen verteilen. Bei Misserfolg eines gezielten SPAM-Angriffes wechselt die Region der angreifenden IP-Adressen - und es wird auf immer wieder auf neue, "frische" IP-Adressen zugegriffen. Zu bedenken ist dabei, dass IP-Adressen auch gefälscht sein können.

Ein Problem stellen im Einzelfall auch "False Positives" der Blacklists dar - also IP-Adressen, die dort zu Unrecht landen. Ich denke aber, das sich dieses Thema auf Empfängerseite im Bedarfsfall auch durch eigenen White-Lists korrigieren läßt. I.d.R. melden sich nämlich wirklich wichtige Absender von realen Sendungen/Beiträgen bei dir, wenn auf deren Mails nie reagiert wird, weil die zugehörige IP des Absenders sich auf einer Spam-Liste befindet.

In jedem Fall gilt:
Blacklists (und auch Whitelists) stellen ein wichtiges Mittel in der Bekämpfung von Spam dar. Der Profi wird solche Listen auf Basis öffentlich zugänglicher Quellen in Datenbank-Tabellen laden und die Vergleiche im Zuge der Auswertung und des Unschädlich-Machens der meist per POST übertragenen Daten durchführen. Unter PHP wird man die im HTTP-Protokoll übergebene IP-Adresse aus dem $_SERVER-Array bestimmen. Die E-Mail-Adresse erhält man aus den Input-Feldern des Formulars für den empfangenen Eintrag.
- hier möchte ich am Rande den CSV-Service von "http://spam-ip.com/" lobend erwähnen.

Untersuchung des eingegangenen Beitragstextes und der E-Mail-Adresse des Absenders auf bestimmte Ausdrücke

Tja, hier schlägt die Stunde der regulären Ausdrücke und leider auch diverser Sprachkenntnisse. Erschwerend ist die Tatsache, dass die Vielzahl der Ausdrucksvarianten in verschiedenen Sprachen, die man theoretisch abfangen muss, beliebig groß zu sein scheint.

In einem konkreten Fall, der den Anlaß zu diesem Artikel gegeben hat, habe ich mich in regelmäßigen Abständen in einem Gästebuch durch alle Varianten euphorischer englischer Ausdrücke wie "excellent website", "truly important contents", "fantastic experience to ...", bla, bla, bla durchgekämpft, um nach ca. einem Jahr den gleichen Krieg auf Französisch anfangen zu müssen. Von den diversen Ausdrücken aus dem Bereich des Unterleibs, der Altersvorsorge, der Pharma- und Drogen-Branche ganz zu schweigen.

In der Praxis musste ich auch feststellen, dass professionelle Spammer die Reichweite eigener Ausdrucks- und Wortfilter systematisch austesten. Dies geschieht in Wellen, in denen der Erfolg neuer Phrasen erprobt wird, bis ein bestimmtes Vokabular durchkommt. Und so dreht man unendlich an der Eskalationsschraube .... Kein Spass !

Nein, will man nicht eine wahrlich lexikalische Arbeit leisten, steht man hier ohne eine extrem gute Strategie und ohne ein lernendes Verfahren auf Dauer auf verlorenem Posten. Eigene Filter auf Basis sprachbezogener Listen verdächtiger Ausdrücke helfen nur, wenn die lexikalische Erfassung durch parallel durchgeführte andere Kriterien-Prüfungen gestützt wird - sprich: die Liste der erfassten Negativ-Ausdrücke muss automatisch auf Basis der Inhalte von Text-Eingängen, die aus anderen Gründen als Spam verworfen wurden, erweitert werden. Entsprechende Extraktionsalgorithmen sind allerdings nicht einfach zu schreiben - nicht jeder Ausdruck einer Sprache ist für sich genommen problematisch. Hier muss man entweder Semantik in reguläre Ausdrücke umsetzen oder im nachhinein statistische Auswertungen bestimmter Wortkombinationen durchführen. Beides keine Jobs, die man nebenbei erledigen kann.

Aufwandserhöhung für den Spammer durch Zeitfenster

Normalerweise limitiert man in der IT offene Zeitfenster durch einen maximalen Zeitintervallwert, der ab einer bestimmten Anfangsaktion gesetzt wird. Im Fall von Spam-Abwehr geht man genau andersherum vor:

Man lässt eine Eingabe erst zu, wenn ein vorgegebenes minimales Zeitintervall überschritten wird. Der Grund ist einfach: Man will schnelle, maschinelle Eingabesequenzen unterbinden und dadurch den Aufwand für den Spammer erhöhen. Allerdings gibt es hier zwei Gegeneinwände:

Die Zeitintervallmessung auf dem Client ist leicht auszuhebeln. Das gilt bei unzureichender Programmierung aber leider auch für den Server. I.d.R. macht man den Aufruf einer Webseite und den zugehörigen Zeitstempel dort an einer Session-Id fest. Dies ist bei maschinellen Angriffen dann unzureichend, wenn das FBG mehrfach und praktisch zeitgleich unter Verwendung ein- und derselben Session-Id angegriffen wird. Was für den Angreifer einfach möglich ist.

Um dem entgegenzuwirken, sind in schnellen Session-Pufferspeichern Counter zu hinterlegen, die dann von allen parallel gestarteten Instanzen des Empfangsprogramms ausgelesen werden können. Die Counter sind hochzuzählen und auf Limits zu prüfen. Datenbankspeicher sind hierfür in der Regel zu langsam.

De zweite Einwand betrifft die Tatsache, das die Angreifer durch Messungen das gesetzte Zeitintervall herausfinden können und dann den Beitrag verzögert zum Server zurückliefern. Dann hat man aber immerhin die Frequenz für ein und dieselbe IP-Adresse abgesenkt.

Die dritte Einwand ist, dass diese Maßnahme nicht gegen Bot-Netzwerke schützt, die hochfrequent von verschiedenen IP-Adressen aus angreifen.

Dennoch sehe ich Zeitlimit-Verfahren als sinnvolle Hürden an. Ich habe in eigenen Spamfiltern gesehen,dass diese doch einen nicht unwesentlichen Teil von Angriffen blocken. Sie müssen aber hinreichend programmiert werden. Den Aufwand dafür sehe ich als relativ gering an.

Captcha-Verfahren in unterschiedlicher Ausprägung

Die Grundidee beim Einsatz von Captcha-Verfahren ist so simple wie im Kern überzeugend:
Man konfrontiert den Absender eines Blog/Foren/Gästebuch-Beitrags vor dem Transfer der Nachricht mit einer Aufgabe, die

  • etwas Zeit und Aufwand kostet,
  • möglichst den Einsatz von Fähigkeiten erfordert, die primär Menschen zu eigen sind,
  • nicht durch intelligente Algorithmen in kurzer Zeit gelöst werden kann,
  • nicht durch dumme, aber schnelle "brute force" Algorithmen von Computern ausgehebelt werden kann.

Woher kennt man einen Teil dieser Anforderungen ? Natürlich aus der Kryptographie. Wie wird das Anforderungsprofil umgesetzt?

Eine Gruppe von Captcha-Verfahren baut auf der verzerrten Anzeige von alphanumerischen Zeichensequenzen mit statistischer Auswahl und Reihenfolge der Zeichen vor einem diffusen, detailreichen Hintergrund auf. Die Idee ist hierbei, dass nur das menschliche Hirn die entsprechende Mustererkennung mit geringem Aufwand leisten kann. Ich persönlich halte das für eine Fehleinschätzung, akzeptiere aber den Einwand, dass der Einsatz hinreichender OCR-Verfahren auch für Spammer-Gruppen einen nicht unbeträchtlichen Aufwand darstellt und die Frequenz der Angriffe doch beträchtlich reduziert.

Eine andere Gruppe von Captcha-Verfahren generiert einfache Rechen-Aufgaben auf der Basis zufällig erzeugter Zahlen oder bekannter Begriffe.

Wovon hängt der Erfolg von Captcha-Verfahren ab? Vor allem davon, ob die Codes tatsächlich statistisch zufällig erzeugt werden! Leider ist das in vielen Fällen aber gar nicht der Fall. Hinter der Captcha-Erzeugung steckt i.d.R. ein Algorithmus, der sog. "Zufallszahlen" generiert. Das Ergebnis einer solchen Generierung ist nur "pseudo"-zufällig. Tatsächlich tauchen in den erzeugten Zahlen Muster und Sequenzen mit unterschiedlicher Periode auf. Dies erlaubt entweder die Vorhersage des erzeugten Codes oder aber zumindest einen hohe Wahrscheinlichkeit für einen positv erratenen Wert.

Ein typisches Beispiel hierfür liefert die PHP-Funktion rand(). Siehe hierzu etwa
http://www.random.org/analysis/
oder
http://programmers.stackexchange.com/questions/76229/predicting-the-output-of-phps-rand
http://stackoverflow.com/questions/12729459/is-it-possible-to-predict-rand0-10-in-php

http://www.suspekt.org/2008/08/17/mt_srand-and-not-so-random-numbers/

Und genau damit fangen die wirklichen Probleme von manchen Captcha-Programmen an. Dies gilt im besonderen dann, wenn die eingesetzten Algorithmen auch dem Spammer einsehbar sind.

Die Gefahr besteht dann nicht darin, dass der Spammer einen Weg findet, die Catcha-Abfrage zu umgehen. Die Gefahr besteht vielmehr in einer korrekten Vorhersage der Captcha-Codes durch den Spammer und der automatisierten Übergabe an das Programm zur Übernahme des FBG-Beitrags (und das zugehörige Captcha-Prüfprogramm).

Ich gehe auf dieses Thema im Detail im zweiten Artikel ein.

Meine Einschätzung von Captcha-Verfahren ist, dass diese ein sehr sinnvolles Mittel zur Spam-Abwehr darstellen, wenn die Zufallsgeneratoren gut sind und/oder dem Spammer der Algorithmus zur Zufallszahlen-Erzeugung nicht bekannt ist. Für beide Ziele kann man übrigens Web-Services heranziehen, wen einem der Aufwand zur eigenen Programmierung zu hoch sein sollte.

Diese Einschätzung von Captchas stützt sich auf konkrete Erfahrungen und Messungen. So wehre ich auf der von mir betreuten Website von ca. 200 Spamangriffen pro Tag auf das Gästebuch etwa 98% aufgrund fehlerhafter Captcha-Codes ab. Beim Rest besteht der begründete Verdacht einer manuellen Eingabe der Captcha-Codes durch den Spammer für Tests.

Ergänzung 13.03.2013:

Ich habe einige E-Mails erhalten, die meine Einschätzung von Captchas zu positiv finden. Die Gegenargumente machen sich fest

  • an der nicht gegebenen Barrierefreiheit visueller Captchas,
  • an einer evtl. nervenden und abschreckenden Wirkung auf Kunden (Nichtlesbarkeit, mehrfaches Neugenerierung des Captchas erforderlich, bevor man den alphanmerischen Code erkennt),
  • an eventuellen OCR-basierten Maßnahmen der Spammer zum Auslesen der visuellen Captcha-Codes.

Ich gebe zu: Diese Punkte haben alle ihre Berechtigung. Vor allem das mit der Nicht-Barriere-Freiheit. (Diesen Punkt habe ich ja in einem früheren Artikel über den E-Mail-Schutz auf Impressum-Seiten ja ironischerweise selbst ins Feld geführt). Aber es gibt halt auch noch die Klasse der aufgabenbasierten, rein textuell dargestellten Captchas. Man sollte daher auf Webseiten durchaus alternative Captcha-Verfahren anbieten.

Webbasierte Antispam-Dienste

Es gibt Dienste im Internet, die die Überprüfung von Blog- und Gästebuchbeiträgen auf Spam-Eigenschaften übernehmen. Für die "FBG"
existieren in der Regel entsprechende Plugins, die den Datenaustausch mit dem Service übernehmen.

Der Vorteil dieser Services besteht in einer guten Erkennungsrate.

Der Nachteil ist, dass viele der Anti-Spam-Service-Provider im Ausland (oft den USA) sitzen und dass "alle" FBG-Beiträge mit Ihrem gesamten Inhalt zum Dienstanbieter übermittelt werden - samt IP- und Mail-Adresse des Absenders des "FBG"-Beitrags. Dies betrifft dann auch die guten, unbescholtenen FBG-Nutzer.

Hier bestehen potentielle Konflikte mit dem Datenschutz: Eigentlich muss der Absender sein Einverständnis dazu geben, dass sein Beitrag samt seiner persönlichen E-Mail-Adresse an Dritte weitergeleitet wird. Im besonderen dann, wenn im Land des Service-Anbieters keine wirksamen Datenschutzregeln gelten.

Das erhöht den Aufwand für den FBG-Betreiber beträchtlich, denn man muss eine entsprechende Botschaft an den Sender des Beitrags loswerden, bevor der Übertragungsvorgang zum Blog oder Gästebuch beginnt. Dies bedeutet zusätzlichen Entwicklungsaufwand und/oder eine Modifikation der Beitragshandhabung im Blog/Gästebuch-Programm. Viele Opensource-Anwendungen beinhalten entsprechende Freigabemechanismen durch den Beitragsschreiber nicht von Haus aus - von einer Protokollierung der Freigabe ganz zu schweigen.

Zudem würden viele Besucher eines FBGs eine explizite Warnung und Aufforderung zur Freigabe der Datenübermittlung an z.B. US-amerikanische Server womöglich irritierend finden. Es regt sich dann unwillkürlich auch ein Zweifel an der technischen Kompetenz der FBG-Betreiber. Nach dem Motto: Warum bekommen die das nicht selber hin ?

Ein weiterer Nachteil des Antspam-Service-Angebots im Web besteht darin, dass die Inanspruchnahme der meisten dieser Services für den Betrieb kommerzieller FBG-Seiten kostenpflichtig ist.

Methode versteckter Input-Felder, die von Spam-Bots ausgefüllt werden

Nachtrag 13.03.2013: Ich möchte nicht versäumen, auf zwei Artikel hinzuweisen, die noch eine andere Methode der Spam-Abwehr diskutieren:

http://www.1ngo.de/web/captcha-spam.html (Der Autor vertritt übrigens die durchaus interessante und diskussionswürdige Meinung, dass Captchas "Blödsinn" seien.)

http://www.fastix.org/Abwehr+von+Spam+in+Gaestebuechern-+Kommentaren-+Foren+und+Kontaktseiten.htm

Die Methode besteht darin, per CSS versteckte Input-Felder anzubieten, die "dumme" Spam-Bots aber im HTML-Code "sehen" und typischerweise ausfüllen. Das Programm auf dem Server, das die Beiträge entgegen nimmt, wertet dann die "unsichtbaren" Felder aus, die ein menschlicher Besucher der Webseite leer gelassen hätte. Steht trotzdem etwas in einem solchen Feld, ist ein maschineller Zugriff zu Spamzwecken wahrscheinlich.

Ich kann mir gut vorstellen, dass das eine wirksame Methodik ist, die ich selber aber bislang nicht eingesetzt habe. Ich kann daher keine eigenen Erfahrungswerte angeben und verweise diesbzgl. auf die angegebenen Artikel.

Fazit

Von den beschriebenen Maßnahmen gefällt mir persönlich am besten der Vergleich der IP- und E-Mail-Adressen mit lokalen Blacklists. Diese müssen allerdings regelmäßig aus zuverlässigen Quellen upgedated werden.

Blacklists sind z.B. erhältlich bei:
http://www.heise.de/ix/NiX-Spam-DNSBL-und-Blacklist-zum-Download-499634.html
http://spam-ip.com/spam-blacklist.php

Ob die Qualität ausreichend ist, mag jeder selber beurteilen. Bei der Verwendung importierter Listen gibt es ja zwei Risiken:

  1. Die Listen sind für eine eigene Auswertungsmaschinerie zu groß. (Beim Einsatz indizierter Datenbanken eher unwahrscheinlich.)
  2. Die Listen enthaltene zu viele Falsch-Einträge.

Interessant finde ich in diesem Zusammenhang den Ansatz von iX, die Einträge der Listen dynamisch auch wieder zu reduzieren. Ergänzend sei auch auf die Möglichkeit der Online-Anbindung an Listen von bestimmten Service-Providern über Webservice-Schnittstellen hingewiesen.

Blacklist-Maßnahmen können aus meiner Sicht gut mit Captcha-Verfahren kombiniert werden. Der Algorithmus des zugehörigen Captcha-Zufallszahlengenerators ist aber kritisch zu beurteilen und geheim zu halten. Im Falle des Einsatzes von Opensource-FBG-Anwendungen empfiehlt sich an dieser Stelle deshalb eine geeignete Modifikation des PRNG-Algorithmus durch den Betreiber vor dem Produktiv-Einsatz des FBG. (Mehr dazu im zweiten Artikel).

Hilfreich gegen hochfrequente Spam-Angriffe sind auch Zeitlimits für die Mindestdauer der Beitragserzeugung und Limits für den Zeitabstand zwischen eintreffenden Beiträgen.

Auf der Basis bestimmter Kriterien für abgewiesene Beiträge kann man dann sukzessive eigene gut fundierte Blacklists von IP-Adressen oder IP-Adress-Bereichen erstellen.

Im kommenden zweiten Teil diskutiere ich speziell potentielle Tücken PHP-basierter Captchas.