Como posso rejeitar o e-mail de spam codificado em base64?

10

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 eu tinha no meu body_checks algo assim:

/Quanzhoucooway/ DISCARD

Mas como a mensagem é codificada, essa 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?

    
por user134969 03.10.2017 / 03:05

2 respostas

15

Não faça isso com o Postfix body_check mas escreva uma regra de Spamassassin para isso. Spamassain decodifica o corpo da mensagem antes de aplicar suas regras. Algo como:

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

Estas regras pertencem a /etc/mail/spamassassin/local.cf (ou ~/.spamassassin/user_prefs ).

    
por 03.10.2017 / 05:50
7

Tecnicamente, você poderia filtrar diretamente os dados codificados em base64 para 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 de Esa acima), mas é possível.

O truque é perceber que codificação base64 é um mapeamento determinístico de blocos de 3 bytes de dados brutos não codificados em 4 - blocos de caracteres de base64. Assim, sempre que uma certa seqüência de blocos de 3 bytes aparecer nos dados não codificados, a mesma seqüência de blocos de 4 caracteres aparecerá na versão codificada.

Por exemplo, se você inserir a string Quanzhoucooway em um codificador base64 , você obtenha a saída UXVhbnpob3Vjb293YXk= . Como o comprimento da entrada não é um múltiplo de 3 bytes, a saída contém algum preenchimento no final, mas se eliminarmos os sinais = finais e o último caractere base64 real k (pois também codifica alguns bits de preenchimento), obtemos a string UXVhbnpob3Vjb293YX que é garantida para aparecer nos dados codificados em base64 sempre que os trios de bytes Qua , nzh , ouc , oow e o trio parcial ay aparecem na entrada nessa ordem.

Mas, é claro, a string Quanzhoucooway pode não iniciar exatamente no limite do triplet. Por exemplo, se codificarmos a string XQuanzhoucooway , obteremos a saída WFF1YW56aG91Y29vd2F5 , que parece completamente diferente. Desta vez, o comprimento de entrada é divisível por três, então não há caracteres de preenchimento para descartar no final, mas precisamos descartar os dois primeiros caracteres ( WF ), que codificam alguns dos bits do prefended X byte, deixando-nos com F1YW56aG91Y29vd2F5 .

Por fim, a codificação base64 XXQuanzhoucooway fornece a saída WFhRdWFuemhvdWNvb3dheQ== , que tem preenchimento nas duas extremidades. Removendo os três primeiros caracteres WFh (que codificam o prefixo XX ) e os últimos três caracteres Q== (que codificam o preenchimento de bit zero no final), ficamos com a string RdWFuemhvdWNvb3dhe . Assim, obtemos as seguintes três strings codificadas em base64:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

dos quais (pelo menos) um deve aparecer na forma codificada na base64 de qualquer string de entrada contendo a palavra Quanzhoucooway .

É claro que, se você tiver azar, o codificador base64 pode inserir uma quebra de linha no meio deles, entre duas trincas codificadas. (Sua mensagem de exemplo, por exemplo, tem um entre F1YW56 e aG91Y29vd2F5 .) Assim, para corresponder essas sequências de forma confiável com regexps, você precisaria de algo como o seguinte (usando a sintaxe PCRE):

/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

Gerar esses padrões manualmente é meio entediante, mas não seria difícil escrever um script simples para fazer isso em sua linguagem de programação favorita, pelo menos enquanto ele fornecer um codificador de base64.

Se você realmente quisesse, poderia até mesmo implementar a correspondência sem distinção entre maiúsculas e minúsculas codificando a base64 da versão em minúscula e maiúscula da palavra-chave e combinando-as em uma expressão regular que corresponda a qualquer combinação delas. Por exemplo, a codificação base64 de quanzhoucooway é cXVhbnpob3Vjb293YXk= , enquanto que a de QUANZHOUCOOWAY é UVVBTlpIT1VDT09XQVk= , portanto, a regra:

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

corresponderá à palavra codificada em base64 "Quanzhoucooway" em qualquer caso, desde que comece em um limite de trinca. Gerar os outros dois regexps correspondentes para as versões deslocadas é deixado como um exercício. ;)

Ai, fazer qualquer coisa mais complicada do que uma correspondência simples de substring assim rapidamente se torna impraticável. Mas pelo menos é um truque legal. Em princípio, 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 de filtrar. Mas se você puder fazer isso, ao invés de usar hacks como esse, você certamente deveria.

    
por 03.10.2017 / 18:29

Tags