Как я могу отклонить спам в электронной почте в кодировке base64?

11

Я только что получил пару писем с похожим содержанием, которые были закодированы с base64. Теперь я хочу отклонить или отклонить такого рода электронные письма, используя проверку тела.

Прежде чем я имел в моих body_checks что-то вроде этого:

/Quanzhoucooway/ DISCARD

Но так как сообщение закодировано, это ключевое слово не будет обнаружено.

Вот сообщение в кодировке base64:

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

Так, какова лучшая практика, чтобы заблокировать такие электронные письма?

user134969
источник
3
Надлежащая фильтрация спама, которая воздействует на фактическое декодированное содержание сообщения?
ceejayoz
Не могли бы вы конкретизировать, какой механизм использовать? Я уже использую spamassassin, и он отлично справляется с борьбой со спамом.
user134969
Я бы отклонил их MTA с сообщением об ошибке «Не кодируйте тела сообщения base64».
Джошудсон

Ответы:

19

Не делайте этого с Postfix , body_checkно написать правило SpamAssassin для него, вместо этого. Spamassain декодирует тело сообщения перед применением его правил. Что-то вроде:

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

Эти правила принадлежат /etc/mail/spamassassin/local.cf(или ~/.spamassassin/user_prefs).

Эса Йокинен
источник
1
Будет ли это работать, даже если это ключевое слово закодировано с base64, как этот контент там?
user134969
2
Да. Кто-то уже отредактировал мой ответ, чтобы уточнить это. Спасибо этому анониму! :)
Эса Йокинен
9

Технически, вы можете напрямую фильтровать закодированные в base64 данные по ключевым словам. Я не говорю , что это непрактично или разумное , что нужно сделать, учитывая наличие более совершенных и простых альтернатив (как описано , например , в ответ ЕКА выше), но это возможно.

Хитрость заключается в том, чтобы понять, что кодирование base64 является детерминированным отображением 3-байтовых блоков необработанных некодированных данных в 4-символьные блоки из base64 символов. Таким образом, всякий раз, когда определенная последовательность 3-байтовых блоков появляется в некодированных данных, такая же последовательность 4-символьных блоков будет появляться в кодированной версии.

Например, если вы введете строку Quanzhoucoowayв кодировщик base64 , вы получите вывод UXVhbnpob3Vjb293YXk=. Поскольку длина входных данных не кратна 3 байтам, выходные данные содержат некоторый отступ в конце, но если мы отбрасываем последние =знаки и последний фактический символ base64 k(так как он также кодирует некоторые биты заполнения), мы получаем строку UXVhbnpob3Vjb293YXкоторый гарантированно появляются в данных в кодировке base64 всякий раз , когда байт триплеты Qua, nzh, ouc, oowи парциальное триплет ayпоявляются на входе в указанном порядке.

Но, конечно, строка Quanzhoucoowayможет не начинаться точно на границе триплета. Например, если мы XQuanzhoucoowayвместо этого закодируем строку , мы получим вывод WFF1YW56aG91Y29vd2F5, который выглядит совершенно иначе. На этот раз входная длина делится на три, поэтому в конце нет символов заполнения, которые нужно отбрасывать, но нам нужно отбросить первые два символа ( WF), каждый из которых кодирует некоторые биты из предварительно добавленного Xбайта, оставляя нам F1YW56aG91Y29vd2F5,

Наконец, кодировка base64 XXQuanzhoucoowayдает вывод WFhRdWFuemhvdWNvb3dheQ==, который имеет заполнение на обоих концах. Удаляя первые три символа WFh(которые кодируют XXпрефикс) и последние три символа Q==(которые кодируют нулевой битовый отступ в конце), мы остаемся со строкой RdWFuemhvdWNvb3dhe. Таким образом, мы получаем следующие три строки в кодировке base64:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

из которых (по крайней мере) каждый должен появляться в закодированной форме base64 любой входной строки, содержащей слово Quanzhoucooway.

Конечно, если вам не повезло, кодировщик base64 может вставить разрыв строки в середине между любыми двумя закодированными триплетами. (Например, в вашем примере сообщения есть одно между F1YW56и aG91Y29vd2F5.) Таким образом, чтобы надежно сопоставить эти строки с регулярными выражениями, вам потребуется что-то вроде следующего (с использованием синтаксиса 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

Генерация этих шаблонов вручную довольно утомительна, но не составит труда написать простой скрипт, который будет делать это на вашем любимом языке программирования, по крайней мере, пока он обеспечивает кодировщик base64.

Если вы действительно хотите, вы можете даже реализовать сопоставление без учета регистра, кодируя base64 как строчную, так и прописную версию ключевого слова и объединяя их в регулярное выражение, которое соответствует любой их комбинации. Например, кодировка base64 quanzhoucooway- это cXVhbnpob3Vjb293YXk=время, а кодировка QUANZHOUCOOWAY- UVVBTlpIT1VDT09XQVk=, поэтому правило:

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

в любом случае будет соответствовать закодированному в base64 слову «Quanzhoucooway», при условии, что оно начинается на границе триплета. Создание двух других соответствующих регулярных выражений для сдвинутых версий оставлено в качестве упражнения. ;)

Увы, делать что-то более сложное, чем простое сопоставление подстрок, как это, быстро становится непрактичным. Но, по крайней мере, это хитрый трюк. В принципе, это может быть даже полезно, если вы по какой-то причине не можете использовать SpamAssassin или любой другой фильтр, который может декодировать кодировку base64 перед фильтрацией. Но если вы можете сделать это, вместо того, чтобы использовать такие хаки, вы, безусловно, должны.

Илмари Каронен
источник
1
Да, это возможно ; не очень практично, и не то, что вы хотели бы сделать снова для каждого слова. +1 за объяснение: хотя это может быть не очень полезно, это, безусловно, полезно!
Эса Йокинен