Acabei de receber alguns e-mails com conteúdo semelhante, codificados com base64. Agora, quero rejeitar ou descartar esse tipo de e-mail usando a verificação do corpo.
Antes que eu tivesse no meu corpo, verifica algo como isto:
/Quanzhoucooway/ DISCARD
Mas, como a mensagem é codificada, a palavra-chave não será detectada.
Aqui está uma mensagem codificada em base64:
DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==
Então, qual é a melhor prática para bloquear esse tipo de e-mail?
Respostas:
Não faça isso com o Postfix,
body_check
mas escreva uma regra para o Spamassassin . Spamassain decodifica o corpo da mensagem antes de aplicar suas regras. Algo como:Essas regras pertencem a
/etc/mail/spamassassin/local.cf
(ou~/.spamassassin/user_prefs
).fonte
Tecnicamente, você pode filtrar diretamente os dados codificados em base64 por palavras-chave. Não estou dizendo que é uma coisa prática ou razoável, dada a existência de alternativas melhores e mais simples (como descrito, por exemplo, na resposta da Esa acima), mas é possível.
O truque é perceber que a codificação base64 é um mapeamento determinístico de blocos de 3 bytes de dados não codificados brutos em blocos de 4 caracteres de caracteres base64. Assim, sempre que uma determinada sequência de blocos de 3 bytes aparecer nos dados não codificados, a mesma sequência de blocos de 4 caracteres aparecerá na versão codificada.
Por exemplo, se você digitar a string
Quanzhoucooway
em um codificador base64 , obterá a saídaUXVhbnpob3Vjb293YXk=
. Como o comprimento da entrada não é múltiplo de 3 bytes, a saída contém algum preenchimento no final, mas se soltarmos os=
sinais finais e o último caractere base64 realk
(já que ele também codifica alguns bits de preenchimento), obtemos a sequênciaUXVhbnpob3Vjb293YX
que seja garantida a aparecer nos dados codificados-base64 sempre que os tripletos de byteQua
,nzh
,ouc
,oow
e o tripleto parcialay
aparecem na entrada em que ordem.Mas, é claro, a sequência
Quanzhoucooway
pode não começar exatamente no limite dos trigêmeos. Por exemplo, se codificarmos a stringXQuanzhoucooway
, obteremos a saídaWFF1YW56aG91Y29vd2F5
, que parece completamente diferente. Desta vez, o comprimento da entrada é divisível por três; portanto, não há caracteres de preenchimento para descartar no final, mas precisamos descartar os dois primeiros caracteres (WF
) que codificam alguns bits doX
byte precedido , deixando-nos comF1YW56aG91Y29vd2F5
.Finalmente, a codificação base64
XXQuanzhoucooway
fornece a saídaWFhRdWFuemhvdWNvb3dheQ==
, que possui preenchimento nas duas extremidades. Removendo os três primeiros caracteresWFh
(que codificam oXX
prefixo) e os três últimosQ==
(que codificam o preenchimento de zero bits no final), ficamos com a stringRdWFuemhvdWNvb3dhe
. Assim, obtemos as seguintes três cadeias codificadas em base64:dos quais (pelo menos) um deve aparecer na forma codificada em base64 de qualquer sequência de entrada que contenha a palavra
Quanzhoucooway
.Obviamente, se você não tiver sorte, o codificador base64 pode inserir uma quebra de linha no meio deles, entre dois trigêmeos codificados. (Sua mensagem de exemplo, por exemplo, tem uma entre
F1YW56
eaG91Y29vd2F5
.) Portanto, para corresponder essas strings com regexps, você precisa de algo como o seguinte (usando a sintaxe PCRE):Gerar esses padrões manualmente é meio tedioso, mas não seria difícil escrever um script simples para fazê-lo na sua linguagem de programação favorita, pelo menos desde que ele forneça um codificador base64.
Se você realmente quisesse, poderia implementar a correspondência sem distinção entre maiúsculas e minúsculas, codificando base64 tanto a versão em minúscula quanto a maiúscula da palavra-chave e combinando-as em uma regexp que corresponda a qualquer combinação delas. Por exemplo, a codificação base64 de
quanzhoucooway
écXVhbnpob3Vjb293YXk=
enquantoQUANZHOUCOOWAY
é deUVVBTlpIT1VDT09XQVk=
, portanto, a regra:em qualquer caso, corresponderá à palavra codificada em base64 "Quanzhoucooway", desde que comece em um limite de trigêmeo. A geração dos outros dois regexps correspondentes para as versões deslocadas é deixada como um exercício. ;)
Infelizmente, fazer algo mais complicado do que uma simples correspondência de substring como essa rapidamente se torna impraticável. Mas pelo menos é um truque legal. Em princípio, isso pode até ser útil se, por algum motivo, você não puder usar o SpamAssassin ou qualquer outro filtro que possa decodificar a codificação base64 antes da filtragem. Mas se você pode fazer isso, em vez de usar hacks como esse, certamente deveria.
fonte