Bagaimana saya bisa menolak email spam yang disandikan base64?

11

Saya baru saja menerima beberapa surat dengan konten serupa yang disandikan dengan base64. Sekarang saya ingin menolak atau membuang email semacam ini menggunakan cek tubuh.

Sebelum saya di body_checks saya sesuatu seperti ini:

/Quanzhoucooway/ DISCARD

Tetapi karena pesan dikodekan, kata kunci tidak akan terdeteksi.

Berikut adalah pesan yang disandikan base64:

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

Jadi apa praktik terbaik untuk memblokir email semacam ini?

pengguna134969
sumber
3
Pemfilteran spam yang tepat yang bertindak berdasarkan isi pesan yang diterjemahkan secara aktual?
ceejayoz
Bisakah Anda lebih spesifik, mekanisme apa yang harus digunakan? Saya sudah menggunakan spamassassin dan melakukan pekerjaan dengan baik ketika berperang melawan spam.
user134969
Saya akan MTA-menolak mereka dengan pesan kesalahan "Jangan base64 encode badan pesan".
joshudson

Jawaban:

19

Jangan lakukan ini dengan Postfix body_checktetapi tulis aturan Spamassassin untuknya. Spamassain mendekodekan isi pesan sebelum menerapkan aturannya. Sesuatu seperti:

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

Aturan-aturan ini milik /etc/mail/spamassassin/local.cf(atau ~/.spamassassin/user_prefs).

Esa Jokinen
sumber
1
Apakah ini akan berfungsi bahkan jika kata kunci itu dikodekan dengan base64, seperti konten di sana?
user134969
2
Iya. Seseorang sudah mengedit jawaban saya untuk mengklarifikasi ini. Terima kasih kepada orang tak dikenal itu! :)
Esa Jokinen
9

Secara teknis, Anda bisa langsung memfilter data yang disandikan base64 untuk kata kunci. Saya tidak mengatakan itu praktis atau hal yang wajar untuk dilakukan, mengingat adanya alternatif yang lebih baik dan sederhana (seperti yang dijelaskan misalnya dalam jawaban Esa atas), tetapi adalah mungkin.

Kuncinya adalah menyadari bahwa pengkodean base64 adalah pemetaan deterministik dari blok 3-byte dari data mentah yang tidak di-enkripsi menjadi blok 4-karakter karakter base64. Dengan demikian, setiap saat urutan tertentu blok 3-byte muncul dalam data yang tidak di-kode, urutan yang sama dari blok 4-karakter akan muncul dalam versi yang disandikan.

Misalnya, jika Anda memasukkan string Quanzhoucoowayke dalam encoder base64 , Anda akan mendapatkan hasilnya UXVhbnpob3Vjb293YXk=. Karena panjang input bukan kelipatan 3 byte, output berisi beberapa padding di bagian akhir, tetapi jika kita membuang =tanda-tanda akhir dan karakter base64 aktual terakhir k(karena juga mengkodekan beberapa bit padding), kita mendapatkan string UXVhbnpob3Vjb293YXyang dijamin untuk muncul dalam data base64-encoded setiap kali si kembar tiga byte Qua, nzh, ouc, oowdan triplet parsial aymuncul di masukan dalam urutan itu.

Tapi, tentu saja, string Quanzhoucoowaymungkin tidak dimulai tepat pada batas triplet. Sebagai contoh, jika kita mengkodekan string XQuanzhoucooway, kita mendapatkan output WFF1YW56aG91Y29vd2F5, yang terlihat sangat berbeda. Kali ini, panjang input dapat dibagi tiga, jadi tidak ada karakter padding untuk dibuang di akhir, tetapi kita perlu membuang dua karakter pertama ( WF) yang masing-masing menyandikan beberapa bit dari Xbyte yang diawali , meninggalkan kita dengan F1YW56aG91Y29vd2F5.

Akhirnya, encoding base64 XXQuanzhoucoowaymemberikan output WFhRdWFuemhvdWNvb3dheQ==, yang memiliki padding di kedua ujungnya. Menghapus tiga karakter pertama WFh(yang menyandikan XXawalan) dan tiga karakter terakhir Q==(yang menyandikan padding bit nol di akhir), kita tinggal dengan string RdWFuemhvdWNvb3dhe. Dengan demikian, kita mendapatkan tiga string yang disandikan base64 berikut:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

di mana (setidaknya) seseorang harus muncul dalam bentuk yang disandikan base64 dari setiap string input yang mengandung kata Quanzhoucooway.

Tentu saja, jika Anda kurang beruntung, encoder base64 dapat memasukkan garis putus-putus di tengahnya, di antara dua kembar tiga yang disandikan. (Contoh pesan Anda, misalnya, memiliki satu di antara F1YW56dan aG91Y29vd2F5.) Jadi, untuk mencocokkan string ini dengan regexps secara andal, Anda akan membutuhkan sesuatu seperti berikut (menggunakan sintaks 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

Membuat pola-pola ini dengan tangan agak membosankan, tetapi tidak akan sulit untuk menulis skrip sederhana untuk melakukannya dalam bahasa pemrograman favorit Anda, setidaknya selama ia menyediakan encoder base64.

Jika Anda benar-benar menginginkannya, Anda bahkan bisa menerapkan pencocokan case-insensitive dengan base64 yang menyandi huruf kecil dan versi huruf besar kata kunci dan menggabungkannya ke dalam regexp yang cocok dengan kombinasi apa pun dari mereka. Sebagai contoh, encoding base64 dari quanzhoucoowayadalah cXVhbnpob3Vjb293YXk=sedangkan QUANZHOUCOOWAYadalah UVVBTlpIT1VDT09XQVk=, sehingga aturan:

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

akan cocok dengan kata yang disandikan base64 "Quanzhoucooway" dalam hal apa pun, asalkan dimulai pada batas triplet. Menghasilkan dua regexps terkait lainnya untuk versi bergeser dibiarkan sebagai latihan. ;)

Sayangnya, melakukan sesuatu yang lebih rumit daripada pencocokan substring sederhana seperti ini dengan cepat menjadi tidak praktis. Tapi setidaknya itu trik yang rapi. Pada prinsipnya, itu bahkan bisa berguna, jika Anda karena suatu alasan tidak dapat menggunakan SpamAssassin atau filter lain yang dapat mendekode pengkodean base64 sebelum memfilter. Tetapi jika Anda bisa melakukan itu, alih-alih menggunakan peretasan seperti ini, Anda tentu harus melakukannya.

Ilmari Karonen
sumber
1
Ya itu mungkin ; tidak begitu praktis, dan bukan sesuatu yang ingin Anda lakukan lagi untuk setiap kata. Memberi +1 pada penjelasan: meskipun ini mungkin tidak terlalu berguna, itu pasti mendidik!
Esa Jokinen