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?
Antworten:
Tun Sie dies nicht mit Postfix,
body_check
sondern schreiben Sie stattdessen eine Spamassassin-Regel . Spamassain entschlüsselt den Nachrichtentext, bevor die Regeln angewendet werden. Etwas wie:Diese Regeln gehören
/etc/mail/spamassassin/local.cf
(oder~/.spamassassin/user_prefs
).quelle
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
Quanzhoucooway
in einen Base64-Encoder eingeben , erhalten Sie die AusgabeUXVhbnpob3Vjb293YXk=
. 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öschenk
(da es auch einige Auffüllbits codiert), erhalten wir die ZeichenfolgeUXVhbnpob3Vjb293YX
das ist gewährleistet in den Base64-kodierten Daten angezeigt werden, wenn das Byte - TriplettsQua
,nzh
,ouc
,oow
und das teilweise Triplettay
im Eingang in dieser Reihenfolge angezeigt.Natürlich
Quanzhoucooway
beginnt die Saite möglicherweise nicht genau an der Triplettgrenze. Wenn wir beispielsweiseXQuanzhoucooway
stattdessen den String codieren , erhalten wir die AusgabeWFF1YW56aG91Y29vd2F5
, 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 vorangestelltenX
Byte codieren , und uns dabei belassenF1YW56aG91Y29vd2F5
.Schließlich
XXQuanzhoucooway
liefert die Base64-Codierung die AusgabeWFhRdWFuemhvdWNvb3dheQ==
, die an beiden Enden mit Padding versehen ist. Wenn wir die ersten drei ZeichenWFh
(die dasXX
Präfix codieren ) und die letzten drei ZeichenQ==
(die das Null-Bit-Auffüllen am Ende codieren ) entfernen , bleibt die Zeichenfolge übrigRdWFuemhvdWNvb3dhe
. Somit erhalten wir die folgenden drei base64-codierten Zeichenfolgen: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
F1YW56
undaG91Y29vd2F5
.) Um diese Zeichenfolgen zuverlässig mit regulären Ausdrücken abzugleichen, benötigen Sie beispielsweise Folgendes (mithilfe der PCRE-Syntax):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 "
quanzhoucooway
is"cXVhbnpob3Vjb293YXk=
und die von "QUANZHOUCOOWAY
is". Daher gilt folgendeUVVBTlpIT1VDT09XQVk=
Regel: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.
quelle