Como posso rejeitar o email de spam codificado em base64?

12

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?

user134969
fonte
3
Filtragem de spam adequada que atua no conteúdo decodificado real da mensagem?
ceejayoz
Você poderia ser mais específico, que tipo de mecanismo deve ser usado? Eu já estou usando o spamassassin e ele está fazendo um ótimo trabalho quando se trata de combater o spam.
user134969
Eu os rejeitaria pelo MTA com uma mensagem de erro "Não base64 codifica os corpos das mensagens".
Joshudson #

Respostas:

20

Não faça isso com o Postfix, body_checkmas escreva uma regra para o Spamassassin . 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

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

Esa Jokinen
fonte
1
Isso funcionará mesmo que essa palavra-chave seja codificada com base64, como o conteúdo lá em cima?
user134969
2
Sim. Alguém já editou minha resposta para esclarecer isso. Graças a essa pessoa anônima! :)
Esa Jokinen
9

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 Quanzhoucoowayem um codificador base64 , obterá a saída UXVhbnpob3Vjb293YXk=. 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 real k(já que ele também codifica alguns bits de preenchimento), obtemos a sequência UXVhbnpob3Vjb293YXque seja garantida a aparecer nos dados codificados-base64 sempre que os tripletos de byte Qua, nzh, ouc, oowe o tripleto parcial ayaparecem na entrada em que ordem.

Mas, é claro, a sequência Quanzhoucoowaypode não começar exatamente no limite dos trigêmeos. Por exemplo, se codificarmos a string XQuanzhoucooway, obteremos a saída WFF1YW56aG91Y29vd2F5, 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 do Xbyte precedido , deixando-nos com F1YW56aG91Y29vd2F5.

Finalmente, a codificação base64 XXQuanzhoucoowayfornece a saída WFhRdWFuemhvdWNvb3dheQ==, que possui preenchimento nas duas extremidades. Removendo os três primeiros caracteres WFh(que codificam o XXprefixo) e os três últimos Q==(que codificam o preenchimento de zero bits no final), ficamos com a string RdWFuemhvdWNvb3dhe. Assim, obtemos as seguintes três cadeias codificadas em base64:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

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 F1YW56e aG91Y29vd2F5.) Portanto, para corresponder essas strings com regexps, você precisa 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 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=enquanto QUANZHOUCOOWAYé de 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

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.

Ilmari Karonen
fonte
1
Sim, é possível ; não é tão prático e não é algo que você gostaria de fazer novamente para cada palavra. +1 para a explicação: embora isso possa não ser muito útil, certamente é educativo!
Esa Jokinen