Я только что получил пару писем с похожим содержанием, которые были закодированы с base64. Теперь я хочу отклонить или отклонить такого рода электронные письма, используя проверку тела.
Прежде чем я имел в моих body_checks что-то вроде этого:
/Quanzhoucooway/ DISCARD
Но так как сообщение закодировано, это ключевое слово не будет обнаружено.
Вот сообщение в кодировке base64:
DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==
Так, какова лучшая практика, чтобы заблокировать такие электронные письма?
Ответы:
Не делайте этого с Postfix ,
body_check
но написать правило SpamAssassin для него, вместо этого. Spamassain декодирует тело сообщения перед применением его правил. Что-то вроде:Эти правила принадлежат
/etc/mail/spamassassin/local.cf
(или~/.spamassassin/user_prefs
).источник
Технически, вы можете напрямую фильтровать закодированные в base64 данные по ключевым словам. Я не говорю , что это непрактично или разумное , что нужно сделать, учитывая наличие более совершенных и простых альтернатив (как описано , например , в ответ ЕКА выше), но это возможно.
Хитрость заключается в том, чтобы понять, что кодирование base64 является детерминированным отображением 3-байтовых блоков необработанных некодированных данных в 4-символьные блоки из base64 символов. Таким образом, всякий раз, когда определенная последовательность 3-байтовых блоков появляется в некодированных данных, такая же последовательность 4-символьных блоков будет появляться в кодированной версии.
Например, если вы введете строку
Quanzhoucooway
в кодировщик base64 , вы получите выводUXVhbnpob3Vjb293YXk=
. Поскольку длина входных данных не кратна 3 байтам, выходные данные содержат некоторый отступ в конце, но если мы отбрасываем последние=
знаки и последний фактический символ base64k
(так как он также кодирует некоторые биты заполнения), мы получаем строкуUXVhbnpob3Vjb293YX
который гарантированно появляются в данных в кодировке base64 всякий раз , когда байт триплетыQua
,nzh
,ouc
,oow
и парциальное триплетay
появляются на входе в указанном порядке.Но, конечно, строка
Quanzhoucooway
может не начинаться точно на границе триплета. Например, если мыXQuanzhoucooway
вместо этого закодируем строку , мы получим выводWFF1YW56aG91Y29vd2F5
, который выглядит совершенно иначе. На этот раз входная длина делится на три, поэтому в конце нет символов заполнения, которые нужно отбрасывать, но нам нужно отбросить первые два символа (WF
), каждый из которых кодирует некоторые биты из предварительно добавленногоX
байта, оставляя намF1YW56aG91Y29vd2F5
,Наконец, кодировка base64
XXQuanzhoucooway
дает выводWFhRdWFuemhvdWNvb3dheQ==
, который имеет заполнение на обоих концах. Удаляя первые три символаWFh
(которые кодируютXX
префикс) и последние три символаQ==
(которые кодируют нулевой битовый отступ в конце), мы остаемся со строкойRdWFuemhvdWNvb3dhe
. Таким образом, мы получаем следующие три строки в кодировке base64:из которых (по крайней мере) каждый должен появляться в закодированной форме base64 любой входной строки, содержащей слово
Quanzhoucooway
.Конечно, если вам не повезло, кодировщик base64 может вставить разрыв строки в середине между любыми двумя закодированными триплетами. (Например, в вашем примере сообщения есть одно между
F1YW56
иaG91Y29vd2F5
.) Таким образом, чтобы надежно сопоставить эти строки с регулярными выражениями, вам потребуется что-то вроде следующего (с использованием синтаксиса PCRE):Генерация этих шаблонов вручную довольно утомительна, но не составит труда написать простой скрипт, который будет делать это на вашем любимом языке программирования, по крайней мере, пока он обеспечивает кодировщик base64.
Если вы действительно хотите, вы можете даже реализовать сопоставление без учета регистра, кодируя base64 как строчную, так и прописную версию ключевого слова и объединяя их в регулярное выражение, которое соответствует любой их комбинации. Например, кодировка base64
quanzhoucooway
- этоcXVhbnpob3Vjb293YXk=
время, а кодировкаQUANZHOUCOOWAY
-UVVBTlpIT1VDT09XQVk=
, поэтому правило:в любом случае будет соответствовать закодированному в base64 слову «Quanzhoucooway», при условии, что оно начинается на границе триплета. Создание двух других соответствующих регулярных выражений для сдвинутых версий оставлено в качестве упражнения. ;)
Увы, делать что-то более сложное, чем простое сопоставление подстрок, как это, быстро становится непрактичным. Но, по крайней мере, это хитрый трюк. В принципе, это может быть даже полезно, если вы по какой-то причине не можете использовать SpamAssassin или любой другой фильтр, который может декодировать кодировку base64 перед фильтрацией. Но если вы можете сделать это, вместо того, чтобы использовать такие хаки, вы, безусловно, должны.
источник