Wie kann ich mit base64 verschlüsselte Spam-E-Mails ablehnen?


12

Ich habe gerade ein paar Mails mit ähnlichen Inhalten erhalten, die mit base64 verschlüsselt wurden. Jetzt möchte ich diese Art von E-Mails mit Body Check ablehnen oder verwerfen.

Vorher hatte ich in meinen body_checks so etwas:

/Quanzhoucooway/ DISCARD

Da die Nachricht jedoch verschlüsselt ist, wird dieses Schlüsselwort nicht erkannt.

Hier ist eine Base64-codierte Nachricht:

DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==

Was ist die beste Vorgehensweise, um solche E-Mails zu blockieren?


3
Richtige Spam-Filterung, die sich auf den tatsächlich dekodierten Inhalt der Nachricht bezieht?
ceejayoz

Könnten Sie präziser sein, welche Art von Mechanismus sollte verwendet werden? Ich benutze bereits Spamassassin und es leistet großartige Arbeit im Kampf gegen Spam.
user134969

Ich würde sie mit der Fehlermeldung "Nicht Base64-codieren Nachrichtentexte" MTA-ablehnen.
Joshudson

Antworten:


20

Tun Sie dies nicht mit Postfix, body_checksondern schreiben Sie stattdessen eine Spamassassin-Regel . Spamassain entschlüsselt den Nachrichtentext, bevor die Regeln angewendet werden. Etwas wie:

body     LOCAL_QUANZHOUCOOWAY  /Quanzhoucooway/
score    LOCAL_QUANZHOUCOOWAY  7.0
describe LOCAL_QUANZHOUCOOWAY  Block word Quanzhoucooway

Diese Regeln gehören /etc/mail/spamassassin/local.cf(oder ~/.spamassassin/user_prefs).


1
Funktioniert dies auch, wenn dieses Schlüsselwort mit base64 codiert ist, wie dieser Inhalt dort oben?
user134969

2
Ja. Jemand hat meine Antwort bereits bearbeitet, um dies zu klären. Dank dieser anonymen Person! :)
Esa Jokinen

9

Technisch gesehen , Sie könnten direkt die Base64 - codierte Daten nach Schlüsselwörtern filtern. Ich sage nicht, dass es eine praktische oder vernünftige Sache ist, angesichts der Existenz besserer und einfacherer Alternativen (wie z. B. in Esas Antwort oben beschrieben), aber es ist möglich.

Der Trick besteht darin, zu erkennen, dass die Base64-Codierung eine deterministische Zuordnung von 3-Byte-Blöcken nicht codierter Rohdaten zu 4-Zeichen-Blöcken mit Base64-Zeichen ist. Jedes Mal, wenn eine bestimmte Folge von 3-Byte-Blöcken in den unverschlüsselten Daten erscheint, erscheint dieselbe Folge von 4-Zeichen-Blöcken in der verschlüsselten Version.

Wenn Sie beispielsweise die Zeichenfolge Quanzhoucoowayin einen Base64-Encoder eingeben , erhalten Sie die Ausgabe UXVhbnpob3Vjb293YXk=. Da die Länge der Eingabe nicht ein Vielfaches von 3 Bytes ist, enthält die Ausgabe am Ende eine Auffüllung. Wenn wir jedoch die letzten =Zeichen und das letzte tatsächliche base64-Zeichen löschen k(da es auch einige Auffüllbits codiert), erhalten wir die Zeichenfolge UXVhbnpob3Vjb293YXdas ist gewährleistet in den Base64-kodierten Daten angezeigt werden, wenn das Byte - Tripletts Qua, nzh, ouc, oowund das teilweise Triplett ayim Eingang in dieser Reihenfolge angezeigt.

Natürlich Quanzhoucoowaybeginnt die Saite möglicherweise nicht genau an der Triplettgrenze. Wenn wir beispielsweise XQuanzhoucoowaystattdessen den String codieren , erhalten wir die Ausgabe WFF1YW56aG91Y29vd2F5, die völlig anders aussieht. Diesmal ist die Eingabelänge durch drei teilbar, sodass am Ende keine Füllzeichen zu verwerfen sind. Wir müssen jedoch die ersten beiden Zeichen ( WF) verwerfen, die jeweils einige der Bits aus dem vorangestellten XByte codieren , und uns dabei belassen F1YW56aG91Y29vd2F5.

Schließlich XXQuanzhoucoowayliefert die Base64-Codierung die Ausgabe WFhRdWFuemhvdWNvb3dheQ==, die an beiden Enden mit Padding versehen ist. Wenn wir die ersten drei Zeichen WFh(die das XXPräfix codieren ) und die letzten drei Zeichen Q==(die das Null-Bit-Auffüllen am Ende codieren ) entfernen , bleibt die Zeichenfolge übrig RdWFuemhvdWNvb3dhe. Somit erhalten wir die folgenden drei base64-codierten Zeichenfolgen:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

von denen (mindestens) einer in der base64-codierten Form einer Eingabezeichenfolge erscheinen muss, die das Wort enthält Quanzhoucooway.

Wenn Sie Pech haben, kann der base64-Encoder natürlich einen Zeilenumbruch zwischen zwei codierten Triplets einfügen. (In Ihrer Beispielnachricht steht beispielsweise eine zwischen F1YW56und aG91Y29vd2F5.) Um diese Zeichenfolgen zuverlässig mit regulären Ausdrücken abzugleichen, benötigen Sie beispielsweise Folgendes (mithilfe der PCRE-Syntax):

/UXVh\s*bnpo\s*b3Vj\s*b293\s*YX/ DISCARD
/F1\s*YW56\s*aG91\s*Y29v\s*d2F5/ DISCARD
/R\s*dWFu\s*emhv\s*dWNv\s*b3dh\s*e/ DISCARD

Das Erzeugen dieser Muster von Hand ist etwas mühsam, aber es wäre nicht schwer, ein einfaches Skript zu schreiben, um dies in Ihrer bevorzugten Programmiersprache zu tun, zumindest solange es einen Base64-Encoder bietet.

Wenn Sie es wirklich wollten, können Sie sogar eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung implementieren, indem Sie das Schlüsselwort mit base64 sowohl in Klein- als auch in Großbuchstaben codieren und sie zu einem regulären Ausdruck kombinieren, der einer beliebigen Kombination von beiden entspricht. Beispielsweise ist die Base64-Codierung von " quanzhoucoowayis" cXVhbnpob3Vjb293YXk=und die von " QUANZHOUCOOWAYis". Daher gilt folgende UVVBTlpIT1VDT09XQVk=Regel:

/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD

wird auf jeden Fall mit dem base64-codierten Wort "Quanzhoucooway" übereinstimmen, vorausgesetzt, es beginnt an einer Triplettgrenze. Die anderen beiden entsprechenden regulären Ausdrücke für die verschobenen Versionen zu generieren, bleibt als Übung. ;)

Leider wird es schnell unpraktisch, etwas Komplizierteres zu tun als einen einfachen Teilstringabgleich wie diesen. Aber zumindest ist es ein ordentlicher Trick. Im Prinzip kann es sogar nützlich sein, wenn Sie aus irgendeinem Grund SpamAssassin oder einen anderen Filter nicht verwenden können, der die Base64-Codierung vor dem Filtern decodieren kann. Aber wenn Sie das können, anstatt solche Hacks zu verwenden, sollten Sie es auf jeden Fall tun.


1
Ja, das ist möglich . Nicht so praktisch und nicht für jedes Wort etwas, das Sie noch einmal tun möchten. +1 für die Erklärung: Das ist vielleicht nicht sehr nützlich, aber auf jeden Fall lehrreich!
Esa Jokinen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.