Come posso rifiutare l'e-mail di spam con codifica base64?


11

Ho appena ricevuto un paio di mail con contenuti simili che sono stati codificati con base64. Ora voglio rifiutare o scartare questo tipo di e-mail usando il controllo del corpo.

Prima di avere nel mio corpo_controlla qualcosa del genere:

/Quanzhoucooway/ DISCARD

Ma poiché il messaggio è codificato, la parola chiave non verrà rilevata.

Ecco un messaggio con codifica base64:

DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==

Qual è la migliore pratica per bloccare questo tipo di email?


3
Filtro antispam adeguato che agisce sul contenuto decodificato effettivo del messaggio?
Ceejayoz,

Potresti essere più specifico, che tipo di meccanismo dovrebbe essere usato? Sto già usando spamassassin e sta facendo un ottimo lavoro quando si tratta di combattere lo spam.
user134969,

Li rifiuterei MTA con un messaggio di errore "Non codificare base64 corpi dei messaggi".
joshudson,

Risposte:


19

Non farlo con Postfix body_checkma scrivi invece una regola Spamassassin . Spamassain decodifica il corpo del messaggio prima di applicare le sue regole. Qualcosa di simile a:

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

Queste regole appartengono a /etc/mail/spamassassin/local.cf(o ~/.spamassassin/user_prefs).


1
Funzionerà anche se quella parola chiave è codificata con base64, come quel contenuto lassù?
user134969,

2
Sì. Qualcuno ha già modificato la mia risposta per chiarire questo. Grazie a quella persona anonima! :)
Esa Jokinen

9

Tecnicamente, è possibile filtrare direttamente i dati codificati in base64 per le parole chiave. Non sto dicendo che sia una cosa pratica o ragionevole da fare, data l'esistenza di alternative migliori e più semplici (come descritto ad esempio nella risposta di Esa sopra), ma è possibile.

Il trucco è rendersi conto che la codifica base64 è una mappatura deterministica di blocchi a 3 byte di dati grezzi non codificati in blocchi di 4 caratteri di caratteri base64. Pertanto, ogni volta che una determinata sequenza di blocchi di 3 byte appare nei dati non codificati, la stessa sequenza di blocchi di 4 caratteri apparirà nella versione codificata.

Ad esempio, se inserisci la stringa Quanzhoucoowayin un codificatore base64 , otterrai l'output UXVhbnpob3Vjb293YXk=. Poiché la lunghezza dell'input non è un multiplo di 3 byte, l'output contiene un po 'di riempimento alla fine, ma se eliminiamo i =segni finali e l'ultimo carattere base64 effettivok (poiché codifica anche alcuni bit di riempimento), otteniamo la stringa UXVhbnpob3Vjb293YXche è garantita a comparire nei dati codificati in base 64 ogniqualvolta le triplette byte Qua, nzh, ouc, oowe la tripletta parziale ayappaiono in ingresso in questo ordine.

Ma, naturalmente, la stringa Quanzhoucooway potrebbe non iniziare esattamente al limite della tripletta. Ad esempio, se XQuanzhoucoowayinvece codifichiamo la stringa , otteniamo l'output WFF1YW56aG91Y29vd2F5, che sembra completamente diverso. Questa volta, la lunghezza dell'input è divisibile per tre, quindi non ci sono caratteri di riempimento da scartare alla fine, ma dobbiamo scartare i primi due caratteri ( WF) che codificano ciascuno dei bit dal Xbyte anteposto , lasciandoci con F1YW56aG91Y29vd2F5.

Infine, la codifica base64 XXQuanzhoucoowayfornisce l'output WFhRdWFuemhvdWNvb3dheQ==, che ha il riempimento ad entrambe le estremità. Rimozione dei primi tre caratteri WFh(che codificano ilXX prefisso) e gli ultimi tre caratteri Q==(che codificano il riempimento con bit zero alla fine), restiamo con la stringa RdWFuemhvdWNvb3dhe. Pertanto, otteniamo le seguenti tre stringhe con codifica base64:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

di cui (almeno) uno deve apparire nella forma codificata in base64 di qualsiasi stringa di input contenente la parola Quanzhoucooway.

Naturalmente, se sei sfortunato, l'encoder base64 può inserire un'interruzione di linea nel mezzo di essi, tra due triplette codificate. (Il tuo messaggio di esempio, ad esempio, ha uno tra F1YW56e aG91Y29vd2F5.) Pertanto, per abbinare in modo affidabile queste stringhe con regexps, avresti bisogno di qualcosa di simile al seguente (usando la sintassi 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

Generare questi schemi a mano è un po 'noioso, ma non sarebbe difficile scrivere un semplice script per farlo nel tuo linguaggio di programmazione preferito, almeno fintanto che fornisce un codificatore base64.

Se lo desideri davvero, potresti persino implementare la corrispondenza senza distinzione tra maiuscole e minuscole mediante la codifica base64 sia della versione minuscola che maiuscola della parola chiave e combinandole in una regexp che corrisponde a qualsiasi combinazione di esse. Ad esempio, la codifica base64 di quanzhoucoowayis cXVhbnpob3Vjb293YXk=while quella di QUANZHOUCOOWAYis UVVBTlpIT1VDT09XQVk=, quindi la regola:

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

corrisponderà in ogni caso alla parola codificata in base64 "Quanzhoucooway", a condizione che inizi su un confine di tripletto. Generare gli altri due regexps corrispondenti per le versioni spostate viene lasciato come esercizio. ;)

Purtroppo, fare qualcosa di più complicato del semplice abbinamento di sottostringhe come questo diventa rapidamente poco pratico. Ma almeno è un trucco accurato. In linea di principio, potrebbe anche essere utile, se per qualche motivo non è possibile utilizzare SpamAssassin o qualsiasi altro filtro in grado di decodificare la codifica base64 prima del filtraggio. Ma se riesci a farlo, invece di usare hack come questo, dovresti sicuramente farlo.


1
Sì, è possibile ; non così pratico, e non qualcosa che vorresti fare di nuovo per ogni parola. +1 per la spiegazione: mentre questo potrebbe non essere molto utile, è sicuramente istruttivo!
Esa Jokinen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.