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?
Odpowiedzi:
Nie rób tego z Postfixem,
body_check
ale zamiast tego napisz dla niego regułę Spamassassin . Spamassain dekoduje treść wiadomości przed zastosowaniem jej reguł. Coś jak:Reguły te należą do
/etc/mail/spamassassin/local.cf
(lub~/.spamassassin/user_prefs
).źródło
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
Quanzhoucooway
do kodera base64 , otrzymasz wynikUXVhbnpob3Vjb293YXk=
. 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 base64k
(ponieważ koduje również niektóre bity dopełniania), otrzymamy ciągUXVhbnpob3Vjb293YX
który gwarantuje pojawiają się w danych base64 gdy zakodowany bajt trypletyQua
,nzh
,ouc
,oow
a częściowo trypletay
w wejściu pojawią się w tej kolejności.Ale oczywiście ciąg
Quanzhoucooway
może nie zaczynać się dokładnie na granicy trojaczki. Na przykład, jeśliXQuanzhoucooway
zamiast tego zakodujemy ciąg , otrzymamy wynikWFF1YW56aG91Y29vd2F5
, 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ącegoX
bajtu, pozostawiając namF1YW56aG91Y29vd2F5
.Na koniec kodowanie base64
XXQuanzhoucooway
daje wynikWFhRdWFuemhvdWNvb3dheQ==
, który ma wypełnienie na obu końcach. Usuwając pierwsze trzy znakiWFh
(które kodująXX
prefiks) i ostatnie trzy znakiQ==
(które kodują zerowanie bitów na końcu), pozostaje nam ciąg znakówRdWFuemhvdWNvb3dhe
. W ten sposób otrzymujemy następujące trzy ciągi zakodowane w base64: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
F1YW56
iaG91Y29vd2F5
.) Zatem, aby niezawodnie dopasować te ciągi z wyrażeniami regularnymi, potrzebujesz czegoś takiego (przy użyciu składni PCRE):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
quanzhoucooway
jest,cXVhbnpob3Vjb293YXk=
podczas gdyQUANZHOUCOOWAY
jestUVVBTlpIT1VDT09XQVk=
, więc reguła: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ś.
źródło