Jak mogę odrzucić spam spamowy zakodowany w standardzie base64?

11

Właśnie otrzymałem kilka maili o podobnej treści, które zostały zakodowane przy pomocy base64. Teraz chcę odrzucić lub odrzucić tego rodzaju wiadomości e-mail za pomocą kontroli treści.

Zanim miałem w body_checks coś takiego:

/Quanzhoucooway/ DISCARD

Ale ponieważ wiadomość jest zakodowana, to słowo kluczowe nie zostanie wykryte.

Oto wiadomość zakodowana w standardzie base64:

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

Więc jaka jest najlepsza praktyka blokowania tego rodzaju e-maili?

użytkownik134969
źródło
3
Czy prawidłowe filtrowanie spamu działa na rzeczywistą zdekodowaną treść wiadomości?
ceejayoz
Czy mógłbyś być bardziej szczegółowy, jakiego rodzaju mechanizmu należy użyć? Już używam spamassassin i robi świetną robotę, jeśli chodzi o walkę ze spamem.
user134969,
Odrzuciłbym je MTA z komunikatem o błędzie „Nie koduj treści wiadomości base64”.
joshudson

Odpowiedzi:

19

Nie rób tego z Postfixem, body_checkale zamiast tego napisz dla niego regułę Spamassassin . Spamassain dekoduje treść wiadomości przed zastosowaniem jej reguł. Coś jak:

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

Reguły te należą do /etc/mail/spamassassin/local.cf(lub ~/.spamassassin/user_prefs).

Esa Jokinen
źródło
1
Czy to zadziała, nawet jeśli to słowo kluczowe jest zakodowane w base64, podobnie jak tamta treść?
user134969,
2
Tak. Ktoś już zredagował moją odpowiedź, aby to wyjaśnić. Dzięki tej anonimowej osobie! :)
Esa Jokinen
9

Technicznie, mógł bezpośrednio filtrować base64 zakodowane dane dotyczące słów kluczowych. Nie twierdzę, że jest to praktyczna lub rozsądna rzecz, biorąc pod uwagę istnienie lepszych i prostszych alternatyw (jak opisano np. W odpowiedzi Esy powyżej), ale jest to możliwe.

Sztuką jest uświadomienie sobie, że kodowanie base64 jest deterministycznym odwzorowaniem 3-bajtowych bloków surowych niekodowanych danych na 4-znakowe bloki znaków base64. Zatem za każdym razem, gdy w niezakodowanych danych pojawi się pewna sekwencja 3-bajtowych bloków, ta sama sekwencja 4-znakowych bloków pojawi się w wersji zakodowanej.

Na przykład, jeśli wpiszesz ciąg znaków Quanzhoucoowaydo kodera base64 , otrzymasz wynik UXVhbnpob3Vjb293YXk=. Ponieważ długość danych wejściowych nie jest wielokrotnością 3 bajtów, dane wyjściowe zawierają dopełnienie na końcu, ale jeśli upuszczymy końcowe =znaki i ostatni rzeczywisty znak base64 k(ponieważ koduje również niektóre bity dopełniania), otrzymamy ciąg UXVhbnpob3Vjb293YXktóry gwarantuje pojawiają się w danych base64 gdy zakodowany bajt tryplety Qua, nzh, ouc, oowa częściowo tryplet ayw wejściu pojawią się w tej kolejności.

Ale oczywiście ciąg Quanzhoucoowaymoże nie zaczynać się dokładnie na granicy trojaczki. Na przykład, jeśli XQuanzhoucoowayzamiast tego zakodujemy ciąg , otrzymamy wynik WFF1YW56aG91Y29vd2F5, który wygląda zupełnie inaczej. Tym razem długość wejściowa jest podzielna przez trzy, więc nie ma na końcu żadnych znaków dopełniających, ale musimy odrzucić pierwsze dwa znaki ( WF), z których każdy koduje niektóre bity z poprzedzającego Xbajtu, pozostawiając nam F1YW56aG91Y29vd2F5.

Na koniec kodowanie base64 XXQuanzhoucoowaydaje wynik WFhRdWFuemhvdWNvb3dheQ==, który ma wypełnienie na obu końcach. Usuwając pierwsze trzy znaki WFh(które kodują XXprefiks) i ostatnie trzy znaki Q==(które kodują zerowanie bitów na końcu), pozostaje nam ciąg znaków RdWFuemhvdWNvb3dhe. W ten sposób otrzymujemy następujące trzy ciągi zakodowane w base64:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

z których (przynajmniej) jeden musi pojawić się w postaci zakodowanej w standardzie base64 dowolnego ciągu wejściowego zawierającego słowo Quanzhoucooway.

Oczywiście, jeśli masz pecha, koder base64 może wstawić podział linii między nimi, między dowolnymi dwoma zakodowanymi trojaczkami. (Twój przykładowy komunikat, na przykład, ma jeden pomiędzy F1YW56i aG91Y29vd2F5.) Zatem, aby niezawodnie dopasować te ciągi z wyrażeniami regularnymi, potrzebujesz czegoś takiego (przy użyciu składni 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

Ręczne generowanie tych wzorców jest dość żmudne, ale napisanie prostego skryptu w ulubionym języku programowania nie byłoby trudne, przynajmniej tak długo, jak długo zapewnia koder base64.

Jeśli naprawdę tego chciałeś, możesz nawet zaimplementować dopasowanie bez rozróżniania wielkości liter przez kodowanie base64 zarówno małej, jak i wielkiej litery słowa kluczowego i łącząc je w wyrażenie regularne pasujące do dowolnej ich kombinacji. Na przykład kodowanie base64 quanzhoucoowayjest, cXVhbnpob3Vjb293YXk=podczas gdy QUANZHOUCOOWAYjest UVVBTlpIT1VDT09XQVk=, więc reguła:

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

w każdym przypadku będzie pasować do słowa „Quanzhoucooway” zakodowanego w standardzie base64, pod warunkiem, że zaczyna się na granicy trojaczki. Generowanie pozostałych dwóch odpowiednich wyrażeń regularnych dla wersji przesuniętych pozostawia się jako ćwiczenie. ;)

Niestety, robienie czegokolwiek bardziej skomplikowanego niż proste dopasowywanie podciągów, takie jak to, szybko staje się niepraktyczne. Ale przynajmniej jest to fajna sztuczka. Zasadniczo może być nawet przydatne, jeśli z jakiegoś powodu nie można użyć SpamAssassin lub innego filtru, który może dekodować kodowanie base64 przed filtrowaniem. Ale jeśli możesz to zrobić, zamiast używać takich hacków, na pewno powinieneś.

Ilmari Karonen
źródło
1
Tak, jest to możliwe ; nie tak praktyczne i nie jest to coś, co chciałbyś zrobić ponownie dla każdego słowa. +1 za wyjaśnienie: chociaż może to nie być bardzo przydatne, z pewnością jest pouczające!
Esa Jokinen