Je viens de recevoir quelques mails avec un contenu similaire qui ont été encodés en base64. Maintenant, je veux rejeter ou supprimer ce type d'e-mails à l'aide de la vérification corporelle.
Avant j'avais dans mon corps_checks quelque chose comme ça:
/Quanzhoucooway/ DISCARD
Mais puisque le message est encodé, ce mot-clé ne sera pas détecté.
Voici un message encodé en base64:
DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==
Quelle est donc la meilleure pratique pour bloquer ce type d'e-mails?
Réponses:
Ne faites pas cela avec Postfix
body_check
mais écrivez plutôt une règle Spamassassin pour cela. Spamassain décode le corps du message avant d'appliquer ses règles. Quelque chose comme:Ces règles appartiennent à
/etc/mail/spamassassin/local.cf
(ou~/.spamassassin/user_prefs
).la source
Techniquement, vous pouvez filtrer directement les données encodées en base64 pour les mots clés. Je ne dis pas que c'est une pratique ou une chose raisonnable à faire, étant donné l'existence de meilleures et des solutions plus simples (comme décrit par exemple dans la réponse ci - dessus Esa), mais il est possible.
L'astuce consiste à réaliser que le codage base64 est un mappage déterministe de blocs de 3 octets de données brutes non codées en blocs de 4 caractères de caractères base64. Ainsi, chaque fois qu'une certaine séquence de blocs de 3 octets apparaît dans les données non codées, la même séquence de blocs de 4 caractères apparaîtra dans la version codée.
Par exemple, si vous entrez la chaîne
Quanzhoucooway
dans un encodeur base64 , vous obtiendrez la sortieUXVhbnpob3Vjb293YXk=
. Étant donné que la longueur de l'entrée n'est pas un multiple de 3 octets, la sortie contient un remplissage à la fin, mais si nous supprimons les=
signes finaux et le dernier caractère base64 réelk
(car il code également certains bits de remplissage), nous obtenons la chaîneUXVhbnpob3Vjb293YX
qui est garanti pour apparaître dans les données codées en base64 chaque fois que les triplets d'octetsQua
,nzh
,ouc
,oow
et le triplet partielleay
apparaissent dans l'entrée dans cet ordre.Mais, bien sûr, la chaîne
Quanzhoucooway
peut ne pas démarrer exactement à la limite du triplet. Par exemple, si nous encodons la chaîne à laXQuanzhoucooway
place, nous obtenons la sortieWFF1YW56aG91Y29vd2F5
, qui semble complètement différente. Cette fois, la longueur d'entrée est divisible par trois, il n'y a donc pas de caractères de remplissage à éliminer à la fin, mais nous devons éliminer les deux premiers caractères (WF
) qui codent chacun certains des bits de l'X
octet ajouté , nous laissant avecF1YW56aG91Y29vd2F5
.Enfin, le codage base64
XXQuanzhoucooway
donne la sortieWFhRdWFuemhvdWNvb3dheQ==
, qui a un rembourrage aux deux extrémités. En supprimant les trois premiers caractèresWFh
(qui codent leXX
préfixe) et les trois derniers caractèresQ==
(qui codent le remplissage zéro bit à la fin), nous nous retrouvons avec la chaîneRdWFuemhvdWNvb3dhe
. Ainsi, nous obtenons les trois chaînes codées en base64 suivantes:dont (au moins) un doit apparaître sous la forme codée en base64 de toute chaîne d'entrée contenant le mot
Quanzhoucooway
.Bien sûr, si vous n'avez pas de chance, l'encodeur base64 peut insérer un saut de ligne au milieu d'entre eux, entre deux triplets encodés. (Votre exemple de message, par exemple, en a un entre
F1YW56
etaG91Y29vd2F5
.) Ainsi, pour faire correspondre de manière fiable ces chaînes avec des expressions rationnelles, vous aurez besoin de quelque chose comme ce qui suit (en utilisant la syntaxe PCRE):Générer ces modèles à la main est un peu fastidieux, mais il ne serait pas difficile d'écrire un script simple pour le faire dans votre langage de programmation préféré, au moins tant qu'il fournit un encodeur base64.
Si vous le vouliez vraiment, vous pourriez même implémenter une correspondance insensible à la casse en codant en base64 les versions minuscule et majuscule du mot-clé et en les combinant dans une expression rationnelle qui correspond à n'importe quelle combinaison d'entre eux. Par exemple, le codage base64 de
quanzhoucooway
estcXVhbnpob3Vjb293YXk=
alors que celui deQUANZHOUCOOWAY
estUVVBTlpIT1VDT09XQVk=
, donc la règle:correspondra au mot encodé en base64 "Quanzhoucooway" dans tous les cas, à condition qu'il commence sur une limite de triplet. La génération des deux autres expressions rationnelles correspondantes pour les versions décalées est laissée en exercice. ;)
Hélas, faire quelque chose de plus compliqué que la simple correspondance de sous-chaînes comme celle-ci devient rapidement impossible. Mais au moins, c'est un bon truc. En principe, cela pourrait même être utile si, pour une raison quelconque, vous ne pouviez pas utiliser SpamAssassin ou tout autre filtre capable de décoder l'encodage base64 avant le filtrage. Mais si vous pouvez le faire, au lieu d'utiliser des hacks comme celui-ci, vous devriez certainement le faire.
la source