Base64でエンコードされた同様の内容のメールをいくつか受信しました。ボディチェックを使用して、この種のメールを拒否または破棄したいと思います。
Body_checksに次のようなものを含める前に:
/Quanzhoucooway/ DISCARD
ただし、メッセージはエンコードされているため、そのキーワードは検出されません。
以下は、base64でエンコードされたメッセージです。
DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==
では、この種のメールをブロックするためのベストプラクティスは何でしょうか?
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
)に属しています。
技術的には、couldはキーワードのbase64エンコードされたデータを直接フィルタリングします。 (たとえば、上記のEsaの回答で説明されているように)より適切で簡単な代替手段が存在することを考えると、それが実用的または合理的なことだとは言っていませんが、is可能です。
トリックは、 base64エンコーディング が、エンコードされていない生データの3バイトブロックから、base64文字の4文字ブロックへの確定的なマッピングであることを認識することです。したがって、3バイトのブロックの特定のシーケンスがエンコードされていないデータに現れるときはいつでも、4文字のブロックの同じシーケンスがエンコードされたバージョンに現れます。
たとえば、文字列Quanzhoucooway
を base64エンコーダー に入力すると、出力UXVhbnpob3Vjb293YXk=
が得られます。入力の長さは3バイトの倍数ではないため、出力には最後にいくつかの padding が含まれますが、最後の=
記号と最後の実際のbase64文字k
をドロップすると(エンコードされているため)一部のパディングビット)、バイトのトリプレットQua
、nzh
、ouc
、oow
、および部分的なトリプレットay
がこの順序で入力に出現するたびに、base64エンコードデータに表示されることが保証される文字列UXVhbnpob3Vjb293YX
を取得します。
ただし、もちろん、文字列Quanzhoucooway
は、トリプレットの境界で正確に始まるとは限りません。たとえば、代わりに文字列XQuanzhoucooway
をエンコードすると、完全に異なる出力WFF1YW56aG91Y29vd2F5
が得られます。今回は、入力の長さが3で割り切れるので、最後に破棄するパディング文字はありませんが、先頭のWF
バイトからいくつかのビットをそれぞれエンコードする最初の2文字(X
)を破棄する必要があります。 F1YW56aG91Y29vd2F5
を使用してください。
最後に、base64エンコーディングXXQuanzhoucooway
は、両端にパディングがあるWFhRdWFuemhvdWNvb3dheQ==
を出力します。最初の3文字WFh
(XX
プレフィックスをエンコード)と最後の3文字Q==
(末尾のゼロビットパディングをエンコード)を削除すると、文字列RdWFuemhvdWNvb3dhe
が残ります。したがって、次の3つのbase64エンコードされた文字列を取得します。
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
(少なくとも)1つは、WordのQuanzhoucooway
を含む入力文字列のbase64エンコード形式で出現する必要があります。
もちろん、運が悪い場合、base64エンコーダーは、エンコードされた2つのトリプレットの間に、途中で改行を挿入することがあります。 (たとえば、メッセージの例では、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
のbase64エンコーディングは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」に一致します。シフトされたバージョンの他の2つの対応する正規表現の生成は、演習として残します。 ;)
悲しいかな、このような単純な部分文字列マッチングよりも複雑なことを行うと、すぐに実用的でなくなります。しかし、少なくともそれはきちんとしたトリックです。原則として、何らかの理由でSpamAssassinや、フィルタリングの前にbase64エンコードをデコードできるその他のフィルターを使用できなかった場合にも、これは有用です。しかし、それができるなら、このようなハックを使う代わりに、確かにそうすべきです。