Як я можу відхилити електронну пошту, кодовану спамом base64?


11

Я щойно отримав пару листів з подібним вмістом, які були закодовані в базі64. Тепер я хочу відхилити або відхилити подібні електронні листи за допомогою перевірки.

Перш ніж у мене в body_checks було щось подібне:

/Quanzhoucooway/ DISCARD

Але оскільки повідомлення закодовано, ключове слово не буде виявлено.

Ось базове повідомлення 64, закодоване:

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

То яка найкраща практика блокувати такі електронні листи?


3
Правильна фільтрація спаму, яка діє на фактично декодований вміст повідомлення?
ceejayoz

Чи можете ви бути більш конкретними, який механізм слід використовувати? Я вже використовую spamassassin, і він робить велику роботу, коли справа стосується боротьби зі спамом.
user134969

Я б відхилив MTA з повідомленням про помилку "Не base64 кодувати тела повідомлень".
joshudson

Відповіді:


19

Не робіть цього з Postfix, body_checkале замість цього напишіть правило Spamassassin . Спамассейн розшифровує тіло повідомлення перед тим, як застосувати його правила. Щось на зразок:

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
Так. Хтось уже відредагував мою відповідь, щоб уточнити це. Завдяки цій анонімній особі! :)
Esa Jokinen

9

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

Трюк полягає в усвідомленні того, що кодування base64 - це детерміноване відображення 3-байтових блоків необроблених некодованих даних у 4-символьні блоки базових64 символів. Таким чином, щоразу, коли певна послідовність 3-байтових блоків з’являється у незашифрованих даних, однакова послідовність 4-символьних блоків з’явиться у кодованій версії.

Наприклад, якщо ви введете рядок Quanzhoucoowayу базовий кодер64 , ви отримаєте вихід UXVhbnpob3Vjb293YXk=. Оскільки довжина вводу не кратна 3-х байтам, то висновок містить деяку підкладку в кінці, але якщо ми відкинемо остаточні =знаки та останній фактичний символ6464 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 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 для пояснення: хоча це може бути не дуже корисним, це, безумовно, є освітою!
Еса Йокінен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.