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?
Jawaban:
Jangan lakukan ini dengan Postfix
body_check
tetapi tulis aturan Spamassassin untuknya. Spamassain mendekodekan isi pesan sebelum menerapkan aturannya. Sesuatu seperti:Aturan-aturan ini milik
/etc/mail/spamassassin/local.cf
(atau~/.spamassassin/user_prefs
).sumber
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
Quanzhoucooway
ke dalam encoder base64 , Anda akan mendapatkan hasilnyaUXVhbnpob3Vjb293YXk=
. 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 terakhirk
(karena juga mengkodekan beberapa bit padding), kita mendapatkan stringUXVhbnpob3Vjb293YX
yang dijamin untuk muncul dalam data base64-encoded setiap kali si kembar tiga byteQua
,nzh
,ouc
,oow
dan triplet parsialay
muncul di masukan dalam urutan itu.Tapi, tentu saja, string
Quanzhoucooway
mungkin tidak dimulai tepat pada batas triplet. Sebagai contoh, jika kita mengkodekan stringXQuanzhoucooway
, kita mendapatkan outputWFF1YW56aG91Y29vd2F5
, 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 dariX
byte yang diawali , meninggalkan kita denganF1YW56aG91Y29vd2F5
.Akhirnya, encoding base64
XXQuanzhoucooway
memberikan outputWFhRdWFuemhvdWNvb3dheQ==
, yang memiliki padding di kedua ujungnya. Menghapus tiga karakter pertamaWFh
(yang menyandikanXX
awalan) dan tiga karakter terakhirQ==
(yang menyandikan padding bit nol di akhir), kita tinggal dengan stringRdWFuemhvdWNvb3dhe
. Dengan demikian, kita mendapatkan tiga string yang disandikan base64 berikut: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
F1YW56
danaG91Y29vd2F5
.) Jadi, untuk mencocokkan string ini dengan regexps secara andal, Anda akan membutuhkan sesuatu seperti berikut (menggunakan sintaks PCRE):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
quanzhoucooway
adalahcXVhbnpob3Vjb293YXk=
sedangkanQUANZHOUCOOWAY
adalahUVVBTlpIT1VDT09XQVk=
, sehingga aturan: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.
sumber